From 9dd99e205a46686509713cd1e673986acf141cce Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sun, 14 Aug 2022 11:14:31 +1000 Subject: [PATCH 001/110] changed sorting to respect numeric values --- src/lib/common/apiFunctions.svelte | 60 +++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/src/lib/common/apiFunctions.svelte b/src/lib/common/apiFunctions.svelte index 0a82545..371544c 100644 --- a/src/lib/common/apiFunctions.svelte +++ b/src/lib/common/apiFunctions.svelte @@ -41,10 +41,32 @@ }); await headscaleUsersResponse.json().then((data) => { + let collator = new Intl.Collator([], { numeric: true }); if (sortDirection == 'ascending') { - headscaleUsers = data.namespaces.sort((a: User, b: User) => (a[sortKey as keyof User] < b[sortKey as keyof User] ? -1 : 1)); - } else { - headscaleUsers = data.namespaces.sort((a: User, b: User) => (a[sortKey as keyof User] > b[sortKey as keyof User] ? -1 : 1)); + switch (sortKey) { + case 'id': + headscaleUsers = data.namespaces.sort((a: User, b: User) => collator.compare(a.id, b.id)); + break; + case 'createdAt': + headscaleUsers = data.namespaces.sort((a: User, b: User) => -collator.compare(a.createdAt, b.createdAt)); + break; + case 'name': + headscaleUsers = data.namespaces.sort((a: User, b: User) => collator.compare(a.name, b.name)); + break; + } + } + if (sortDirection == 'descending') { + switch (sortKey) { + case 'id': + headscaleUsers = data.namespaces.sort((a: User, b: User) => -collator.compare(a.id, b.id)); + break; + case 'createdAt': + headscaleUsers = data.namespaces.sort((a: User, b: User) => collator.compare(a.createdAt, b.createdAt)); + break; + case 'name': + headscaleUsers = data.namespaces.sort((a: User, b: User) => -collator.compare(a.name, b.name)); + break; + } } }); // Set the store @@ -286,14 +308,32 @@ }); await headscaleDeviceResponse.json().then((data) => { - // flip the sort direction if based on lastSeen - if(sortKey == "lastSeen") { - sortDirection == 'ascending' ? sortDirection = 'descending' : sortDirection = 'ascending'; - } + let collator = new Intl.Collator([], { numeric: true }); if (sortDirection == 'ascending') { - headscaleDevices = data.machines.sort((a: Device, b: Device) => (a[sortKey as keyof Device] < b[sortKey as keyof Device] ? -1 : 1)); - } else { - headscaleDevices = data.machines.sort((a: Device, b: Device) => (a[sortKey as keyof Device] > b[sortKey as keyof Device] ? -1 : 1)); + switch (sortKey) { + case 'id': + headscaleDevices = data.machines.sort((a: Device, b: Device) => collator.compare(a.id, b.id)); + break; + case 'lastSeen': + headscaleDevices = data.machines.sort((a: Device, b: Device) => -collator.compare(a.lastSeen, b.lastSeen)); + break; + case 'givenName': + headscaleDevices = data.machines.sort((a: Device, b: Device) => collator.compare(a.givenName, b.givenName)); + break; + } + } + if (sortDirection == 'descending') { + switch (sortKey) { + case 'id': + headscaleDevices = data.machines.sort((a: Device, b: Device) => -collator.compare(a.id, b.id)); + break; + case 'lastSeen': + headscaleDevices = data.machines.sort((a: Device, b: Device) => collator.compare(a.lastSeen, b.lastSeen)); + break; + case 'givenName': + headscaleDevices = data.machines.sort((a: Device, b: Device) => -collator.compare(a.givenName, b.givenName)); + break; + } } }); // set the stores From f03d3a07cef07e8967701e650cd0e2a9afdb1b23 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Wed, 17 Aug 2022 09:41:33 +1000 Subject: [PATCH 002/110] trim trailing / when saving url --- src/lib/common/Stores.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/common/Stores.svelte b/src/lib/common/Stores.svelte index 95d08ec..628e89c 100644 --- a/src/lib/common/Stores.svelte +++ b/src/lib/common/Stores.svelte @@ -24,7 +24,7 @@ // stores URL and API key URLStore.set(localStorage.getItem('headscaleURL') || ''); - URLStore.subscribe((val) => localStorage.setItem('headscaleURL', val)); + URLStore.subscribe((val) => localStorage.setItem('headscaleURL', val.replace(/\/+$/, ''))); APIKeyStore.set(localStorage.getItem('headscaleAPIKey') || ''); APIKeyStore.subscribe((val) => localStorage.setItem('headscaleAPIKey', val)); From 97237606f5b62e9bcd33b6d9ef6356edd51c6189 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Thu, 18 Aug 2022 09:45:18 +1000 Subject: [PATCH 003/110] added notes about troubleshooting --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 53e7c80..20ec805 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,15 @@ https://hs.yourdomain.com.au { ### Other Configurations See [Other Configurations](/documentation/configuration.md) for further proxy examples, such as Traefik +## Troubleshooting +Make sure you are using the latest version of headscale. Headscale-UI is only tested against: + +* the current stable version of headscale +* Chrome/Chrome Mobile +* Firefox + +Sorry mac fans, safari will only happen if someone wants to spring for an iphone/macbook for myself. Note that while mobile is checked for functionality, the web experience is not mobile optimised. + ## Development see [development](/documentation/development.md) for details From 2ccc4a4fa69a63fb803824633e8ef59847880ba0 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Thu, 18 Aug 2022 09:47:12 +1000 Subject: [PATCH 004/110] more troubleshooting tips --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 20ec805..b65c998 100644 --- a/README.md +++ b/README.md @@ -91,11 +91,13 @@ See [Other Configurations](/documentation/configuration.md) for further proxy ex ## Troubleshooting Make sure you are using the latest version of headscale. Headscale-UI is only tested against: -* the current stable version of headscale +* The current stable version of headscale * Chrome/Chrome Mobile -* Firefox +* Firefox/Firefox Mobile -Sorry mac fans, safari will only happen if someone wants to spring for an iphone/macbook for myself. Note that while mobile is checked for functionality, the web experience is not mobile optimised. +Note that while mobile is checked for functionality, the web experience is not mobile optimised. + +If you are getting errors about preflight checks, it's probably CORS related. Make sure your UI sits on the same subdomain as headscale or inject CORS headers. ## Development see [development](/documentation/development.md) for details From 02036237026db5010409c99d03375ed1c2e6e5af Mon Sep 17 00:00:00 2001 From: routerino <45954722+routerino@users.noreply.github.com> Date: Thu, 18 Aug 2022 09:48:07 +1000 Subject: [PATCH 005/110] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..d830614 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,17 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +** Supporting Details ** +Provide the following: +* Browser Version: +* Headscale Version: +* Any Browser Errors (`control+shift+i` in chrome to see) + +**Describe the bug** +A clear and concise description of what the bug is. Screenshots if applicable From 42e117deb1a3f9b61cb09ee9435599020703ba2f Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Thu, 18 Aug 2022 13:02:05 +1000 Subject: [PATCH 006/110] added skeleton ACL class --- src/lib/common/classes.ts | 8 ++++++++ src/lib/common/stores.js | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/lib/common/classes.ts b/src/lib/common/classes.ts index 22a7f00..5384a6e 100644 --- a/src/lib/common/classes.ts +++ b/src/lib/common/classes.ts @@ -14,6 +14,14 @@ export class Device { } } +export class ACL { + public groups: {[key: string]: string} = {} + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + export class Route { advertisedRoutes: string[] = []; enabledRoutes: string[] = []; diff --git a/src/lib/common/stores.js b/src/lib/common/stores.js index 0873d52..b3502a1 100644 --- a/src/lib/common/stores.js +++ b/src/lib/common/stores.js @@ -1,5 +1,5 @@ import { writable } from 'svelte/store'; -import { Device, User } from '$lib/common/classes'; +import { Device, User, ACL } from '$lib/common/classes'; // used to store the value of an alert across all components export const alertStore = writable(''); @@ -24,4 +24,6 @@ export const deviceSearchStore = writable(''); export const deviceSortStore = writable('id'); export const deviceSortDirectionStore = writable('ascending'); export const userSortStore = writable('id'); -export const sortDirectionStore = writable('ascending'); \ No newline at end of file +export const sortDirectionStore = writable('ascending'); +// stores ACL object +export const aclStore = writable(new ACL()); \ No newline at end of file From 60697dcc6a2dbccfbc26ffd4ebb83ed15ee5402d Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Thu, 18 Aug 2022 13:26:15 +1000 Subject: [PATCH 007/110] changed group keys to have string arrays --- src/lib/common/classes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/common/classes.ts b/src/lib/common/classes.ts index 5384a6e..baf7684 100644 --- a/src/lib/common/classes.ts +++ b/src/lib/common/classes.ts @@ -15,7 +15,7 @@ export class Device { } export class ACL { - public groups: {[key: string]: string} = {} + public groups: {[key: string]: [string]} = {} public constructor(init?: Partial) { Object.assign(this, init); From 65e762b4985f40fa771a003c0c584a22e7f5bdc2 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sat, 20 Aug 2022 09:31:37 +1000 Subject: [PATCH 008/110] svelte-migrate: renamed files --- src/routes/{__layout.svelte => +layout.svelte} | 0 src/routes/{index.svelte => +page.svelte} | 0 src/routes/{devices.html.svelte => devices.html/+page.svelte} | 0 src/routes/{settings.html.svelte => settings.html/+page.svelte} | 0 src/routes/{users.html.svelte => users.html/+page.svelte} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename src/routes/{__layout.svelte => +layout.svelte} (100%) rename src/routes/{index.svelte => +page.svelte} (100%) rename src/routes/{devices.html.svelte => devices.html/+page.svelte} (100%) rename src/routes/{settings.html.svelte => settings.html/+page.svelte} (100%) rename src/routes/{users.html.svelte => users.html/+page.svelte} (100%) diff --git a/src/routes/__layout.svelte b/src/routes/+layout.svelte similarity index 100% rename from src/routes/__layout.svelte rename to src/routes/+layout.svelte diff --git a/src/routes/index.svelte b/src/routes/+page.svelte similarity index 100% rename from src/routes/index.svelte rename to src/routes/+page.svelte diff --git a/src/routes/devices.html.svelte b/src/routes/devices.html/+page.svelte similarity index 100% rename from src/routes/devices.html.svelte rename to src/routes/devices.html/+page.svelte diff --git a/src/routes/settings.html.svelte b/src/routes/settings.html/+page.svelte similarity index 100% rename from src/routes/settings.html.svelte rename to src/routes/settings.html/+page.svelte diff --git a/src/routes/users.html.svelte b/src/routes/users.html/+page.svelte similarity index 100% rename from src/routes/users.html.svelte rename to src/routes/users.html/+page.svelte From 649b34aeec0c85335264ad52d9b6e43cbf5117ec Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sat, 20 Aug 2022 09:35:29 +1000 Subject: [PATCH 009/110] update node packages, update version --- package-lock.json | 406 ++++++++++++++++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 339 insertions(+), 69 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6744ca..8435dbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "headscale-ui", - "version": "2022.08.08-beta", + "version": "2022.08.13-beta", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "headscale-ui", - "version": "2022.08.08-beta", + "version": "2022.08.13-beta", "devDependencies": { "@sveltejs/adapter-auto": "next", "@sveltejs/adapter-static": "^1.0.0-next.34", @@ -100,6 +100,26 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -135,6 +155,12 @@ "node": ">= 8" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, "node_modules/@rollup/pluginutils": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", @@ -199,16 +225,24 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.405", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.405.tgz", - "integrity": "sha512-jHSa74F7k+hC+0fof75g/xm/+1M5sM66Qt6v8eLLMSgjkp36Lb5xOioBhbl6w0NYoE5xysLsBWuu+yHytfvCBA==", + "version": "1.0.0-next.427", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.427.tgz", + "integrity": "sha512-HUt1knOXaEM18y7E3k0CvhTxmoNhp0KbgfbLPmuRvSrQxRMsTnTpupZwW5mmU0VZkm4HHsf8mwftGy4WR8qf1Q==", "dev": true, "hasInstallScript": true, "dependencies": { "@sveltejs/vite-plugin-svelte": "^1.0.1", - "chokidar": "^3.5.3", + "cookie": "^0.5.0", + "devalue": "^2.0.1", + "kleur": "^4.1.4", + "magic-string": "^0.26.2", + "mime": "^3.0.0", + "node-fetch": "^3.2.4", "sade": "^1.8.1", - "tiny-glob": "^0.2.9" + "set-cookie-parser": "^2.4.8", + "sirv": "^2.0.2", + "tiny-glob": "^0.2.9", + "undici": "^5.8.1" }, "bin": { "svelte-kit": "svelte-kit.js" @@ -250,22 +284,23 @@ }, "node_modules/@tailwindcss/typography": { "version": "0.5.4", - "resolved": "git+ssh://git@github.com/tailwindcss/typography.git#23e04c6bc4330a6b493fe3698be11ff287f4d7bc", + "resolved": "git+ssh://git@github.com/tailwindcss/typography.git#c1f01be2e6c7b13d03bee7789ec0378ba1dfca63", "dev": true, "license": "MIT", "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2" + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "node_modules/@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", + "version": "18.7.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.8.tgz", + "integrity": "sha512-/YP55EMK2341JkODUb8DM9O0x1SIz2aBvyF33Uf1c76St3VpsMXEIW0nxuKkq/5cxnbz0RD9cfwNZHEAZQD3ag==", "dev": true }, "node_modules/@types/pug": { @@ -306,9 +341,9 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-0.1.1.tgz", - "integrity": "sha512-UhfGAZ8HgIMEPktKF8k58Y1LSwuYs1i1O4HY8E+yiOoYM+rkaPFBZo1SOkRsZN8DZTw90Q+ZznPej1o/mtTisg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-0.1.2.tgz", + "integrity": "sha512-EdwCHnbkakR6YPupySZm1WoCDRPaw9c5jObAo2pCRv8Ja2TESFC6Sc8RUOcKuihfjARDfszbBf+YEQwHY9s9wg==", "dev": true, "engines": { "node": ">=14.6.0" @@ -567,9 +602,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", + "version": "1.0.30001378", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", + "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", "dev": true, "funding": [ { @@ -680,6 +715,15 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/css-selector-tokenizer": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", @@ -718,6 +762,15 @@ "postcss": "^8.1.6" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -791,6 +844,12 @@ "node": ">=0.8.0" } }, + "node_modules/devalue": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz", + "integrity": "sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q==", + "dev": true + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -804,9 +863,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.218", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.218.tgz", - "integrity": "sha512-INDylKH//YIf2w67D+IjkfVnGVrZ/D94DAU/FPPm6T4jEPbEDQvo9r2wTj0ncFdtJH8+V8BggZTaN8Rzk5wkgw==", + "version": "1.4.225", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz", + "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==", "dev": true }, "node_modules/emoji-regex": { @@ -1223,6 +1282,29 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1241,6 +1323,18 @@ "node": ">=8" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -1618,6 +1712,18 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -1718,24 +1824,41 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", + "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-gyp-build": { @@ -2312,6 +2435,20 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/sirv": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/sorcery": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", @@ -2411,9 +2548,9 @@ } }, "node_modules/svelte-check": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.0.tgz", - "integrity": "sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.1.tgz", + "integrity": "sha512-cibyY1sgt3ONIDnQbSgV2X9AJFhwEslRHNo95lijrYfPzVEvTvbmL2ohsUyqB5L7j1GhLXtQbjCJ4lZZ/fwbeQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.9", @@ -2622,6 +2759,15 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -2641,6 +2787,15 @@ "node": ">=4.2.0" } }, + "node_modules/undici": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.9.1.tgz", + "integrity": "sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==", + "dev": true, + "engines": { + "node": ">=12.18" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", @@ -2674,9 +2829,9 @@ "dev": true }, "node_modules/vite": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.7.tgz", - "integrity": "sha512-dILhvKba1mbP1wCezVQx/qhEK7/+jVn9ciadEcyKMMhZpsuAi/eWZfJRMkmYlkSFG7Qq9NvJbgFq4XOBxugJsA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz", + "integrity": "sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==", "dev": true, "peer": true, "dependencies": { @@ -2715,6 +2870,15 @@ } } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2841,6 +3005,17 @@ "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + } } }, "@nodelib/fs.scandir": { @@ -2869,6 +3044,12 @@ "fastq": "^1.6.0" } }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, "@rollup/pluginutils": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", @@ -2930,15 +3111,23 @@ } }, "@sveltejs/kit": { - "version": "1.0.0-next.405", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.405.tgz", - "integrity": "sha512-jHSa74F7k+hC+0fof75g/xm/+1M5sM66Qt6v8eLLMSgjkp36Lb5xOioBhbl6w0NYoE5xysLsBWuu+yHytfvCBA==", + "version": "1.0.0-next.427", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.427.tgz", + "integrity": "sha512-HUt1knOXaEM18y7E3k0CvhTxmoNhp0KbgfbLPmuRvSrQxRMsTnTpupZwW5mmU0VZkm4HHsf8mwftGy4WR8qf1Q==", "dev": true, "requires": { "@sveltejs/vite-plugin-svelte": "^1.0.1", - "chokidar": "^3.5.3", + "cookie": "^0.5.0", + "devalue": "^2.0.1", + "kleur": "^4.1.4", + "magic-string": "^0.26.2", + "mime": "^3.0.0", + "node-fetch": "^3.2.4", "sade": "^1.8.1", - "tiny-glob": "^0.2.9" + "set-cookie-parser": "^2.4.8", + "sirv": "^2.0.2", + "tiny-glob": "^0.2.9", + "undici": "^5.8.1" } }, "@sveltejs/vite-plugin-svelte": { @@ -2956,19 +3145,20 @@ } }, "@tailwindcss/typography": { - "version": "git+ssh://git@github.com/tailwindcss/typography.git#23e04c6bc4330a6b493fe3698be11ff287f4d7bc", + "version": "git+ssh://git@github.com/tailwindcss/typography.git#c1f01be2e6c7b13d03bee7789ec0378ba1dfca63", "dev": true, "from": "@tailwindcss/typography@github:tailwindcss/typography", "requires": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2" + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" } }, "@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", + "version": "18.7.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.8.tgz", + "integrity": "sha512-/YP55EMK2341JkODUb8DM9O0x1SIz2aBvyF33Uf1c76St3VpsMXEIW0nxuKkq/5cxnbz0RD9cfwNZHEAZQD3ag==", "dev": true }, "@types/pug": { @@ -3006,9 +3196,9 @@ } }, "@vitejs/plugin-basic-ssl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-0.1.1.tgz", - "integrity": "sha512-UhfGAZ8HgIMEPktKF8k58Y1LSwuYs1i1O4HY8E+yiOoYM+rkaPFBZo1SOkRsZN8DZTw90Q+ZznPej1o/mtTisg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-0.1.2.tgz", + "integrity": "sha512-EdwCHnbkakR6YPupySZm1WoCDRPaw9c5jObAo2pCRv8Ja2TESFC6Sc8RUOcKuihfjARDfszbBf+YEQwHY9s9wg==", "dev": true, "requires": {} }, @@ -3187,9 +3377,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", + "version": "1.0.30001378", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", + "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", "dev": true }, "chokidar": { @@ -3267,6 +3457,12 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, "css-selector-tokenizer": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", @@ -3295,6 +3491,12 @@ "tailwindcss": "^3" } }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3345,6 +3547,12 @@ "minimist": "^1.2.6" } }, + "devalue": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz", + "integrity": "sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q==", + "dev": true + }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -3358,9 +3566,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.218", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.218.tgz", - "integrity": "sha512-INDylKH//YIf2w67D+IjkfVnGVrZ/D94DAU/FPPm6T4jEPbEDQvo9r2wTj0ncFdtJH8+V8BggZTaN8Rzk5wkgw==", + "version": "1.4.225", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz", + "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==", "dev": true }, "emoji-regex": { @@ -3584,6 +3792,16 @@ "reusify": "^1.0.4" } }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -3599,6 +3817,15 @@ "to-regex-range": "^5.0.1" } }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "requires": { + "fetch-blob": "^3.1.2" + } + }, "fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -3888,6 +4115,12 @@ "picomatch": "^2.3.1" } }, + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true + }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -3961,13 +4194,21 @@ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true + }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", + "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", "dev": true, "requires": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" } }, "node-gyp-build": { @@ -4343,6 +4584,17 @@ "is-arrayish": "^0.3.1" } }, + "sirv": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + } + }, "sorcery": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", @@ -4418,9 +4670,9 @@ "dev": true }, "svelte-check": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.0.tgz", - "integrity": "sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.1.tgz", + "integrity": "sha512-cibyY1sgt3ONIDnQbSgV2X9AJFhwEslRHNo95lijrYfPzVEvTvbmL2ohsUyqB5L7j1GhLXtQbjCJ4lZZ/fwbeQ==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.9", @@ -4547,6 +4799,12 @@ "is-number": "^7.0.0" } }, + "totalist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", + "dev": true + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -4559,6 +4817,12 @@ "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, + "undici": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.9.1.tgz", + "integrity": "sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==", + "dev": true + }, "update-browserslist-db": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", @@ -4576,9 +4840,9 @@ "dev": true }, "vite": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.7.tgz", - "integrity": "sha512-dILhvKba1mbP1wCezVQx/qhEK7/+jVn9ciadEcyKMMhZpsuAi/eWZfJRMkmYlkSFG7Qq9NvJbgFq4XOBxugJsA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz", + "integrity": "sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==", "dev": true, "peer": true, "requires": { @@ -4589,6 +4853,12 @@ "rollup": ">=2.75.6 <2.77.0 || ~2.77.0" } }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index d464896..b18a63a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "headscale-ui", - "version": "2022.08.13-beta", + "version": "2022.08.20-beta", "scripts": { "dev": "vite dev --https --port 443 --host 0.0.0.0", "build": "vite build", From f6eade9e01bc970f7c5d625e838090b5c74a8378 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sat, 20 Aug 2022 09:47:26 +1000 Subject: [PATCH 010/110] fix regression with version setting --- docker/production/scripts/1-image-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/production/scripts/1-image-build.sh b/docker/production/scripts/1-image-build.sh index 38fcf39..c041a71 100644 --- a/docker/production/scripts/1-image-build.sh +++ b/docker/production/scripts/1-image-build.sh @@ -16,7 +16,7 @@ npm install # inject the version number VERSION=$(jq -r '.version' package.json) -sed -i "s/insert-version/${VERSION}/g" ./src/routes/settings.html.svelte +sed -i "s/insert-version/${VERSION}/g" ./src/routes/settings.html/+page.svelte # build the project npm run build \ No newline at end of file From fa28d334e0af4c55ad0eae68e3808a0370baa1a9 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Mon, 22 Aug 2022 10:55:39 +1000 Subject: [PATCH 011/110] minor cleanup, added flag switch in html --- src/lib/common/Stores.svelte | 1 + src/lib/common/stores.js | 19 ++++++++++++++----- src/lib/settings/DevSettings.svelte | 12 ++++++++++++ src/routes/settings.html/+page.svelte | 3 +++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 src/lib/settings/DevSettings.svelte diff --git a/src/lib/common/Stores.svelte b/src/lib/common/Stores.svelte index 628e89c..2c5713d 100644 --- a/src/lib/common/Stores.svelte +++ b/src/lib/common/Stores.svelte @@ -24,6 +24,7 @@ // stores URL and API key URLStore.set(localStorage.getItem('headscaleURL') || ''); + // remove trailing slashes when storing the URL URLStore.subscribe((val) => localStorage.setItem('headscaleURL', val.replace(/\/+$/, ''))); APIKeyStore.set(localStorage.getItem('headscaleAPIKey') || ''); APIKeyStore.subscribe((val) => localStorage.setItem('headscaleAPIKey', val)); diff --git a/src/lib/common/stores.js b/src/lib/common/stores.js index b3502a1..33a0883 100644 --- a/src/lib/common/stores.js +++ b/src/lib/common/stores.js @@ -1,6 +1,10 @@ import { writable } from 'svelte/store'; import { Device, User, ACL } from '$lib/common/classes'; +// +// localStorage Stores (global scope, saves to the browser) +// + // used to store the value of an alert across all components export const alertStore = writable(''); // used to determine if the API is functioning @@ -12,11 +16,6 @@ export const URLStore = writable(''); export const APIKeyStore = writable(''); // stores preauth key preference export const preAuthHideStore = writable(false); -// stores user and device data -export const userStore = writable([new User()]); -export const userFilterStore = writable([new User()]); -export const deviceStore = writable([new Device()]); -export const deviceFilterStore = writable([new Device()]); // stores search state export const userSearchStore = writable(''); export const deviceSearchStore = writable(''); @@ -25,5 +24,15 @@ export const deviceSortStore = writable('id'); export const deviceSortDirectionStore = writable('ascending'); export const userSortStore = writable('id'); export const sortDirectionStore = writable('ascending'); + +// +// Normal Stores (global scope, saves until refresh) +// + +// stores user and device data +export const userStore = writable([new User()]); +export const userFilterStore = writable([new User()]); +export const deviceStore = writable([new Device()]); +export const deviceFilterStore = writable([new Device()]); // stores ACL object export const aclStore = writable(new ACL()); \ No newline at end of file diff --git a/src/lib/settings/DevSettings.svelte b/src/lib/settings/DevSettings.svelte new file mode 100644 index 0000000..fa643ef --- /dev/null +++ b/src/lib/settings/DevSettings.svelte @@ -0,0 +1,12 @@ + + +

