From 206dc5f2f8edfd22ec7e36fdb192527b49215c5c Mon Sep 17 00:00:00 2001 From: Eva Decker Date: Mon, 5 Aug 2024 16:00:22 -0400 Subject: [PATCH] Use Biome --- .eslintignore | 13 - .eslintrc.cjs | 30 - .eslintrc.js | 14 - .prettierignore | 13 - .prettierrc | 9 - .prettierrc.json | 31 - .vscode/extensions.json | 4 +- .vscode/settings.json | 8 +- biome.jsonc | 27 + package.json | 13 +- playwright.config.ts | 12 +- pnpm-lock.yaml | 945 +++---------------- src/lib/components/AudioPreview.svelte | 52 +- src/lib/components/CoverCard.svelte | 54 +- src/lib/components/CoverCard.test.ts | 116 ++- src/lib/components/CoverComparison.svelte | 18 +- src/lib/components/CoverComparison.test.ts | 114 ++- src/lib/components/ErrorMessage.svelte | 6 +- src/lib/components/ErrorMessage.test.ts | 28 +- src/lib/components/Footer.svelte | 6 +- src/lib/components/GenderSelect.svelte | 40 +- src/lib/components/Header.svelte | 4 +- src/lib/components/Header.test.ts | 12 +- src/lib/components/Logo.test.ts | 20 +- src/lib/components/NewCoverIcon.test.ts | 12 +- src/lib/components/ProseLayout.svelte | 16 +- src/lib/components/SongPreview.svelte | 68 +- src/lib/components/SongSelect.svelte | 228 ++--- src/lib/components/Sparkle.test.ts | 12 +- src/lib/components/Step.svelte | 2 +- src/lib/components/Tag.svelte | 8 +- src/lib/constants.ts | 158 ++-- src/lib/helpers.test.ts | 293 +++--- src/lib/helpers.ts | 70 +- src/lib/schemas.ts | 36 +- src/lib/stores/theme.ts | 19 +- src/lib/supabase.ts | 14 +- src/lib/types/db-generated.types.ts | 90 +- src/lib/types/types.ts | 9 +- src/routes/+layout.svelte | 12 +- src/routes/+page.server.ts | 34 +- src/routes/+page.svelte | 186 ++-- src/routes/api/getAudioFeatures/+server.ts | 13 +- src/routes/api/getCover/+server.ts | 12 +- src/routes/api/getEarliestRelease/+server.ts | 28 +- src/routes/api/getSpotifyResults/+server.ts | 14 +- src/routes/api/getSpotifyTrack/+server.ts | 19 +- src/routes/cover/[slug]/+page.server.ts | 31 +- src/routes/cover/[slug]/+page.svelte | 179 ++-- src/routes/cover/[slug]/og.png/+server.ts | 243 ++--- src/routes/new/+page.server.ts | 80 +- src/routes/new/+page.svelte | 119 ++- src/routes/random/+page.svelte | 14 +- svelte.config.js | 26 +- tests/index.spec.ts | 205 ++-- vite.config.ts | 32 +- 56 files changed, 1634 insertions(+), 2237 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.cjs delete mode 100644 .eslintrc.js delete mode 100644 .prettierignore delete mode 100644 .prettierrc delete mode 100644 .prettierrc.json create mode 100644 biome.jsonc diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 3897265..0000000 --- a/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 4b29a01..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - root: true, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:svelte/recommended', - 'prettier' - ], - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020, - extraFileExtensions: ['.svelte'] - }, - env: { - browser: true, - es2017: true, - node: true - }, - overrides: [ - { - files: ['*.svelte'], - parser: 'svelte-eslint-parser', - parserOptions: { - parser: '@typescript-eslint/parser' - } - } - ] -}; diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f3aee5..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - extends: ['eslint:recommended', 'plugin:astro/recommended', 'prettier'], - plugins: ['unused-imports'], - overrides: [ - { - files: ['*.astro'], - parser: 'astro-eslint-parser', - parserOptions: { - parser: '@typescript-eslint/parser', - extraFileExtensions: ['.astro'] - } - } - ] -}; diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 3897265..0000000 --- a/.prettierignore +++ /dev/null @@ -1,13 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 206e042..0000000 --- a/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "useTabs": false, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], - "pluginSearchDirs": ["."], - "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] -} diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index f09ade4..0000000 --- a/.prettierrc.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "arrowParens": "always", - "bracketSpacing": true, - "endOfLine": "lf", - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "singleAttributePerLine": false, - "bracketSameLine": false, - "jsxBracketSameLine": false, - "jsxSingleQuote": false, - "printWidth": 80, - "proseWrap": "preserve", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": true, - "singleQuote": false, - "tabWidth": 2, - "trailingComma": "es5", - "useTabs": false, - "embeddedLanguageFormatting": "auto", - "vueIndentScriptAndStyle": false, - "plugins": ["prettier-plugin-astro", "prettier-plugin-svelte"], - "overrides": [ - { - "files": "*.astro", - "options": { - "parser": "astro" - } - } - ] -} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 22a1505..3411ffc 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,4 +1,4 @@ { - "recommendations": ["astro-build.astro-vscode"], - "unwantedRecommendations": [] + "recommendations": ["astro-build.astro-vscode", "biomejs.biome"], + "unwantedRecommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 9fcdee5..8c61620 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,15 @@ { - "eslint.validate": ["javascript", "javascriptreact", "astro", "typescript", "typescriptreact"], "editor.formatOnPaste": true, "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit" }, - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "biomejs.biome", "[typescriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, - "eslint.enable": true, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, "[svelte]": { "editor.defaultFormatter": "svelte.svelte-vscode" diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..7cdbf49 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,27 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "files": { + "ignore": [ + "**/.DS_Store", + "./build", + "./coverage", + ".vscode", + ".vercel", + ".svelte-kit", + "./package", + "**/.env", + "**/.env.*", + "**/pnpm-lock.yaml" + ] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf" + }, + "organizeImports": { "enabled": true }, + "linter": { "enabled": true, "rules": { "recommended": true } }, + "overrides": [{ "include": ["*.svelte"] }] +} diff --git a/package.json b/package.json index 708f0de..8073fd6 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,9 @@ "preview": "vite preview", "prepare": "svelte-kit sync", "test": "npm run test:integration && npm run test:unit", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json && biome check", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write .", + "check:format": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json && biome check --write", "test:integration": "playwright test", "test:unit": "vitest", "test:unit-coverage": "vitest --coverage", @@ -33,6 +32,7 @@ "svelte-preprocess": "^6.0.1" }, "devDependencies": { + "@biomejs/biome": "^1.8.3", "@iconify-json/ri": "^1.1.21", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.83.0", @@ -42,16 +42,9 @@ "@sveltejs/kit": "^2.5.18", "@sveltejs/vite-plugin-svelte": "^3.1.1", "@testing-library/svelte": "^5.2.0", - "@typescript-eslint/eslint-plugin": "^7.15.0", - "@typescript-eslint/parser": "^7.15.0", "@vitest/coverage-v8": "^2.0.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.41.0", "jsdom": "^24.1.0", "mdsvex": "^0.11.2", - "prettier": "^2.8.8", - "prettier-plugin-svelte": "^2.10.1", "sass": "^1.77.6", "supabase": "^1.178.2", "svelte": "^4.2.18", diff --git a/playwright.config.ts b/playwright.config.ts index c10a10b..0d4ab8f 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,15 +1,15 @@ -import type { PlaywrightTestConfig } from '@playwright/test'; +import type { PlaywrightTestConfig } from "@playwright/test"; const config: PlaywrightTestConfig = { webServer: { - command: 'npm run build && npm run preview', - port: 4173 + command: "npm run build && npm run preview", + port: 4173, }, - testDir: 'tests', + testDir: "tests", testMatch: /(.+\.)?(test|spec)\.[jt]s/, use: { - baseURL: 'http://localhost:4173' - } + baseURL: "http://localhost:4173", + }, }; export default config; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aec5099..3c16a0e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,8 +37,11 @@ importers: version: 1.1.0 svelte-preprocess: specifier: ^6.0.1 - version: 6.0.1(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3) + version: 6.0.1(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3) devDependencies: + '@biomejs/biome': + specifier: ^1.8.3 + version: 1.8.3 '@iconify-json/ri': specifier: ^1.1.21 version: 1.1.21 @@ -66,36 +69,15 @@ importers: '@testing-library/svelte': specifier: ^5.2.0 version: 5.2.0(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6))(vitest@2.0.0(@types/node@20.14.10)(jsdom@24.1.0)(sass@1.77.6)) - '@typescript-eslint/eslint-plugin': - specifier: ^7.15.0 - version: 7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/parser': - specifier: ^7.15.0 - version: 7.15.0(eslint@8.57.0)(typescript@5.5.3) '@vitest/coverage-v8': specifier: ^2.0.0 version: 2.0.0(vitest@2.0.0(@types/node@20.14.10)(jsdom@24.1.0)(sass@1.77.6)) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-svelte: - specifier: ^2.41.0 - version: 2.41.0(eslint@8.57.0)(svelte@4.2.18) jsdom: specifier: ^24.1.0 version: 24.1.0 mdsvex: specifier: ^0.11.2 version: 0.11.2(svelte@4.2.18) - prettier: - specifier: ^2.8.8 - version: 2.8.8 - prettier-plugin-svelte: - specifier: ^2.10.1 - version: 2.10.1(prettier@2.8.8)(svelte@4.2.18) sass: specifier: ^1.77.6 version: 1.77.6 @@ -107,7 +89,7 @@ importers: version: 4.2.18 svelte-check: specifier: ^3.8.4 - version: 3.8.4(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(sass@1.77.6)(svelte@4.2.18) + version: 3.8.4(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.6)(svelte@4.2.18) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 @@ -186,6 +168,59 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@biomejs/biome@1.8.3': + resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.8.3': + resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.8.3': + resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.8.3': + resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.8.3': + resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.8.3': + resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.8.3': + resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.8.3': + resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.8.3': + resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} @@ -471,28 +506,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.10.1': - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@exodus/schemasafe@1.3.0': resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} @@ -530,19 +543,6 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@iconify-json/ri@1.1.21': resolution: {integrity: sha512-ssU2CRaB4T83Q3cncCZtITholhYkH6gEL5XLmdMII6Xzn8bTCpDCkt+HdX4URc24uUMD0PGIaNLJUIAgdfLMjQ==} @@ -728,18 +728,6 @@ packages: peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - '@paulirish/trace_engine@0.0.23': resolution: {integrity: sha512-2ym/q7HhC5K+akXkNV6Gip3oaHpbI6TsGjmcAsl7bcJ528MVbacPQeoauLFEeLXH4ulJvsxQwNDIg/kAEhFZxw==} @@ -1085,67 +1073,6 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@7.15.0': - resolution: {integrity: sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.15.0': - resolution: {integrity: sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@7.15.0': - resolution: {integrity: sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.15.0': - resolution: {integrity: sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.15.0': - resolution: {integrity: sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.15.0': - resolution: {integrity: sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.15.0': - resolution: {integrity: sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.15.0': - resolution: {integrity: sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vercel/nft@0.27.2': resolution: {integrity: sha512-7LeioS1yE5hwPpQfD3DdH04tuugKjo5KrJk3yK5kAI3Lh76iSsK/ezoFQfzuT08X3ZASQOd1y9ePjLNI9+TxTQ==} engines: {node: '>=16'} @@ -1191,11 +1118,6 @@ packages: peerDependencies: acorn: ^8 - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.0: resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} @@ -1214,9 +1136,6 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1272,9 +1191,6 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -1284,10 +1200,6 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1401,10 +1313,6 @@ packages: call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -1577,11 +1485,6 @@ packages: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - cssstyle@4.0.1: resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} engines: {node: '>=18'} @@ -1638,9 +1541,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1697,17 +1597,9 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1792,61 +1684,14 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-svelte@2.41.0: - resolution: {integrity: sha512-gjU9Q/psxbWG1VNwYbEb0Q6U4W5PBGaDpYmO2zlQ+zlAMVS3Qt0luAK0ACi/tMSwRK6JENiySvMyJbO0YWmXSg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.155 - peerDependenciesMeta: - svelte: - optional: true - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -1886,25 +1731,9 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -1919,10 +1748,6 @@ packages: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -1942,13 +1767,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} @@ -2032,10 +1850,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@10.4.3: resolution: {integrity: sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==} engines: {node: '>=18'} @@ -2045,17 +1859,9 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -2065,9 +1871,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -2144,20 +1947,12 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - image-ssim@0.2.0: resolution: {integrity: sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==} immutable@4.3.6: resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -2223,10 +2018,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -2294,10 +2085,6 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} @@ -2310,42 +2097,23 @@ packages: canvas: optional: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-to-ts@3.1.0: resolution: {integrity: sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==} engines: {node: '>=16'} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} just-clone@6.2.0: resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.34.0: - resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} - kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lighthouse-logger@1.2.0: resolution: {integrity: sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==} @@ -2382,9 +2150,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -2451,10 +2216,6 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - metaviewport-parser@0.3.0: resolution: {integrity: sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==} @@ -2575,9 +2336,6 @@ packages: engines: {node: ^18 || >=20} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -2677,10 +2435,6 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -2719,10 +2473,6 @@ packages: pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} @@ -2759,10 +2509,6 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -2808,48 +2554,13 @@ packages: ts-node: optional: true - postcss-safe-parser@6.0.0: - resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.3.3 - - postcss-scss@4.0.9: - resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.4.29 - - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} - engines: {node: '>=4'} - postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.39: resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-plugin-svelte@2.10.1: - resolution: {integrity: sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==} - peerDependencies: - prettier: ^1.16.4 || ^2.0.0 - svelte: ^3.2.0 || ^4.0.0-next.0 - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2904,9 +2615,6 @@ packages: querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} @@ -2949,10 +2657,6 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2961,10 +2665,6 @@ packages: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -2999,9 +2699,6 @@ packages: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} @@ -3107,10 +2804,6 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -3211,10 +2904,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strip-literal@2.1.0: resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} @@ -3244,15 +2933,6 @@ packages: peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - svelte-eslint-parser@0.39.2: - resolution: {integrity: sha512-87UwLuWTtDIuzWOhOi1zBL5wYVd07M5BK1qZ57YmXJB5/UmjUNJqGy3XSOhPqjckY1dATNV9y+mx+nI0WH6HPA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115 - peerDependenciesMeta: - svelte: - optional: true - svelte-hmr@0.16.0: resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} engines: {node: ^12.20 || ^14.13.1 || >= 16} @@ -3374,9 +3054,6 @@ packages: text-decoder@1.1.0: resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - third-party-web@0.24.3: resolution: {integrity: sha512-imE6hXZyaCeGinGFCvpWsv0oelsEaufSG39qYBQhp3urGq4OLOtsuEddf3XgKxmAAczBD/I1Tnp8L3gJ3ksTuQ==} @@ -3454,12 +3131,6 @@ packages: ts-algebra@2.0.0: resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - ts-deepmerge@7.0.0: resolution: {integrity: sha512-WZ/iAJrKDhdINv1WG6KZIGHrZDar6VfhftG1QJFpVbOYZMYJLJOvZOo1amictRXVdBXZIgBHKswMTXzElngprA==} engines: {node: '>=14.13.1'} @@ -3473,18 +3144,10 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -3556,9 +3219,6 @@ packages: resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} engines: {node: '>=14.0.0'} - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -3715,10 +3375,6 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -3904,6 +3560,41 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@biomejs/biome@1.8.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.8.3 + '@biomejs/cli-darwin-x64': 1.8.3 + '@biomejs/cli-linux-arm64': 1.8.3 + '@biomejs/cli-linux-arm64-musl': 1.8.3 + '@biomejs/cli-linux-x64': 1.8.3 + '@biomejs/cli-linux-x64-musl': 1.8.3 + '@biomejs/cli-win32-arm64': 1.8.3 + '@biomejs/cli-win32-x64': 1.8.3 + + '@biomejs/cli-darwin-arm64@1.8.3': + optional: true + + '@biomejs/cli-darwin-x64@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64@1.8.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-x64@1.8.3': + optional: true + + '@biomejs/cli-win32-arm64@1.8.3': + optional: true + + '@biomejs/cli-win32-x64@1.8.3': + optional: true + '@emnapi/runtime@1.2.0': dependencies: tslib: 2.6.3 @@ -4050,31 +3741,6 @@ snapshots: '@esbuild/win32-x64@0.23.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.10.1': {} - - '@eslint-community/regexpp@4.11.0': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.0': {} - '@exodus/schemasafe@1.3.0': optional: true @@ -4130,18 +3796,6 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - '@iconify-json/ri@1.1.21': dependencies: '@iconify/types': 2.0.0 @@ -4350,18 +4004,6 @@ snapshots: nanoid: 5.0.7 svelte: 4.2.18 - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - '@paulirish/trace_engine@0.0.23': {} '@pkgjs/parseargs@0.11.0': @@ -4778,89 +4420,6 @@ snapshots: '@types/node': 20.14.10 optional: true - '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.15.0 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.15.0 - debug: 4.3.5 - eslint: 8.57.0 - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@7.15.0': - dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 - - '@typescript-eslint/type-utils@7.15.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@7.15.0': {} - - '@typescript-eslint/typescript-estree@7.15.0(typescript@5.5.3)': - dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.15.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@7.15.0': - dependencies: - '@typescript-eslint/types': 7.15.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - '@vercel/nft@0.27.2': dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -4952,10 +4511,6 @@ snapshots: dependencies: acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.12.0): - dependencies: - acorn: 8.12.0 - acorn@8.12.0: {} acorn@8.12.1: {} @@ -4972,13 +4527,6 @@ snapshots: transitivePeerDependencies: - supports-color - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ansi-colors@4.1.3: {} ansi-escapes@3.2.0: {} @@ -5019,8 +4567,6 @@ snapshots: dependencies: sprintf-js: 1.0.3 - argparse@2.0.1: {} - aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -5033,8 +4579,6 @@ snapshots: array-flatten@1.1.1: {} - array-union@2.1.0: {} - assertion-error@2.0.1: {} ast-types@0.13.4: @@ -5157,8 +4701,6 @@ snapshots: call-me-maybe@1.0.2: {} - callsites@3.1.0: {} - camelcase@5.3.1: {} camelcase@8.0.0: @@ -5358,8 +4900,6 @@ snapshots: mdn-data: 2.0.30 source-map-js: 1.2.0 - cssesc@3.0.0: {} - cssstyle@4.0.1: dependencies: rrweb-cssom: 0.6.0 @@ -5393,8 +4933,6 @@ snapshots: deep-eql@5.0.2: {} - deep-is@0.1.4: {} - deepmerge@4.3.1: {} define-data-property@1.1.4: @@ -5433,17 +4971,9 @@ snapshots: diff-sequences@29.6.3: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dlv@1.1.3: optional: true - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dot-prop@5.3.0: @@ -5558,102 +5088,10 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - semver: 7.6.2 - - eslint-config-prettier@9.1.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-svelte@2.41.0(eslint@8.57.0)(svelte@4.2.18): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@jridgewell/sourcemap-codec': 1.4.15 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) - esutils: 2.0.3 - known-css-properties: 0.34.0 - postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38) - postcss-safe-parser: 6.0.0(postcss@8.4.38) - postcss-selector-parser: 6.1.0 - semver: 7.6.2 - svelte-eslint-parser: 0.39.2(svelte@4.2.18) - optionalDependencies: - svelte: 4.2.18 - transitivePeerDependencies: - - ts-node - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - esm-env@1.0.0: {} - espree@9.6.1: - dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.5.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -5742,26 +5180,8 @@ snapshots: transitivePeerDependencies: - supports-color - fast-deep-equal@3.1.3: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.7 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -5777,10 +5197,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-uri-to-path@1.0.0: {} fill-range@7.1.1: @@ -5809,14 +5225,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.1: {} - focus-trap@7.5.4: dependencies: tabbable: 6.2.0 @@ -5905,10 +5313,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@10.4.3: dependencies: foreground-child: 3.2.1 @@ -5927,21 +5331,8 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globalyzer@0.1.0: {} - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - globrex@0.1.2: {} gopd@1.0.1: @@ -5950,8 +5341,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -6023,17 +5412,10 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.1: {} - image-ssim@0.2.0: {} immutable@4.3.6: {} - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -6097,8 +5479,6 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} - is-potential-custom-element-name@1.0.1: {} is-reference@3.0.2: @@ -6173,10 +5553,6 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - jsbn@1.1.0: {} jsdom@24.1.0: @@ -6207,18 +5583,12 @@ snapshots: - supports-color - utf-8-validate - json-buffer@3.0.1: {} - json-schema-to-ts@3.1.0: dependencies: '@babel/runtime': 7.24.7 ts-algebra: 2.0.0 optional: true - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -6227,21 +5597,10 @@ snapshots: just-clone@6.2.0: {} - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - kleur@4.1.5: {} - known-css-properties@0.34.0: {} - kolorist@1.8.0: {} - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lighthouse-logger@1.2.0: dependencies: debug: 2.6.9 @@ -6293,7 +5652,8 @@ snapshots: - supports-color - utf-8-validate - lilconfig@2.1.0: {} + lilconfig@2.1.0: + optional: true linebreak@1.1.0: dependencies: @@ -6315,8 +5675,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} - lodash@4.17.21: {} lookup-closest-locale@6.2.0: {} @@ -6375,8 +5733,6 @@ snapshots: merge-stream@2.0.0: {} - merge2@1.4.1: {} - metaviewport-parser@0.3.0: {} methods@1.1.2: {} @@ -6463,8 +5819,6 @@ snapshots: nanoid@5.0.7: {} - natural-compare@1.4.0: {} - negotiator@0.6.3: {} netmask@2.0.2: {} @@ -6548,15 +5902,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - os-tmpdir@1.0.2: {} p-limit@2.3.0: @@ -6599,10 +5944,6 @@ snapshots: pako@0.2.9: {} - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - parse-cache-control@1.0.1: {} parse-css-color@0.2.1: @@ -6631,8 +5972,6 @@ snapshots: path-to-regexp@0.1.7: {} - path-type@4.0.0: {} - pathe@1.1.2: {} pathval@2.0.0: {} @@ -6663,49 +6002,22 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - postcss-load-config@3.1.4(postcss@8.4.38): + postcss-load-config@3.1.4(postcss@8.4.39): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.38 - - postcss-safe-parser@6.0.0(postcss@8.4.38): - dependencies: - postcss: 8.4.38 - - postcss-scss@4.0.9(postcss@8.4.38): - dependencies: - postcss: 8.4.38 - - postcss-selector-parser@6.1.0: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + postcss: 8.4.39 + optional: true postcss-value-parser@4.2.0: {} - postcss@8.4.38: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - postcss@8.4.39: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - prelude-ls@1.2.1: {} - - prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.2.18): - dependencies: - prettier: 2.8.8 - svelte: 4.2.18 - - prettier@2.8.8: {} - pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -6774,8 +6086,6 @@ snapshots: querystringify@2.2.0: {} - queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} range-parser@1.2.1: {} @@ -6811,8 +6121,6 @@ snapshots: requires-port@1.0.0: {} - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} restore-cursor@2.0.0: @@ -6820,8 +6128,6 @@ snapshots: onetime: 2.0.1 signal-exit: 3.0.7 - reusify@1.0.4: {} - rimraf@2.7.1: dependencies: glob: 7.2.3 @@ -6864,10 +6170,6 @@ snapshots: run-async@2.4.1: {} - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - rxjs@6.6.7: dependencies: tslib: 1.14.1 @@ -7019,8 +6321,6 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 - slash@3.0.0: {} - smart-buffer@4.2.0: {} socks-proxy-agent@8.0.3: @@ -7127,8 +6427,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@3.1.1: {} - strip-literal@2.1.0: dependencies: js-tokens: 9.0.0 @@ -7157,14 +6455,14 @@ snapshots: dependencies: autosize: 6.0.1 - svelte-check@3.8.4(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(sass@1.77.6)(svelte@4.2.18): + svelte-check@3.8.4(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.6)(svelte@4.2.18): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 picocolors: 1.0.1 sade: 1.8.1 svelte: 4.2.18 - svelte-preprocess: 5.1.4(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3) + svelte-preprocess: 5.1.4(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3) typescript: 5.5.3 transitivePeerDependencies: - '@babel/core' @@ -7177,21 +6475,11 @@ snapshots: - stylus - sugarss - svelte-eslint-parser@0.39.2(svelte@4.2.18): - dependencies: - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - postcss: 8.4.38 - postcss-scss: 4.0.9(postcss@8.4.38) - optionalDependencies: - svelte: 4.2.18 - svelte-hmr@0.16.0(svelte@4.2.18): dependencies: svelte: 4.2.18 - svelte-preprocess@5.1.4(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3): + svelte-preprocess@5.1.4(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -7200,19 +6488,19 @@ snapshots: strip-indent: 3.0.0 svelte: 4.2.18 optionalDependencies: - postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38) + postcss: 8.4.39 + postcss-load-config: 3.1.4(postcss@8.4.39) sass: 1.77.6 typescript: 5.5.3 - svelte-preprocess@6.0.1(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3): + svelte-preprocess@6.0.1(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(sass@1.77.6)(svelte@4.2.18)(typescript@5.5.3): dependencies: detect-indent: 6.1.0 strip-indent: 3.0.0 svelte: 4.2.18 optionalDependencies: - postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38) + postcss: 8.4.39 + postcss-load-config: 3.1.4(postcss@8.4.39) sass: 1.77.6 typescript: 5.5.3 @@ -7307,8 +6595,6 @@ snapshots: dependencies: b4a: 1.6.6 - text-table@0.2.0: {} - third-party-web@0.24.3: {} through@2.3.8: {} @@ -7374,10 +6660,6 @@ snapshots: ts-algebra@2.0.0: optional: true - ts-api-utils@1.3.0(typescript@5.5.3): - dependencies: - typescript: 5.5.3 - ts-deepmerge@7.0.0: {} tslib@1.14.1: {} @@ -7387,14 +6669,8 @@ snapshots: tslib@2.6.3: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.20.2: {} - type-fest@2.19.0: optional: true @@ -7456,10 +6732,6 @@ snapshots: webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - url-parse@1.5.10: dependencies: querystringify: 2.2.0 @@ -7599,8 +6871,6 @@ snapshots: dependencies: string-width: 4.2.3 - word-wrap@1.2.5: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -7653,7 +6923,8 @@ snapshots: yallist@5.0.0: {} - yaml@1.10.2: {} + yaml@1.10.2: + optional: true yargs-parser@13.1.2: dependencies: diff --git a/src/lib/components/AudioPreview.svelte b/src/lib/components/AudioPreview.svelte index 387768b..af972e3 100644 --- a/src/lib/components/AudioPreview.svelte +++ b/src/lib/components/AudioPreview.svelte @@ -1,37 +1,37 @@
- import { smartquotes } from '$lib/helpers'; - import ArrowLeftRightLine from '~icons/ri/arrow-left-right-line'; - - type Album = { - name: string; - artists: string[]; - album_img: string[]; - }; - - export let original: Album | null = null; - export let cover: Album | null = null; - export let slug: string | null = null; - export let lazy: boolean = false; - - let isSkeleton = false; - if (!original && !cover && !slug) isSkeleton = true; +import { smartquotes } from "$lib/helpers"; + +type Album = { + name: string; + artists: string[]; + album_img: string[]; +}; + +export const original: Album | null = null; +export const cover: Album | null = null; +export const slug: string | null = null; +export const lazy: boolean = false; + +let isSkeleton = false; +if (!original && !cover && !slug) isSkeleton = true; -
+
{#if original?.album_img} {`${original.name} {/if}
@@ -33,7 +36,7 @@ {`${cover.name} {/if}
@@ -49,11 +52,18 @@ {cover.artists.join(", ")} {/if} {#if original} - covering {original.artists.join(", ")} + covering {original.artists.join(", ")} {/if}
{#if !isSkeleton} - + {/if}
@@ -96,7 +106,7 @@ box-shadow: var(--shadow-album-s); &::after { - content: ''; + content: ""; position: absolute; inset: 0; border-radius: var(--radius-album); diff --git a/src/lib/components/CoverCard.test.ts b/src/lib/components/CoverCard.test.ts index a9d6a2d..252be3f 100644 --- a/src/lib/components/CoverCard.test.ts +++ b/src/lib/components/CoverCard.test.ts @@ -1,112 +1,124 @@ -import { render } from '@testing-library/svelte'; -import CoverCard from './CoverCard.svelte'; -import { describe, it } from 'vitest'; - -describe('CoverCard', () => { - it('should apply placeholder styles when data is undefined', async ({ expect }) => { +import { render } from "@testing-library/svelte"; +import { describe, it } from "vitest"; +import CoverCard from "./CoverCard.svelte"; + +describe("CoverCard", () => { + it("should apply placeholder styles when data is undefined", async ({ + expect, + }) => { const { container } = render(CoverCard, { - props: { original: null, cover: null, slug: null } + props: { original: null, cover: null, slug: null }, }); - const coverCardDiv = container.querySelector('.coverCard'); + const coverCardDiv = container.querySelector(".coverCard"); expect(coverCardDiv).toBeDefined(); - expect(coverCardDiv?.classList.contains('placeholder')).toBe(true); + expect(coverCardDiv?.classList.contains("placeholder")).toBe(true); }); - it('should link to the slug', async ({ expect }) => { + it("should link to the slug", async ({ expect }) => { const { container } = render(CoverCard, { - props: { original: null, cover: null, slug: 'test-slug' } + props: { original: null, cover: null, slug: "test-slug" }, }); - const linkElement = container.querySelector('a'); + const linkElement = container.querySelector("a"); expect(linkElement).toBeDefined(); - expect(linkElement?.getAttribute('href')).toBe('/cover/test-slug'); + expect(linkElement?.getAttribute("href")).toBe("/cover/test-slug"); }); - it('should set `loading` to `lazy` when prop is set', async ({ expect }) => { + it("should set `loading` to `lazy` when prop is set", async ({ expect }) => { const original = { - name: 'Original Name', - artists: ['Original Artist'], - album_img: ['test.jpg'] + name: "Original Name", + artists: ["Original Artist"], + album_img: ["test.jpg"], }; const cover = { - name: 'Cover Name', - artists: ['Cover Artist'], - album_img: ['test-cover.jpg'] + name: "Cover Name", + artists: ["Cover Artist"], + album_img: ["test-cover.jpg"], }; const { container } = render(CoverCard, { - props: { original, cover, slug: 'test-slug', lazy: true } + props: { original, cover, slug: "test-slug", lazy: true }, }); - const coverImage = container.querySelector('img'); + const coverImage = container.querySelector("img"); expect(coverImage).toBeDefined(); - expect(coverImage?.getAttribute('loading')).toBe('lazy'); + expect(coverImage?.getAttribute("loading")).toBe("lazy"); }); - it('should set `loading` to `eager` when `lazy` is undefined', async ({ expect }) => { + it("should set `loading` to `eager` when `lazy` is undefined", async ({ + expect, + }) => { const original = { - name: 'Original Name', - artists: ['Original Artist'], - album_img: ['test.jpg'] + name: "Original Name", + artists: ["Original Artist"], + album_img: ["test.jpg"], }; const cover = { - name: 'Cover Name', - artists: ['Cover Artist'], - album_img: ['test-cover.jpg'] + name: "Cover Name", + artists: ["Cover Artist"], + album_img: ["test-cover.jpg"], }; const { container } = render(CoverCard, { - props: { original, cover, slug: 'test-slug' } + props: { original, cover, slug: "test-slug" }, }); - const coverImage = container.querySelector('img'); + const coverImage = container.querySelector("img"); expect(coverImage).toBeDefined(); - expect(coverImage?.getAttribute('loading')).toBe('eager'); + expect(coverImage?.getAttribute("loading")).toBe("eager"); }); - it('should render original name and artists correctly', async ({ expect }) => { + it("should render original name and artists correctly", async ({ + expect, + }) => { const original = { - name: 'Original Name', - artists: ['Original Artist'], - album_img: ['test.jpg'] + name: "Original Name", + artists: ["Original Artist"], + album_img: ["test.jpg"], + }; + const cover = { + name: "Cover Name", + artists: ["Cover Artist"], + album_img: ["test-cover.jpg"], }; - const cover = { name: 'Cover Name', artists: ['Cover Artist'], album_img: ['test-cover.jpg'] }; const { getByText } = render(CoverCard, { - props: { original, cover, slug: 'test-slug' } + props: { original, cover, slug: "test-slug" }, }); - const originalNameElement = getByText('Original Name'); + const originalNameElement = getByText("Original Name"); expect(originalNameElement).toBeDefined(); - const originalArtistElement = getByText('Original Artist'); + const originalArtistElement = getByText("Original Artist"); expect(originalArtistElement).toBeDefined(); - const coverArtistElement = getByText('Cover Artist'); + const coverArtistElement = getByText("Cover Artist"); expect(coverArtistElement).toBeDefined(); }); - it('should render multiple artist names correctly', async ({ expect }) => { + it("should render multiple artist names correctly", async ({ expect }) => { const original = { - name: 'Original Name', - artists: ['Original Artist', 'Original Artist 2'], - album_img: ['test.jpg'] + name: "Original Name", + artists: ["Original Artist", "Original Artist 2"], + album_img: ["test.jpg"], }; const cover = { - name: 'Cover Name', - artists: ['Cover Artist', 'Cover Artist 2'], - album_img: ['test-cover.jpg'] + name: "Cover Name", + artists: ["Cover Artist", "Cover Artist 2"], + album_img: ["test-cover.jpg"], }; const { getByText } = render(CoverCard, { - props: { original, cover, slug: 'test-slug' } + props: { original, cover, slug: "test-slug" }, }); - const originalArtistElement = getByText('Original Artist, Original Artist 2'); + const originalArtistElement = getByText( + "Original Artist, Original Artist 2", + ); expect(originalArtistElement).toBeDefined(); - const coverArtistElement = getByText('Cover Artist, Cover Artist 2'); + const coverArtistElement = getByText("Cover Artist, Cover Artist 2"); expect(coverArtistElement).toBeDefined(); }); }); diff --git a/src/lib/components/CoverComparison.svelte b/src/lib/components/CoverComparison.svelte index 0c5e2a6..e640712 100644 --- a/src/lib/components/CoverComparison.svelte +++ b/src/lib/components/CoverComparison.svelte @@ -1,16 +1,16 @@
diff --git a/src/lib/components/CoverComparison.test.ts b/src/lib/components/CoverComparison.test.ts index e12f91f..7860375 100644 --- a/src/lib/components/CoverComparison.test.ts +++ b/src/lib/components/CoverComparison.test.ts @@ -1,23 +1,23 @@ -import { render } from '@testing-library/svelte'; -import CoverComparison from './CoverComparison.svelte'; -import { describe, it } from 'vitest'; -import type { Cover } from '../../routes/cover/[slug]/+page.server'; +import { render } from "@testing-library/svelte"; +import { describe, it } from "vitest"; +import type { Cover } from "../../routes/cover/[slug]/+page.server"; +import CoverComparison from "./CoverComparison.svelte"; const mockCover: Cover = { original: { - created_at: '2023-10-22 00:40:29.317184+00', - id: '7rWgGyRK7RAqAAXy4bLft9', - name: 'Angeleyes', - artists: ['ABBA'], - album_name: 'Voulez-Vous', + created_at: "2023-10-22 00:40:29.317184+00", + id: "7rWgGyRK7RAqAAXy4bLft9", + name: "Angeleyes", + artists: ["ABBA"], + album_name: "Voulez-Vous", album_year: 1979, album_img: [ - 'https://i.scdn.co/image/ab67616d0000b273aa22899360d8ba6704732dec', - 'https://i.scdn.co/image/ab67616d00001e02aa22899360d8ba6704732dec', - 'https://i.scdn.co/image/ab67616d00004851aa22899360d8ba6704732dec' + "https://i.scdn.co/image/ab67616d0000b273aa22899360d8ba6704732dec", + "https://i.scdn.co/image/ab67616d00001e02aa22899360d8ba6704732dec", + "https://i.scdn.co/image/ab67616d00004851aa22899360d8ba6704732dec", ], - url: 'https://open.spotify.com/track/7rWgGyRK7RAqAAXy4bLft9', - gender: ['female'], + url: "https://open.spotify.com/track/7rWgGyRK7RAqAAXy4bLft9", + gender: ["female"], acousticness: 0.523, danceability: 0.719, duration_ms: 260893, @@ -30,22 +30,22 @@ const mockCover: Cover = { speechiness: 0.0338, tempo: 133.113, time_signature: 4, - valence: 0.964 + valence: 0.964, }, cover: { - created_at: '2023-10-22 00:40:29.530622+00', - id: '7rWgGyRK7RAqAAXy4bLft9', - name: 'Angel Eyes', - artists: ['The Czars'], - album_name: 'Best Of', + created_at: "2023-10-22 00:40:29.530622+00", + id: "7rWgGyRK7RAqAAXy4bLft9", + name: "Angel Eyes", + artists: ["The Czars"], + album_name: "Best Of", album_year: 2014, album_img: [ - 'https://i.scdn.co/image/ab67616d0000b27339fea69e3e036d36e1751279', - 'https://i.scdn.co/image/ab67616d00001e0239fea69e3e036d36e1751279', - 'https://i.scdn.co/image/ab67616d0000485139fea69e3e036d36e1751279' + "https://i.scdn.co/image/ab67616d0000b27339fea69e3e036d36e1751279", + "https://i.scdn.co/image/ab67616d00001e0239fea69e3e036d36e1751279", + "https://i.scdn.co/image/ab67616d0000485139fea69e3e036d36e1751279", ], - url: 'https://open.spotify.com/track/4OeGiA4EexvQMwEbuHyFG7', - gender: ['male'], + url: "https://open.spotify.com/track/4OeGiA4EexvQMwEbuHyFG7", + gender: ["male"], acousticness: 0.84, danceability: 0.717, duration_ms: 286674, @@ -58,46 +58,60 @@ const mockCover: Cover = { speechiness: 0.029, tempo: 98.083, time_signature: 4, - valence: 0.421 + valence: 0.421, }, - created_at: '2023-10-22 00:40:29.659396+00', - description: 'Classic ABBA pop melts into acoustic-led gay heartbreak.', - contributor: 'Eva', - tags: ['energy_down', 'transition_ftm', 'valence_down', 'years_apart_30'] + created_at: "2023-10-22 00:40:29.659396+00", + description: "Classic ABBA pop melts into acoustic-led gay heartbreak.", + contributor: "Eva", + tags: ["energy_down", "transition_ftm", "valence_down", "years_apart_30"], }; -describe('CoverComparison', async () => { - it('should render the cover comparison', async ({ expect }) => { - const { container } = render(CoverComparison, { props: { cover: mockCover } }); - const comparison = container.querySelector('.compare'); +describe("CoverComparison", async () => { + it("should render the cover comparison", async ({ expect }) => { + const { container } = render(CoverComparison, { + props: { cover: mockCover }, + }); + const comparison = container.querySelector(".compare"); expect(comparison).toBeDefined(); }); - it('should render album art for original and cover', async ({ expect }) => { - const { container } = render(CoverComparison, { props: { cover: mockCover } }); - const albumArt = container.querySelectorAll('.album-art'); + it("should render album art for original and cover", async ({ expect }) => { + const { container } = render(CoverComparison, { + props: { cover: mockCover }, + }); + const albumArt = container.querySelectorAll(".album-art"); expect(albumArt.length).toBe(2); }); - it('should render links to listen to original and cover', async ({ expect }) => { - const { container } = render(CoverComparison, { props: { cover: mockCover } }); - const links = container.querySelectorAll('.song-link'); + it("should render links to listen to original and cover", async ({ + expect, + }) => { + const { container } = render(CoverComparison, { + props: { cover: mockCover }, + }); + const links = container.querySelectorAll(".song-link"); expect(links).toBeDefined(); expect(links.length).toBe(2); }); - it('should link artists to a filtered search', async ({ expect }) => { - const { container } = render(CoverComparison, { props: { cover: mockCover } }); - const artists = container.querySelectorAll('.artist'); - const originalLink = artists[0].querySelector('a'); - expect(originalLink?.getAttribute('href')).toBe('/?q=ABBA'); - const coverLink = artists[1].querySelector('a'); - expect(coverLink?.getAttribute('href')).toBe('/?q=The%20Czars'); + it("should link artists to a filtered search", async ({ expect }) => { + const { container } = render(CoverComparison, { + props: { cover: mockCover }, + }); + const artists = container.querySelectorAll(".artist"); + const originalLink = artists[0].querySelector("a"); + expect(originalLink?.getAttribute("href")).toBe("/?q=ABBA"); + const coverLink = artists[1].querySelector("a"); + expect(coverLink?.getAttribute("href")).toBe("/?q=The%20Czars"); }); - it('should render "covered as" when the titles differ', async ({ expect }) => { - const { container } = render(CoverComparison, { props: { cover: mockCover } }); - const coveredAs = container.querySelector('.covered-as'); + it('should render "covered as" when the titles differ', async ({ + expect, + }) => { + const { container } = render(CoverComparison, { + props: { cover: mockCover }, + }); + const coveredAs = container.querySelector(".covered-as"); expect(coveredAs).toBeDefined(); expect(coveredAs?.textContent).toBe(`Covered as ${mockCover.cover.name}`); }); diff --git a/src/lib/components/ErrorMessage.svelte b/src/lib/components/ErrorMessage.svelte index 1185e34..d9b635d 100644 --- a/src/lib/components/ErrorMessage.svelte +++ b/src/lib/components/ErrorMessage.svelte @@ -1,8 +1,8 @@
diff --git a/src/lib/components/ErrorMessage.test.ts b/src/lib/components/ErrorMessage.test.ts index bca0da2..360c2ab 100644 --- a/src/lib/components/ErrorMessage.test.ts +++ b/src/lib/components/ErrorMessage.test.ts @@ -1,23 +1,27 @@ -import { render } from '@testing-library/svelte'; -import ErrorMessage from './ErrorMessage.svelte'; -import { describe, it } from 'vitest'; +import { render } from "@testing-library/svelte"; +import { describe, it } from "vitest"; +import ErrorMessage from "./ErrorMessage.svelte"; -describe('ErrorMessage', async () => { - it('should render the error', async ({ expect }) => { +describe("ErrorMessage", async () => { + it("should render the error", async ({ expect }) => { const { container } = render(ErrorMessage); - const error = container.querySelector('.error'); + const error = container.querySelector(".error"); expect(error).toBeDefined(); }); - it('should display an icon', async ({ expect }) => { + it("should display an icon", async ({ expect }) => { const { container } = render(ErrorMessage); - const icon = container.querySelector('svg'); + const icon = container.querySelector("svg"); expect(icon).toBeDefined(); }); - it('should apply the `banner` class when the prop is set', async ({ expect }) => { - const { container } = render(ErrorMessage, { props: { error: 'Oops!', banner: true } }); - const error = container.querySelector('.error'); - expect(error?.classList).toContain('banner'); + it("should apply the `banner` class when the prop is set", async ({ + expect, + }) => { + const { container } = render(ErrorMessage, { + props: { error: "Oops!", banner: true }, + }); + const error = container.querySelector(".error"); + expect(error?.classList).toContain("banner"); }); }); diff --git a/src/lib/components/Footer.svelte b/src/lib/components/Footer.svelte index 06d650c..cbbcefa 100644 --- a/src/lib/components/Footer.svelte +++ b/src/lib/components/Footer.svelte @@ -1,7 +1,7 @@ @@ -152,7 +163,7 @@ .artist { color: var(--mauve-12); - @media (hover: hover) { + @media (hover: hover) { &:hover { text-decoration: underline; text-decoration-color: var(--mauve-9); diff --git a/src/routes/cover/[slug]/og.png/+server.ts b/src/routes/cover/[slug]/og.png/+server.ts index 4338edc..415f26b 100644 --- a/src/routes/cover/[slug]/og.png/+server.ts +++ b/src/routes/cover/[slug]/og.png/+server.ts @@ -1,29 +1,29 @@ -import satori from 'satori'; -import sharp from 'sharp'; -import { supabase } from '$lib/supabase'; -import { getReadableTitle, getSortedTags } from '$lib/helpers'; -import type { Cover } from '../+page.server'; -import { TAGS, ORDERED_TAG_GROUPS } from '$lib/constants'; +import { ORDERED_TAG_GROUPS, TAGS } from "$lib/constants"; +import { getReadableTitle, getSortedTags } from "$lib/helpers"; +import { supabase } from "$lib/supabase"; +import satori from "satori"; +import sharp from "sharp"; +import type { Cover } from "../+page.server"; export async function GET({ params, url }) { const { slug } = params; const { data } = await supabase - .from('covers') + .from("covers") .select( ` original:original_id(name, artists, album_img), cover:cover_id(name, artists, album_img), - tags` + tags`, ) - .eq('slug', slug!!) + .eq("slug", slug) .returns() .single(); if (!data) { return new Response(null, { status: 404, - statusText: 'Not found' + statusText: "Not found", }); } @@ -34,9 +34,9 @@ export async function GET({ params, url }) { ? getReadableTitle({ originalName: original.name, originalArtists: original.artists, - coverArtists: cover.artists + coverArtists: cover.artists, }) - : 'A cover on Genderswap.fm'; + : "A cover on Genderswap.fm"; const displayTags = getSortedTags(tags) .slice(0, 4) @@ -44,186 +44,187 @@ export async function GET({ params, url }) { tags.length > 4 ? displayTags.push(`+${tags.length - 4}`) : null; const albumBoxShadow = - '0px 2.7px 3.6px rgba(0, 0, 0, 0.024), 0px 7.5px 10px rgba(0, 0, 0, 0.035), 0px 18.1px 24.1px rgba(0, 0, 0, 0.046), 0px 60px 80px rgba(0, 0, 0, 0.07)'; + "0px 2.7px 3.6px rgba(0, 0, 0, 0.024), 0px 7.5px 10px rgba(0, 0, 0, 0.035), 0px 18.1px 24.1px rgba(0, 0, 0, 0.046), 0px 60px 80px rgba(0, 0, 0, 0.07)"; const html = { - type: 'div', + type: "div", props: { style: { - height: '100%', - width: '100%', - display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', - justifyContent: 'space-between', - backgroundColor: '#FDFCFD', - fontFamily: 'Labil Grotesk', - color: '#211F26', - fontSize: '32px', - padding: '48px 60px' + height: "100%", + width: "100%", + display: "flex", + flexDirection: "column", + alignItems: "flex-start", + justifyContent: "space-between", + backgroundColor: "#FDFCFD", + fontFamily: "Labil Grotesk", + color: "#211F26", + fontSize: "32px", + padding: "48px 60px", }, children: [ { - type: 'div', + type: "div", props: { style: { - display: 'flex', - alignItems: 'flex-start' + display: "flex", + alignItems: "flex-start", }, children: [ { - type: 'div', + type: "div", props: { style: { - display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', - width: '55%', - paddingRight: '24px' + display: "flex", + flexDirection: "column", + alignItems: "flex-start", + width: "55%", + paddingRight: "24px", }, children: [ { - type: 'div', + type: "div", props: { style: { fontSize: title.length > 70 - ? '56px' + ? "56px" : title.length > 50 - ? '64px' - : title.length > 30 - ? '72px' - : '80px', + ? "64px" + : title.length > 30 + ? "72px" + : "80px", fontWeight: 700, - lineHeight: 1 + lineHeight: 1, }, - children: title - } - } - ] - } + children: title, + }, + }, + ], + }, }, { - type: 'div', + type: "div", props: { style: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - marginTop: '32px', - width: '40%' + display: "flex", + alignItems: "center", + justifyContent: "center", + marginTop: "32px", + width: "40%", }, children: [ { - type: 'img', + type: "img", props: { src: original.album_img[0], - width: '340', - height: '340', + width: "340", + height: "340", style: { - borderRadius: '6px', + borderRadius: "6px", boxShadow: albumBoxShadow, - objectFit: 'cover', - transform: 'rotate(-6deg) scale(0.9) translateX(132px) translateY(-16px)' - } - } + objectFit: "cover", + transform: + "rotate(-6deg) scale(0.9) translateX(132px) translateY(-16px)", + }, + }, }, { - type: 'img', + type: "img", props: { src: cover.album_img[0], - width: '340', - height: '340', + width: "340", + height: "340", style: { - borderRadius: '8px', + borderRadius: "8px", boxShadow: albumBoxShadow, - objectFit: 'cover', - transform: 'rotate(6deg) scale(1.1)' - } - } - } - ] - } - } - ] - } + objectFit: "cover", + transform: "rotate(6deg) scale(1.1)", + }, + }, + }, + ], + }, + }, + ], + }, }, { - type: 'div', + type: "div", props: { style: { - display: 'flex', - alignItems: 'center', - justifyContent: 'space-between', - width: '100%' + display: "flex", + alignItems: "center", + justifyContent: "space-between", + width: "100%", }, children: [ { - type: 'div', + type: "div", props: { style: { - display: 'flex', - gap: '8px' + display: "flex", + gap: "8px", }, children: displayTags.map((tag) => ({ - type: 'div', + type: "div", props: { style: { - backgroundColor: '#F2EFF3', - padding: '6px 16px 9px 16px', - borderRadius: '12px', - fontSize: '28px', + backgroundColor: "#F2EFF3", + padding: "6px 16px 9px 16px", + borderRadius: "12px", + fontSize: "28px", lineHeight: 1.2, - color: '#65636D' + color: "#65636D", }, - children: tag - } - })) - } + children: tag, + }, + })), + }, }, { - type: 'img', + type: "img", props: { - src: 'data:image/png;base64,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', - width: '168', - height: '96', + src: "data:image/png;base64,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", + width: "168", + height: "96", style: { - marginRight: '-8px' - } - } - } - ] - } - } - ] - } + marginRight: "-8px", + }, + }, + }, + ], + }, + }, + ], + }, }; - const labil = await fetch(new URL('/fonts/LabilGrotesk-Regular.woff', url)).then((res) => - res.arrayBuffer() - ); + const labil = await fetch( + new URL("/fonts/LabilGrotesk-Regular.woff", url), + ).then((res) => res.arrayBuffer()); - const labilBold = await fetch(new URL('/fonts/LabilGrotesk-Bold.woff', url)).then((res) => - res.arrayBuffer() - ); + const labilBold = await fetch( + new URL("/fonts/LabilGrotesk-Bold.woff", url), + ).then((res) => res.arrayBuffer()); const svg = await satori(html, { width: 1200, height: 630, fonts: [ { - name: 'Labil Grotesk', + name: "Labil Grotesk", data: labil, - style: 'normal', - weight: 400 + style: "normal", + weight: 400, }, { - name: 'Labil Grotesk', + name: "Labil Grotesk", data: labilBold, - style: 'normal', - weight: 700 - } - ] + style: "normal", + weight: 700, + }, + ], }); const png = sharp(Buffer.from(svg)).png(); @@ -232,7 +233,7 @@ export async function GET({ params, url }) { return new Response(response, { status: 200, headers: { - 'Content-Type': 'image/png' - } + "Content-Type": "image/png", + }, }); } diff --git a/src/routes/new/+page.server.ts b/src/routes/new/+page.server.ts index c63b638..0dd7cff 100644 --- a/src/routes/new/+page.server.ts +++ b/src/routes/new/+page.server.ts @@ -1,11 +1,11 @@ -import type { Track } from '@spotify/web-api-ts-sdk'; -import type { Enums, Tables } from '$lib/types/types'; -import { setError, superValidate } from 'sveltekit-superforms'; -import { zod } from 'sveltekit-superforms/adapters'; -import { fail, redirect } from '@sveltejs/kit'; -import { supabase } from '$lib/supabase'; -import { slugifyCover } from '$lib/helpers'; -import { newCoverSchema } from '$lib/schemas'; +import { slugifyCover } from "$lib/helpers"; +import { newCoverSchema } from "$lib/schemas"; +import { supabase } from "$lib/supabase"; +import type { Enums, Tables } from "$lib/types/types"; +import type { Track } from "@spotify/web-api-ts-sdk"; +import { fail, redirect } from "@sveltejs/kit"; +import { setError, superValidate } from "sveltekit-superforms"; +import { zod } from "sveltekit-superforms/adapters"; export const load = async () => { const form = await superValidate(zod(newCoverSchema)); @@ -21,25 +21,35 @@ export const actions = { return fail(400, { form }); } - const { original, originalGenders, cover, coverGenders, description, contributor } = form.data; + const { + original, + originalGenders, + cover, + coverGenders, + description, + contributor, + } = form.data; - const formatSongRow = async ({ song, gender }: { song: Track; gender: Enums<'gender'>[] }) => { + const formatSongRow = async ({ + song, + gender, + }: { song: Track; gender: Enums<"gender">[] }) => { const response = await fetch(`/api/getAudioFeatures?id=${song.id}`, { - method: 'GET' + method: "GET", }); const audioFeatures = await response.json(); const formattedName = song.name - .split(' - ')[0] // "Smells Like Teen Spirit - Radio Edit" -> "Smells Like Teen Spirit" - .replace(/\s\([^()]*\)/g, ''); // "Time After Time (2022 Remaster)" -> "Time After Time" + .split(" - ")[0] // "Smells Like Teen Spirit - Radio Edit" -> "Smells Like Teen Spirit" + .replace(/\s\([^()]*\)/g, ""); // "Time After Time (2022 Remaster)" -> "Time After Time" - const row: Omit, 'created_at'> = { + const row: Omit, "created_at"> = { id: song.id, name: formattedName, artists: song.artists.map((artist) => artist.name), url: song.external_urls.spotify, album_name: song.album.name, - album_year: parseInt(song.album.release_date.slice(0, 4)), + album_year: Number.parseInt(song.album.release_date.slice(0, 4)), album_img: song.album.images.map((image) => image.url), gender: gender, acousticness: audioFeatures.acousticness, @@ -54,7 +64,7 @@ export const actions = { speechiness: audioFeatures.speechiness, tempo: audioFeatures.tempo, time_signature: audioFeatures.time_signature, - valence: audioFeatures.valence + valence: audioFeatures.valence, }; return row; @@ -64,53 +74,57 @@ export const actions = { original, cover, description, - contributor + contributor, }: { original: Track; cover: Track; description: string; contributor: string; }) => { - const row: Omit, 'id' | 'created_at' | 'tags'> = { + const row: Omit, "id" | "created_at" | "tags"> = { original_id: original.id, cover_id: cover.id, slug: slugifyCover(cover.name, cover.artists[0].name), description, - contributor + contributor, }; return row; }; // Shape track data for submission to the 'songs' table - const originalSongRow = await formatSongRow({ song: original, gender: originalGenders }); + const originalSongRow = await formatSongRow({ + song: original, + gender: originalGenders, + }); // Check if original already exists const { data: existingOriginal } = await supabase - .from('songs') - .select('id') - .eq('id', originalSongRow.id) + .from("songs") + .select("id") + .eq("id", originalSongRow.id) .single(); // If it doesn't exist, insert it if (originalSongRow && !existingOriginal) { - const { error } = await supabase.from('songs').insert(originalSongRow); + const { error } = await supabase.from("songs").insert(originalSongRow); if (error) setError(form, error.message); } // Shape cover data for submission to the 'songs' table - const coverSongRow = cover && (await formatSongRow({ song: cover, gender: coverGenders })); + const coverSongRow = + cover && (await formatSongRow({ song: cover, gender: coverGenders })); // Check if cover already exists const { data: existingCover } = await supabase - .from('songs') - .select('id') - .eq('id', coverSongRow.id) + .from("songs") + .select("id") + .eq("id", coverSongRow.id) .single(); // If it doesn't exist, insert it if (coverSongRow && !existingCover) { - const { error } = await supabase.from('songs').insert(coverSongRow); + const { error } = await supabase.from("songs").insert(coverSongRow); if (error) setError(form, error.message); } @@ -120,14 +134,14 @@ export const actions = { original, cover, description, - contributor + contributor, }); if (coverRow) { const { data, error } = await supabase - .from('covers') + .from("covers") .insert(coverRow) - .select('slug') + .select("slug") .single(); error && setError(form, error.message); @@ -138,5 +152,5 @@ export const actions = { } return { form }; - } + }, }; diff --git a/src/routes/new/+page.svelte b/src/routes/new/+page.svelte index 7aae84f..e1a290d 100644 --- a/src/routes/new/+page.svelte +++ b/src/routes/new/+page.svelte @@ -1,56 +1,59 @@ Add a cover - + @@ -58,7 +61,11 @@

Add a cover

- + - +
- Genderswap.fm is for gender-swapped covers. Same-gender - covers will be hidden by default. + Genderswap.fm is for gender-swapped covers. Same-gender covers will be hidden by default.
{/if} @@ -103,9 +115,13 @@ />
MAX_DESCRIPTION_CHARS} + class:warning={$form.description && + $form.description.length > MAX_DESCRIPTION_CHARS} > - {getMaxCharacterHelpText($form.description ?? '', MAX_DESCRIPTION_CHARS)} + {getMaxCharacterHelpText( + $form.description ?? "", + MAX_DESCRIPTION_CHARS + )}