Developer Flags

+{#if showDevSettings} +
+

ACL Pages

+
+{/if} diff --git a/src/routes/settings.html/+page.svelte b/src/routes/settings.html/+page.svelte index d510bf3..c25d624 100644 --- a/src/routes/settings.html/+page.svelte +++ b/src/routes/settings.html/+page.svelte @@ -2,6 +2,7 @@ // // Imports // + import DevSettings from '$lib/settings/DevSettings.svelte'; import ServerSettings from '$lib/settings/ServerSettings.svelte'; import ThemeSettings from '$lib/settings/ThemeSettings.svelte'; import { onMount } from 'svelte'; @@ -26,5 +27,7 @@

Version

insert-version +
+
From b29c79fe90a9f421f87f8bc6f1bfc2ff8d2fb4be Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Mon, 22 Aug 2022 11:00:08 +1000 Subject: [PATCH 012/110] refactor stores.js to be more explicit --- src/lib/common/stores.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/common/stores.js b/src/lib/common/stores.js index 33a0883..1ad46a4 100644 --- a/src/lib/common/stores.js +++ b/src/lib/common/stores.js @@ -5,25 +5,18 @@ import { Device, User, ACL } from '$lib/common/classes'; // localStorage Stores (global scope, saves to the browser) // -// used to store the value of an alert across all components -export const alertStore = writable(''); -// used to determine if the API is functioning -export const apiTestStore = writable(''); // stores the theme export const themeStore = writable(''); // stores URL and API Key export const URLStore = writable(''); export const APIKeyStore = writable(''); -// stores preauth key preference -export const preAuthHideStore = writable(false); -// stores search state -export const userSearchStore = writable(''); -export const deviceSearchStore = writable(''); // stores sorting preferences export const deviceSortStore = writable('id'); export const deviceSortDirectionStore = writable('ascending'); export const userSortStore = writable('id'); export const sortDirectionStore = writable('ascending'); +// stores preauth key preference +export const preAuthHideStore = writable(false); // // Normal Stores (global scope, saves until refresh) @@ -35,4 +28,11 @@ export const userFilterStore = writable([new User()]); export const deviceStore = writable([new Device()]); export const deviceFilterStore = writable([new Device()]); // stores ACL object -export const aclStore = writable(new ACL()); \ No newline at end of file +export const aclStore = writable(new ACL()); +// used to store the value of an alert across all components +export const alertStore = writable(''); +// used to determine if the API is functioning +export const apiTestStore = writable(''); +// stores search state +export const userSearchStore = writable(''); +export const deviceSearchStore = writable(''); \ No newline at end of file From a5ed48bda0839092282166beb4093cdcc56aeb5c Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sat, 10 Sep 2022 13:17:10 +1000 Subject: [PATCH 013/110] added toggle to show groups page under dev settings --- src/lib/common/Stores.svelte | 6 +++++- src/lib/common/nav.svelte | 13 +++++++++++++ src/lib/common/stores.js | 4 ++++ src/lib/settings/DevSettings.svelte | 3 ++- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/lib/common/Stores.svelte b/src/lib/common/Stores.svelte index 2c5713d..69f3130 100644 --- a/src/lib/common/Stores.svelte +++ b/src/lib/common/Stores.svelte @@ -1,6 +1,6 @@ diff --git a/src/lib/common/nav.svelte b/src/lib/common/nav.svelte index 45b1aab..4300ade 100644 --- a/src/lib/common/nav.svelte +++ b/src/lib/common/nav.svelte @@ -3,6 +3,7 @@ import { fade } from 'svelte/transition'; import { writable } from 'svelte/store'; import { base } from '$app/paths'; + import { showACLPagesStore } from './stores'; // navigation bar variables let navExpanded = writable(''); @@ -46,6 +47,18 @@ User View + {#if $showACLPagesStore} + + + + + Group View + + {/if} diff --git a/src/lib/common/stores.js b/src/lib/common/stores.js index 1ad46a4..865caca 100644 --- a/src/lib/common/stores.js +++ b/src/lib/common/stores.js @@ -18,6 +18,10 @@ export const sortDirectionStore = writable('ascending'); // stores preauth key preference export const preAuthHideStore = writable(false); +// Dev Setting Stores +// Shows or Hides ACL Settings +export const showACLPagesStore = writable(false); + // // Normal Stores (global scope, saves until refresh) // diff --git a/src/lib/settings/DevSettings.svelte b/src/lib/settings/DevSettings.svelte index fa643ef..ae1d721 100644 --- a/src/lib/settings/DevSettings.svelte +++ b/src/lib/settings/DevSettings.svelte @@ -1,4 +1,5 @@

Developer Flags

{#if showDevSettings}
-

ACL Pages

+

ACL Pages

{/if} From 438639804fdbfcd5cac7c91d52b174890523f7e3 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sat, 10 Sep 2022 13:25:02 +1000 Subject: [PATCH 014/110] added group view page --- src/routes/groups.html/+page.svelte | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/routes/groups.html/+page.svelte diff --git a/src/routes/groups.html/+page.svelte b/src/routes/groups.html/+page.svelte new file mode 100644 index 0000000..6eacf2e --- /dev/null +++ b/src/routes/groups.html/+page.svelte @@ -0,0 +1,25 @@ + + + + {#if showACLPagesStore} + + {/if} + From df2737e0ef8e71763df38bc45d18c715eda3bb31 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sat, 10 Sep 2022 13:26:04 +1000 Subject: [PATCH 015/110] removed artificial delay in groups view --- src/routes/groups.html/+page.svelte | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/routes/groups.html/+page.svelte b/src/routes/groups.html/+page.svelte index 6eacf2e..78bbc50 100644 --- a/src/routes/groups.html/+page.svelte +++ b/src/routes/groups.html/+page.svelte @@ -10,8 +10,6 @@ let componentLoaded = false; onMount(async () => { - // Display component frontend - await new Promise((r) => setTimeout(r, 200)); componentLoaded = true; }); From bfb2e7e7ce46f1cf991c0f0d891ca4450068b9fd Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sun, 11 Sep 2022 15:51:54 +1000 Subject: [PATCH 016/110] emphasized that you need to fix CORS --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index b65c998..21ed6c2 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,11 @@ Note that while mobile is checked for functionality, the web experience is not m If you are getting errors about preflight checks, it's probably CORS related. Make sure your UI sits on the same subdomain as headscale or inject CORS headers. +### Errors related to "Missing Bearer Prefix" +Your API key is either not saved. Create an API key in `headscale` (via command line) with `headscale apikeys create` or `docker exec headscale apikeys create` and save it in `settings`. + +Alternatively, you haven't fixed your domain. HS-UI *has* to be ran on the same subdomain or you need to configure CORS. Yes you need to use a reverse proxy to do this. Use a reverse proxy. + ## Development see [development](/documentation/development.md) for details From b1bff1f8e5af3cfd4243c2f42bfb7da415dec4b4 Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Sun, 11 Sep 2022 16:13:22 +1000 Subject: [PATCH 017/110] extracted sort functions from get functions --- src/lib/common/apiFunctions.svelte | 66 +++----------------------- src/lib/common/sorting.svelte | 75 ++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 59 deletions(-) create mode 100644 src/lib/common/sorting.svelte diff --git a/src/lib/common/apiFunctions.svelte b/src/lib/common/apiFunctions.svelte index 371544c..aefe786 100644 --- a/src/lib/common/apiFunctions.svelte +++ b/src/lib/common/apiFunctions.svelte @@ -1,14 +1,13 @@ From 95e296419168092e4f25761894430f7cf546c09a Mon Sep 17 00:00:00 2001 From: Christopher Bisset Date: Tue, 13 Sep 2022 17:51:40 +1000 Subject: [PATCH 018/110] fixed sidebar floating --- src/lib/common/nav.svelte | 2 +- src/routes/+layout.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/common/nav.svelte b/src/lib/common/nav.svelte index 4300ade..6ac53fb 100644 --- a/src/lib/common/nav.svelte +++ b/src/lib/common/nav.svelte @@ -31,7 +31,7 @@ {#if componentLoaded} -