diff --git a/.eslintrc.cjs b/.eslintrc.cjs index fd02bb16..baa91a30 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,27 +1,27 @@ module.exports = { - root: true, - parser: "@typescript-eslint/parser", - extends: ["plugin:svelte/recommended"], - plugins: ["@typescript-eslint"], - ignorePatterns: ["*.cjs", "*.config.js"], - overrides: [ - { - files: ["*.svelte"], - parser: "svelte-eslint-parser", - parserOptions: { - parser: "@typescript-eslint/parser" - } - } - ], - parserOptions: { - project: "./tsconfig.json", - extraFileExtensions: [".svelte"], - sourceType: "module", - ecmaVersion: 2020 - }, - env: { - browser: true, - es2017: true, - node: false - } + root: true, + parser: "@typescript-eslint/parser", + extends: ["plugin:svelte/recommended"], + plugins: ["@typescript-eslint"], + ignorePatterns: ["*.cjs", "*.config.js"], + overrides: [ + { + files: ["*.svelte"], + parser: "svelte-eslint-parser", + parserOptions: { + parser: "@typescript-eslint/parser", + }, + }, + ], + parserOptions: { + project: "./tsconfig.json", + extraFileExtensions: [".svelte"], + sourceType: "module", + ecmaVersion: 2020, + }, + env: { + browser: true, + es2017: true, + node: false, + }, }; diff --git a/.prettierignore b/.prettierignore index 38972655..6e2559f8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,6 +6,10 @@ node_modules .env .env.* !.env.example +/.vscode + +doc/.docusaurus/ +doc/build/ # Ignore files for PNPM, NPM and YARN pnpm-lock.yaml diff --git a/.prettierrc b/.prettierrc index fcae1e18..c73d4809 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,18 +1,18 @@ { - "tabWidth": 2, - "semi": true, - "singleQuote": false, - "printWidth": 100, - "useTabs": false, - "trailingComma": "none", - "arrowParens": "always", - "plugins": ["prettier-plugin-svelte"], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] + "tabWidth": 2, + "semi": true, + "singleQuote": false, + "printWidth": 80, + "useTabs": true, + "trailingComma": "all", + "arrowParens": "always", + "plugins": ["prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index e972b423..fa41044f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,15 +1,15 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Launch Package", - "type": "go", - "request": "launch", - "mode": "auto", - "program": "${fileDirname}" - } - ] + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${fileDirname}" + } + ] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..e46111f1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.insertSpaces": false +} \ No newline at end of file diff --git a/doc/babel.config.js b/doc/babel.config.js index df99bdba..f8c7bb99 100644 --- a/doc/babel.config.js +++ b/doc/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: [require.resolve("@docusaurus/core/lib/babel/preset")] + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], }; diff --git a/doc/docs/importing/_category_.json b/doc/docs/importing/_category_.json index 6ad9cf4f..fd05ca14 100644 --- a/doc/docs/importing/_category_.json +++ b/doc/docs/importing/_category_.json @@ -1,8 +1,8 @@ { - "label": "Importing", - "position": 3, - "link": { - "type": "generated-index", - "description": "Guides for importing your data from other services." - } + "label": "Importing", + "position": 3, + "link": { + "type": "generated-index", + "description": "Guides for importing your data from other services." + } } diff --git a/doc/docs/installation/_category_.json b/doc/docs/installation/_category_.json index 9810f0ba..69b5e94e 100644 --- a/doc/docs/installation/_category_.json +++ b/doc/docs/installation/_category_.json @@ -1,8 +1,8 @@ { - "label": "Installation", - "position": 2, - "link": { - "type": "generated-index", - "description": "Choose how you would like to install Watcharr." - } + "label": "Installation", + "position": 2, + "link": { + "type": "generated-index", + "description": "Choose how you would like to install Watcharr." + } } diff --git a/doc/docs/server_config/_category_.json b/doc/docs/server_config/_category_.json index 627a4c1f..4ad2d5e8 100644 --- a/doc/docs/server_config/_category_.json +++ b/doc/docs/server_config/_category_.json @@ -1,8 +1,8 @@ { - "label": "Server Configuration", - "position": 2, - "link": { - "type": "generated-index", - "description": "Learn how to configure your server." - } + "label": "Server Configuration", + "position": 2, + "link": { + "type": "generated-index", + "description": "Learn how to configure your server." + } } diff --git a/doc/docs/usage/_category_.json b/doc/docs/usage/_category_.json index d8a4eb7e..b9760325 100644 --- a/doc/docs/usage/_category_.json +++ b/doc/docs/usage/_category_.json @@ -1,8 +1,8 @@ { - "label": "Usage", - "position": 3, - "link": { - "type": "generated-index", - "description": "Hopefully Watcharr is easy enough to get started with and use, but incase you are stuck, one of these usage guides may help." - } + "label": "Usage", + "position": 3, + "link": { + "type": "generated-index", + "description": "Hopefully Watcharr is easy enough to get started with and use, but incase you are stuck, one of these usage guides may help." + } } diff --git a/doc/docusaurus.config.js b/doc/docusaurus.config.js index 2cefc90b..a70bb3d9 100644 --- a/doc/docusaurus.config.js +++ b/doc/docusaurus.config.js @@ -7,104 +7,104 @@ const darkTheme = themes.dracula; /** @type {import('@docusaurus/types').Config} */ const config = { - title: "Watcharr Docs", - tagline: - "Open source, self-hostable watched list for all your content with user authentication, modern and clean UI and a very simple setup. ", - favicon: "img/favicon.png", + title: "Watcharr Docs", + tagline: + "Open source, self-hostable watched list for all your content with user authentication, modern and clean UI and a very simple setup. ", + favicon: "img/favicon.png", - // Set the production url of your site here - url: "https://watcharr.app", - // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' - baseUrl: "/", + // Set the production url of your site here + url: "https://watcharr.app", + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: "/", - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: "sbondCo", // Usually your GitHub org/user name. - projectName: "Watcharr", // Usually your repo name. + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: "sbondCo", // Usually your GitHub org/user name. + projectName: "Watcharr", // Usually your repo name. - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "warn", + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", - trailingSlash: false, + trailingSlash: false, - // Even if you don't use internalization, you can use this field to set useful - // metadata like html lang. For example, if your site is Chinese, you may want - // to replace "en" with "zh-Hans". - i18n: { - defaultLocale: "en", - locales: ["en"] - }, + // Even if you don't use internalization, you can use this field to set useful + // metadata like html lang. For example, if your site is Chinese, you may want + // to replace "en" with "zh-Hans". + i18n: { + defaultLocale: "en", + locales: ["en"], + }, - presets: [ - [ - "classic", - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - sidebarPath: require.resolve("./sidebars.js"), - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - editUrl: "/~https://github.com/sbondCo/Watcharr/tree/dev/doc" - }, - blog: { - showReadingTime: true, - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - editUrl: "/~https://github.com/sbondCo/Watcharr/tree/dev/doc" - }, - theme: { - customCss: [ - "./node_modules/viewerjs/dist/viewer.css", - require.resolve("./src/css/custom.css") - ] - } - }) - ] - ], + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: require.resolve("./sidebars.js"), + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: "/~https://github.com/sbondCo/Watcharr/tree/dev/doc", + }, + blog: { + showReadingTime: true, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: "/~https://github.com/sbondCo/Watcharr/tree/dev/doc", + }, + theme: { + customCss: [ + "./node_modules/viewerjs/dist/viewer.css", + require.resolve("./src/css/custom.css"), + ], + }, + }), + ], + ], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - image: "img/social-card.png", - navbar: { - title: "Watcharr", - logo: { - alt: "Watcharr Logo", - src: "img/favicon.png" - }, - items: [ - { - type: "docSidebar", - sidebarId: "tutorialSidebar", - position: "left", - label: "Docs" - }, - { - type: "docsVersionDropdown" - }, - { - href: "https://beta.watcharr.app", - label: "Demo", - position: "right" - }, - { - href: "/~https://github.com/sbondCo/Watcharr", - label: "GitHub", - position: "right" - } - ] - }, - prism: { - theme: lightTheme, - darkTheme: darkTheme - }, - colorMode: { - defaultMode: "light", - // Dark theme currently disabled.. no time to fix the icons etc. - disableSwitch: true - } - }) + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + image: "img/social-card.png", + navbar: { + title: "Watcharr", + logo: { + alt: "Watcharr Logo", + src: "img/favicon.png", + }, + items: [ + { + type: "docSidebar", + sidebarId: "tutorialSidebar", + position: "left", + label: "Docs", + }, + { + type: "docsVersionDropdown", + }, + { + href: "https://beta.watcharr.app", + label: "Demo", + position: "right", + }, + { + href: "/~https://github.com/sbondCo/Watcharr", + label: "GitHub", + position: "right", + }, + ], + }, + prism: { + theme: lightTheme, + darkTheme: darkTheme, + }, + colorMode: { + defaultMode: "light", + // Dark theme currently disabled.. no time to fix the icons etc. + disableSwitch: true, + }, + }), }; module.exports = config; diff --git a/doc/package.json b/doc/package.json index eec9b529..4d450d0c 100644 --- a/doc/package.json +++ b/doc/package.json @@ -1,44 +1,44 @@ { - "name": "watcharr-doc", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" - }, - "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/preset-classic": "3.1.1", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.1.0", - "prism-react-renderer": "^2.3.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "viewerjs": "^1.11.6" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "3.1.1" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "engines": { - "node": ">=18.0" - } + "name": "watcharr-doc", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/preset-classic": "3.1.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.1.0", + "prism-react-renderer": "^2.3.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "viewerjs": "^1.11.6" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.1.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } } diff --git a/doc/sidebars.js b/doc/sidebars.js index 7c8fa787..329bc003 100644 --- a/doc/sidebars.js +++ b/doc/sidebars.js @@ -13,11 +13,11 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - tutorialSidebar: [{ type: "autogenerated", dirName: "." }] + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [{ type: "autogenerated", dirName: "." }], - // But you can create a sidebar manually - /* + // But you can create a sidebar manually + /* tutorialSidebar: [ 'intro', 'hello', diff --git a/doc/src/components/HomepageFeatures/index.js b/doc/src/components/HomepageFeatures/index.js index 97f0a95f..9e302f07 100644 --- a/doc/src/components/HomepageFeatures/index.js +++ b/doc/src/components/HomepageFeatures/index.js @@ -3,59 +3,62 @@ import clsx from "clsx"; import styles from "./styles.module.css"; const FeatureList = [ - { - title: "Free and Open", - Svg: require("@site/static/img/icon/code-slash.svg").default, - description: ( - <> - Watcharr is free and open source software distributed under the MIT license. Feel free to - browse, modify or contribute! - - ) - }, - { - title: "Simple", - Svg: require("@site/static/img/icon/happy.svg").default, - description: ( - <> - Watcharr is incredibly easy to dive into. Install without hassle and get started with the - seamless and intuitive user experience. - - ) - }, - { - title: "Built With Go and Svelte", - Svg: require("@site/static/img/icon/go.svg").default, - description: ( - <>Don't know what else to add here, so now you know Watcharr is built with Go and Svelte. - ) - } + { + title: "Free and Open", + Svg: require("@site/static/img/icon/code-slash.svg").default, + description: ( + <> + Watcharr is free and open source software distributed under the MIT + license. Feel free to browse, modify or contribute! + + ), + }, + { + title: "Simple", + Svg: require("@site/static/img/icon/happy.svg").default, + description: ( + <> + Watcharr is incredibly easy to dive into. Install without hassle and get + started with the seamless and intuitive user experience. + + ), + }, + { + title: "Built With Go and Svelte", + Svg: require("@site/static/img/icon/go.svg").default, + description: ( + <> + Don't know what else to add here, so now you know Watcharr is built with + Go and Svelte. + + ), + }, ]; function Feature({ Svg, title, description }) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); } export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); } diff --git a/doc/src/components/HomepageFeatures/styles.module.css b/doc/src/components/HomepageFeatures/styles.module.css index b248eb2e..774404de 100644 --- a/doc/src/components/HomepageFeatures/styles.module.css +++ b/doc/src/components/HomepageFeatures/styles.module.css @@ -1,11 +1,11 @@ .features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; } .featureSvg { - height: 200px; - width: 200px; + height: 200px; + width: 200px; } diff --git a/doc/src/components/TwoColFeat/index.js b/doc/src/components/TwoColFeat/index.js index 236fb2db..5b4cd697 100644 --- a/doc/src/components/TwoColFeat/index.js +++ b/doc/src/components/TwoColFeat/index.js @@ -4,68 +4,68 @@ import clsx from "clsx"; import Viewer from "viewerjs"; function TwoColFeat({ title, description, imgSrc }) { - return ( -
-
-

{title}

-

{description}

-
-
- -
-
- ); + return ( +
+
+

{title}

+

{description}

+
+
+ +
+
+ ); } export function HomepageTwoColFeats() { - useEffect(() => { - const ctr = document.getElementById("homepage-two-col-feats"); - console.debug("Starting image viewer", ctr); - new Viewer(ctr, { - navbar: 0, - toolbar: { - zoomIn: 2, - zoomOut: 2, - next: 2, - prev: 2 - }, - title: 0, - className: "twoColViewer" - }); - }, []); + useEffect(() => { + const ctr = document.getElementById("homepage-two-col-feats"); + console.debug("Starting image viewer", ctr); + new Viewer(ctr, { + navbar: 0, + toolbar: { + zoomIn: 2, + zoomOut: 2, + next: 2, + prev: 2, + }, + title: 0, + className: "twoColViewer", + }); + }, []); - return ( -
- - - - - - -
- ); + return ( +
+ + + + + + +
+ ); } diff --git a/doc/src/components/TwoColFeat/styles.module.css b/doc/src/components/TwoColFeat/styles.module.css index f322d9cf..186faf93 100644 --- a/doc/src/components/TwoColFeat/styles.module.css +++ b/doc/src/components/TwoColFeat/styles.module.css @@ -1,53 +1,53 @@ .twoColFeats { - display: flex; - align-items: center; - margin-left: auto; - margin-right: auto; - flex-flow: column; - width: 100%; - max-width: 1300px; + display: flex; + align-items: center; + margin-left: auto; + margin-right: auto; + flex-flow: column; + width: 100%; + max-width: 1300px; } .twoCol { - display: flex; - flex-flow: row; - width: 100%; - padding: 2.5rem 5rem; - gap: 50px; - background-color: rgb(236, 236, 236); + display: flex; + flex-flow: row; + width: 100%; + padding: 2.5rem 5rem; + gap: 50px; + background-color: rgb(236, 236, 236); } .twoCol:nth-child(even) { - flex-flow: row-reverse; - background-color: transparent; + flex-flow: row-reverse; + background-color: transparent; } .twoCol > div { - width: 50%; - display: flex; - align-items: center; - justify-content: center; - flex-flow: column; + width: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-flow: column; } .twoCol > div > img { - width: 100%; - border-radius: 12px; - box-shadow: 0px 0px 5px rgb(121, 121, 121); - cursor: pointer; + width: 100%; + border-radius: 12px; + box-shadow: 0px 0px 5px rgb(121, 121, 121); + cursor: pointer; } @media screen and (max-width: 850px) { - .twoCol, - .twoCol:nth-child(even) { - flex-flow: column; - } + .twoCol, + .twoCol:nth-child(even) { + flex-flow: column; + } - .twoCol > div { - width: 100%; - } + .twoCol > div { + width: 100%; + } - .twoCol > div > img { - max-width: 500px; - } + .twoCol > div > img { + max-width: 500px; + } } diff --git a/doc/src/css/custom.css b/doc/src/css/custom.css index 4da18676..39754c2f 100644 --- a/doc/src/css/custom.css +++ b/doc/src/css/custom.css @@ -6,39 +6,39 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #2e8555; - --ifm-color-primary-dark: #29784c; - --ifm-color-primary-darker: #277148; - --ifm-color-primary-darkest: #205d3b; - --ifm-color-primary-light: #33925d; - --ifm-color-primary-lighter: #359962; - --ifm-color-primary-lightest: #3cad6e; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + --ifm-color-primary: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); } /* For readability concerns, you should choose a lighter palette in dark mode. */ [data-theme="dark"] { - --ifm-color-primary: #25c2a0; - --ifm-color-primary-dark: #21af90; - --ifm-color-primary-darker: #1fa588; - --ifm-color-primary-darkest: #1a8870; - --ifm-color-primary-light: #29d5b0; - --ifm-color-primary-lighter: #32d8b4; - --ifm-color-primary-lightest: #4fddbf; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } .twoColViewer .viewer-close { - right: 10px; - top: 10px; - width: 50px; - height: 50px; + right: 10px; + top: 10px; + width: 50px; + height: 50px; } /* Stupid poopin fix for viewerjs because whatever is bundling the css isn't keeping the order of this correctly. All this time wasted and it was just opaque ;( BUT ONLY IN THE BUILD AAAAAAAAAAAAAAAAAAAAAA */ .viewer-in { - opacity: 1 !important; + opacity: 1 !important; } diff --git a/doc/src/pages/index.js b/doc/src/pages/index.js index 4fd46d58..a8f7b0e2 100644 --- a/doc/src/pages/index.js +++ b/doc/src/pages/index.js @@ -10,44 +10,47 @@ import clsx from "clsx"; import { HomepageTwoColFeats } from "../components/TwoColFeat"; function HomepageHeader() { - const { siteConfig } = useDocusaurusContext(); - return ( -
-
-
- -

{siteConfig.title}

-

{siteConfig.tagline}

-
- - Get Started - - - Demo - -
-
-
-
- ); + const { siteConfig } = useDocusaurusContext(); + return ( +
+
+
+ +

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + Get Started + + + Demo + +
+
+
+
+ ); } export default function Home() { - const { siteConfig } = useDocusaurusContext(); - return ( - - -
- - -
-
- ); + const { siteConfig } = useDocusaurusContext(); + return ( + + +
+ + +
+
+ ); } diff --git a/doc/src/pages/index.module.css b/doc/src/pages/index.module.css index 73f12755..1864008c 100644 --- a/doc/src/pages/index.module.css +++ b/doc/src/pages/index.module.css @@ -4,31 +4,31 @@ */ .heroContainer { - display: flex; - align-items: center; - justify-content: center; - width: 100%; + display: flex; + align-items: center; + justify-content: center; + width: 100%; } .heroWrapper { - display: flex; - align-items: center; - justify-content: center; - flex-flow: column; - max-width: 600px; - padding-left: 2rem; - padding-right: 2rem; - text-align: center; + display: flex; + align-items: center; + justify-content: center; + flex-flow: column; + max-width: 600px; + padding-left: 2rem; + padding-right: 2rem; + text-align: center; } .heroWrapper img { - width: 30vh; - max-width: 250px; + width: 30vh; + max-width: 250px; } .buttons { - display: flex; - align-items: center; - justify-content: center; - gap: 10px; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; } diff --git a/package-lock.json b/package-lock.json index cf8031bb..1543e7cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8400 +1,8435 @@ { - "name": "watcharr", - "version": "1.44.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "watcharr", - "version": "1.44.2", - "dependencies": { - "axios": "^1.7.4", - "blurhash": "^2.0.5", - "papaparse": "^5.4.1" - }, - "devDependencies": { - "@sveltejs/adapter-node": "^5.2.3", - "@sveltejs/kit": "^2.15.1", - "@types/papaparse": "^5.3.15", - "@typescript-eslint/eslint-plugin": "^8.18.2", - "@typescript-eslint/parser": "^8.18.2", - "@vite-pwa/sveltekit": "^0.6.6", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.43.0", - "prettier": "^3.4.2", - "prettier-plugin-svelte": "^3.2.6", - "svelte": "^4.2.19", - "svelte-check": "^4.0.2", - "svelte-eslint-parser": "^0.41.0", - "svelte-preprocess": "^6.0.2", - "tslib": "^2.7.0", - "typescript": "^5.7.2", - "vite": "^5.4.6" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", - "dev": true, - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "peer": true - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.26.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dev": true, - "peer": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "/~https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", - "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^10.4.1", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "peer": true, - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz", - "integrity": "sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz", - "integrity": "sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz", - "integrity": "sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz", - "integrity": "sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz", - "integrity": "sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz", - "integrity": "sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz", - "integrity": "sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz", - "integrity": "sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz", - "integrity": "sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz", - "integrity": "sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz", - "integrity": "sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz", - "integrity": "sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz", - "integrity": "sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz", - "integrity": "sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz", - "integrity": "sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz", - "integrity": "sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dev": true, - "peer": true, - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "peer": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/@sveltejs/adapter-node": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.2.3.tgz", - "integrity": "sha512-0KNrTc9NiEhB1vyVL0HiqZaW2P5JWNJgTYT5PnUZCLO9Oydx8G+6PNtJPJ/NNPyeGrn+6LwR5L8GNRvA4b5Bpw==", - "dev": true, - "dependencies": { - "@rollup/plugin-commonjs": "^26.0.1", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "rollup": "^4.9.5" - }, - "peerDependencies": { - "@sveltejs/kit": "^2.4.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.15.1.tgz", - "integrity": "sha512-8t7D3hQHbUDMiaQ2RVnjJJ/+Ur4Fn/tkeySJCsHtX346Q9cp3LAnav8xXdfuqYNJwpUGX0x3BqF1uvbmXQw93A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/cookie": "^0.6.0", - "cookie": "^0.6.0", - "devalue": "^5.1.0", - "esm-env": "^1.2.1", - "import-meta-resolve": "^4.1.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "mrmime": "^2.0.0", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0", - "tiny-glob": "^0.2.9" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=18.13" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.3 || ^6.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.1.tgz", - "integrity": "sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA==", - "dev": true, - "peer": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0-next.0 || ^2.0.0", - "debug": "^4.3.4", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "svelte-hmr": "^0.15.3", - "vitefu": "^0.2.5" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz", - "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", - "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/papaparse": { - "version": "5.3.15", - "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.15.tgz", - "integrity": "sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, - "peer": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.2.tgz", - "integrity": "sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.2", - "@typescript-eslint/type-utils": "8.18.2", - "@typescript-eslint/utils": "8.18.2", - "@typescript-eslint/visitor-keys": "8.18.2", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.2.tgz", - "integrity": "sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.18.2", - "@typescript-eslint/types": "8.18.2", - "@typescript-eslint/typescript-estree": "8.18.2", - "@typescript-eslint/visitor-keys": "8.18.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.2.tgz", - "integrity": "sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.18.2", - "@typescript-eslint/visitor-keys": "8.18.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.2.tgz", - "integrity": "sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.2", - "@typescript-eslint/utils": "8.18.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.2.tgz", - "integrity": "sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.2.tgz", - "integrity": "sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.18.2", - "@typescript-eslint/visitor-keys": "8.18.2", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.2.tgz", - "integrity": "sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.2", - "@typescript-eslint/types": "8.18.2", - "@typescript-eslint/typescript-estree": "8.18.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.2.tgz", - "integrity": "sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.18.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vite-pwa/sveltekit": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@vite-pwa/sveltekit/-/sveltekit-0.6.6.tgz", - "integrity": "sha512-f08xlcfZyaXgytl05hUtCLih7Vr8zOk/E4eE/UK71M+sEGk+y+vUyTuR8td8KQalpf1Begb8XkxAkV7iUj2a0g==", - "dev": true, - "dependencies": { - "kolorist": "^1.8.0", - "tinyglobby": "^0.2.9" - }, - "engines": { - "node": ">=16.14 || >=18.13" - }, - "funding": { - "url": "/~https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@sveltejs/kit": "^1.3.1 || ^2.0.1", - "@vite-pwa/assets-generator": "^0.2.6", - "vite-plugin-pwa": ">=0.20.5 <1" - }, - "peerDependenciesMeta": { - "@vite-pwa/assets-generator": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "/~https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "/~https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "peer": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "peer": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "peer": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", - "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", - "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", - "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/blurhash": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", - "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "/~https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "peer": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "/~https://github.com/sponsors/ai" - } - ], - "peer": true - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/code-red/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "peer": true - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", - "dev": true, - "peer": true, - "dependencies": { - "browserslist": "^4.24.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "peer": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "peer": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "peer": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", - "dev": true, - "peer": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.23.8", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.8.tgz", - "integrity": "sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==", - "dev": true, - "peer": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.6", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.0", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "peer": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "peer": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "peer": true, - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.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.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "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.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", - "dev": true, - "dependencies": { - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-svelte": { - "version": "2.43.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.43.0.tgz", - "integrity": "sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@jridgewell/sourcemap-codec": "^1.4.15", - "eslint-compat-utils": "^0.5.1", - "esutils": "^2.0.3", - "known-css-properties": "^0.34.0", - "postcss": "^8.4.38", - "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.1.0", - "semver": "^7.6.2", - "svelte-eslint-parser": "^0.41.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "/~https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-svelte/node_modules/svelte-eslint-parser": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.41.0.tgz", - "integrity": "sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==", - "dev": true, - "dependencies": { - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "postcss": "^8.4.39", - "postcss-scss": "^4.0.9" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "/~https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esm-env": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz", - "integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==", - "dev": true - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true, - "peer": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "/~https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "peer": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "peer": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "peer": true, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true, - "peer": true - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "peer": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "peer": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "peer": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "peer": true, - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "peer": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "peer": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true, - "peer": true - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "funding": { - "type": "github", - "url": "/~https://github.com/sponsors/wooorm" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "peer": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "peer": true, - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "peer": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "peer": true, - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "peer": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "peer": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "peer": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", - "dev": true - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "peer": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "peer": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "peer": true - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "/~https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "peer": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "peer": true, - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "node_modules/papaparse": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/periscopic/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/periscopic/node_modules/is-reference": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", - "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "/~https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "/~https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "/~https://github.com/sponsors/ai" - } - ], - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "/~https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-svelte": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.6.tgz", - "integrity": "sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==", - "dev": true, - "peerDependencies": { - "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" - } - }, - "node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "/~https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", - "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "peer": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "peer": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "peer": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "peer": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "peer": true - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "peer": true, - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.0.tgz", - "integrity": "sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.0", - "@rollup/rollup-android-arm64": "4.22.0", - "@rollup/rollup-darwin-arm64": "4.22.0", - "@rollup/rollup-darwin-x64": "4.22.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.0", - "@rollup/rollup-linux-arm-musleabihf": "4.22.0", - "@rollup/rollup-linux-arm64-gnu": "4.22.0", - "@rollup/rollup-linux-arm64-musl": "4.22.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.0", - "@rollup/rollup-linux-riscv64-gnu": "4.22.0", - "@rollup/rollup-linux-s390x-gnu": "4.22.0", - "@rollup/rollup-linux-x64-gnu": "4.22.0", - "@rollup/rollup-linux-x64-musl": "4.22.0", - "@rollup/rollup-win32-arm64-msvc": "4.22.0", - "@rollup/rollup-win32-ia32-msvc": "4.22.0", - "@rollup/rollup-win32-x64-msvc": "4.22.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "/~https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "/~https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/sass": { - "version": "1.59.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.2.tgz", - "integrity": "sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "peer": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "peer": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "/~https://github.com/sponsors/isaacs" - } - }, - "node_modules/sirv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", - "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true, - "peer": true - }, - "node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true, - "peer": true - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "peer": true, - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/svelte": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", - "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/estree": "^1.0.1", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-check": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.0.2.tgz", - "integrity": "sha512-w2yqcG9ELJe2RJCnAvB7v0OgkHhL3czzz/tVoxGFfO6y4mOrF6QHCDhXijeXzsU7LVKEwWS3Qd9tza4JBuDxqA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^3.4.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/svelte-check/node_modules/fdir": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", - "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/svelte-check/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/svelte-eslint-parser": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.41.0.tgz", - "integrity": "sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==", - "dev": true, - "dependencies": { - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "postcss": "^8.4.39", - "postcss-scss": "^4.0.9" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "/~https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/svelte-hmr": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", - "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, - "node_modules/svelte-preprocess": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.2.tgz", - "integrity": "sha512-OvDTLfaOkkhjprbDKO0SOCkjNYuHy16dbD4SpqbIi6QiabOMHxRT4km5/dzbFFkmW1L0E2INF3MFltG2pgOyKQ==", - "dev": true, - "hasInstallScript": true, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.10.2", - "coffeescript": "^2.5.1", - "less": "^3.11.3 || ^4.0.0", - "postcss": "^7 || ^8", - "postcss-load-config": ">=3", - "pug": "^3.0.0", - "sass": "^1.26.8", - "stylus": ">=0.55", - "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.100 || ^5.0.0", - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "coffeescript": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-load-config": { - "optional": true - }, - "pug": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/svelte/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/svelte/node_modules/is-reference": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", - "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dev": true, - "peer": true, - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", - "dev": true, - "dependencies": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "peer": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "peer": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "peer": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "/~https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", - "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "/~https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-pwa": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.21.1.tgz", - "integrity": "sha512-rkTbKFbd232WdiRJ9R3u+hZmf5SfQljX1b45NF6oLA6DSktEKpYllgTo1l2lkiZWMWV78pABJtFjNXfBef3/3Q==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.3.6", - "pretty-bytes": "^6.1.1", - "tinyglobby": "^0.2.10", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "/~https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vite-pwa/assets-generator": "^0.2.6", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" - }, - "peerDependenciesMeta": { - "@vite-pwa/assets-generator": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "dev": true, - "peer": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true, - "peer": true - }, - "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "peer": true, - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "peer": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "dev": true, - "peer": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "/~https://github.com/sponsors/ljharb" - } - }, - "node_modules/workbox-background-sync": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", - "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", - "dev": true, - "peer": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", - "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-build": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", - "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", - "dev": true, - "peer": true, - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.24.4", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^2.4.1", - "@rollup/plugin-terser": "^0.4.3", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "7.3.0", - "workbox-broadcast-update": "7.3.0", - "workbox-cacheable-response": "7.3.0", - "workbox-core": "7.3.0", - "workbox-expiration": "7.3.0", - "workbox-google-analytics": "7.3.0", - "workbox-navigation-preload": "7.3.0", - "workbox-precaching": "7.3.0", - "workbox-range-requests": "7.3.0", - "workbox-recipes": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0", - "workbox-streams": "7.3.0", - "workbox-sw": "7.3.0", - "workbox-window": "7.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "peer": true, - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dev": true, - "peer": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true, - "peer": true - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "/~https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true, - "peer": true - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true - }, - "node_modules/workbox-build/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "peer": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/workbox-build/node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-build/node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "dev": true, - "peer": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", - "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-core": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", - "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", - "dev": true, - "peer": true - }, - "node_modules/workbox-expiration": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", - "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", - "dev": true, - "peer": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", - "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-background-sync": "7.3.0", - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", - "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-precaching": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", - "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", - "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-recipes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", - "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-cacheable-response": "7.3.0", - "workbox-core": "7.3.0", - "workbox-expiration": "7.3.0", - "workbox-precaching": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" - } - }, - "node_modules/workbox-routing": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", - "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-strategies": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", - "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-streams": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", - "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", - "dev": true, - "peer": true, - "dependencies": { - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0" - } - }, - "node_modules/workbox-sw": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", - "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", - "dev": true, - "peer": true - }, - "node_modules/workbox-window": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", - "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "7.3.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "/~https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "/~https://github.com/sponsors/sindresorhus" - } - } - } + "name": "watcharr", + "version": "1.44.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "watcharr", + "version": "1.44.2", + "dependencies": { + "axios": "^1.7.4", + "blurhash": "^2.0.5", + "papaparse": "^5.4.1" + }, + "devDependencies": { + "@sveltejs/adapter-node": "^5.2.3", + "@sveltejs/kit": "^2.15.1", + "@types/papaparse": "^5.3.15", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "@vite-pwa/sveltekit": "^0.6.6", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.45.1", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.2.6", + "sass": "^1.83.0", + "svelte": "^5.17.3", + "svelte-check": "^4.1.3", + "svelte-eslint-parser": "^0.42.0", + "svelte-preprocess": "^6.0.3", + "typescript": "^5.7.2", + "vite": "^6.0.7" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dev": true, + "peer": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "/~https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", + "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", + "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "peer": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", + "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", + "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", + "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", + "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", + "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", + "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", + "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", + "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", + "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", + "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", + "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", + "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", + "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", + "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", + "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", + "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", + "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", + "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", + "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "peer": true, + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "peer": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@sveltejs/adapter-node": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.2.11.tgz", + "integrity": "sha512-lR7/dfUaKFf3aI408KRDy/BVDYoqUws7zNOJz2Hl4JoshlTnMgdha3brXBRFXB+cWtYvJjjPhvmq3xqpbioi4w==", + "dev": true, + "dependencies": { + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "rollup": "^4.9.5" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.4.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.15.1.tgz", + "integrity": "sha512-8t7D3hQHbUDMiaQ2RVnjJJ/+Ur4Fn/tkeySJCsHtX346Q9cp3LAnav8xXdfuqYNJwpUGX0x3BqF1uvbmXQw93A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^0.6.0", + "devalue": "^5.1.0", + "esm-env": "^1.2.1", + "import-meta-resolve": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0", + "tiny-glob": "^0.2.9" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3 || ^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz", + "integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==", + "dev": true, + "peer": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.0", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.15", + "vitefu": "^1.0.4" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.4.tgz", + "integrity": "sha512-99l6wv4HEzBQhvaU/UGoeBoCK61SCROQaCCGyQSgX2tEQ3rKkNZ2S7CEWnS/4s1LV+8ODdK21UeyR1fHP2mXug==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/papaparse": { + "version": "5.3.15", + "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.15.tgz", + "integrity": "sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "peer": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz", + "integrity": "sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.19.0", + "@typescript-eslint/type-utils": "8.19.0", + "@typescript-eslint/utils": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.0.tgz", + "integrity": "sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.19.0", + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/typescript-estree": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", + "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz", + "integrity": "sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.19.0", + "@typescript-eslint/utils": "8.19.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", + "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", + "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/visitor-keys": "8.19.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.0.tgz", + "integrity": "sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.19.0", + "@typescript-eslint/types": "8.19.0", + "@typescript-eslint/typescript-estree": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", + "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.19.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true + }, + "node_modules/@vite-pwa/sveltekit": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@vite-pwa/sveltekit/-/sveltekit-0.6.7.tgz", + "integrity": "sha512-geeRgOiFr4RdW4JHIshOTsa8OqX4P+aJtudnKjuxzpmHy44bo4o18OWM1iXc4qXBJCxCw+3yTttyJsdmHXG/sA==", + "dev": true, + "dependencies": { + "kolorist": "^1.8.0", + "tinyglobby": "^0.2.9" + }, + "engines": { + "node": ">=16.14 || >=18.13" + }, + "funding": { + "url": "/~https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@sveltejs/kit": "^1.3.1 || ^2.0.1", + "@vite-pwa/assets-generator": "^0.2.6", + "vite-plugin-pwa": ">=0.21.1 <1" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-typescript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", + "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", + "dev": true, + "peerDependencies": { + "acorn": ">=8.9.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "/~https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "/~https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "peer": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "peer": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/blurhash": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "/~https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "peer": true + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "/~https://github.com/sponsors/ai" + } + ], + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "peer": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dev": true, + "peer": true, + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/devalue": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", + "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "peer": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.76", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", + "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "dev": true, + "peer": true + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "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.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "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.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "2.46.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.46.1.tgz", + "integrity": "sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@jridgewell/sourcemap-codec": "^1.4.15", + "eslint-compat-utils": "^0.5.1", + "esutils": "^2.0.3", + "known-css-properties": "^0.35.0", + "postcss": "^8.4.38", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.1.0", + "semver": "^7.6.2", + "svelte-eslint-parser": "^0.43.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "/~https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-svelte/node_modules/svelte-eslint-parser": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.43.0.tgz", + "integrity": "sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "postcss": "^8.4.39", + "postcss-scss": "^4.0.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "/~https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esm-env": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz", + "integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.3.2.tgz", + "integrity": "sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "peer": true + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "peer": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "/~https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "peer": true + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "/~https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "peer": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true, + "peer": true + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "/~https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "peer": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "peer": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "peer": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "/~https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "/~https://github.com/sponsors/isaacs" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "/~https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "peer": true + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "/~https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "/~https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "/~https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "/~https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.2.tgz", + "integrity": "sha512-kRPjH8wSj2iu+dO+XaUv4vD8qr5mdDmlak3IT/7AOgGIMRG86z/EHOLauFcClKEnOUf4A4nOA7sre5KrJD4Raw==", + "dev": true, + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, + "peer": true, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "/~https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "peer": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "peer": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "peer": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "peer": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "peer": true + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "peer": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "/~https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", + "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.29.1", + "@rollup/rollup-android-arm64": "4.29.1", + "@rollup/rollup-darwin-arm64": "4.29.1", + "@rollup/rollup-darwin-x64": "4.29.1", + "@rollup/rollup-freebsd-arm64": "4.29.1", + "@rollup/rollup-freebsd-x64": "4.29.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", + "@rollup/rollup-linux-arm-musleabihf": "4.29.1", + "@rollup/rollup-linux-arm64-gnu": "4.29.1", + "@rollup/rollup-linux-arm64-musl": "4.29.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", + "@rollup/rollup-linux-riscv64-gnu": "4.29.1", + "@rollup/rollup-linux-s390x-gnu": "4.29.1", + "@rollup/rollup-linux-x64-gnu": "4.29.1", + "@rollup/rollup-linux-x64-musl": "4.29.1", + "@rollup/rollup-win32-arm64-msvc": "4.29.1", + "@rollup/rollup-win32-ia32-msvc": "4.29.1", + "@rollup/rollup-win32-x64-msvc": "4.29.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "/~https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "/~https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/sass": { + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", + "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", + "dev": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "peer": true + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "peer": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "peer": true + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "peer": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.17.3.tgz", + "integrity": "sha512-eLgtpR2JiTgeuNQRCDcLx35Z7Lu9Qe09GPOz+gvtR9nmIZu5xgFd6oFiLGQlxLD0/u7xVyF5AUkjDVyFHe6Bvw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "acorn-typescript": "^1.4.13", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^1.3.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.3.tgz", + "integrity": "sha512-IEMoQDH+TrPKwKeIyJim+PU8FxnzQMXsFHR/ldErkHpPXEGHCujHUXiR8jg6qDMqzsif5BbDOUFORltu87ex7g==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.42.0.tgz", + "integrity": "sha512-e7LyqFPTuF43ZYhKOf0Gq1lzP+G64iWVJXAIcwVxohGx5FFyqdUkw7DEXNjZ+Fm+TAA98zPmDqWvgD1OpyMi5A==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "postcss": "^8.4.39", + "postcss-scss": "^4.0.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "/~https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.3.tgz", + "integrity": "sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": ">=3", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": ">=0.55", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.100 || ^5.0.0", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte/node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "peer": true, + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "peer": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "peer": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "/~https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "/~https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-pwa": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.21.1.tgz", + "integrity": "sha512-rkTbKFbd232WdiRJ9R3u+hZmf5SfQljX1b45NF6oLA6DSktEKpYllgTo1l2lkiZWMWV78pABJtFjNXfBef3/3Q==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.10", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "/~https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vite-pwa/assets-generator": "^0.2.6", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.5.tgz", + "integrity": "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==", + "dev": true, + "peer": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "peer": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "peer": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "peer": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "peer": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "/~https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", + "dev": true, + "peer": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-build": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", + "dev": true, + "peer": true, + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "peer": true, + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "peer": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "peer": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "peer": true + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "/~https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "peer": true + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true + }, + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "peer": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/workbox-build/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "/~https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-core": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", + "dev": true, + "peer": true + }, + "node_modules/workbox-expiration": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", + "dev": true, + "peer": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", + "dev": true, + "peer": true, + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", + "dev": true, + "peer": true + }, + "node_modules/workbox-window": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.3.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "peer": true + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", + "dev": true + } + } } diff --git a/package.json b/package.json index af04360d..cb5f1fd2 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,41 @@ { - "name": "watcharr", - "version": "1.44.2", - "private": true, - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --check . && eslint .", - "format": "prettier --write .", - "server": "cd ./server && MODE=DEV go run ." - }, - "devDependencies": { - "@sveltejs/adapter-node": "^5.2.3", - "@sveltejs/kit": "^2.15.1", - "@types/papaparse": "^5.3.15", - "@typescript-eslint/eslint-plugin": "^8.18.2", - "@typescript-eslint/parser": "^8.18.2", - "@vite-pwa/sveltekit": "^0.6.6", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.43.0", - "prettier": "^3.4.2", - "prettier-plugin-svelte": "^3.2.6", - "svelte": "^4.2.19", - "svelte-check": "^4.0.2", - "svelte-eslint-parser": "^0.41.0", - "svelte-preprocess": "^6.0.2", - "tslib": "^2.7.0", - "typescript": "^5.7.2", - "vite": "^5.4.6" - }, - "type": "module", - "dependencies": { - "axios": "^1.7.4", - "blurhash": "^2.0.5", - "papaparse": "^5.4.1" - } + "name": "watcharr", + "version": "1.44.2", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check . && eslint .", + "format": "prettier --write .", + "server": "cd ./server && MODE=DEV go run ." + }, + "devDependencies": { + "@sveltejs/adapter-node": "^5.2.3", + "@sveltejs/kit": "^2.15.1", + "@types/papaparse": "^5.3.15", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "@vite-pwa/sveltekit": "^0.6.6", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.45.1", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.2.6", + "sass": "^1.83.0", + "svelte": "^5.17.3", + "svelte-check": "^4.1.3", + "svelte-eslint-parser": "^0.42.0", + "svelte-preprocess": "^6.0.3", + "typescript": "^5.7.2", + "vite": "^6.0.7" + }, + "type": "module", + "dependencies": { + "axios": "^1.7.4", + "blurhash": "^2.0.5", + "papaparse": "^5.4.1" + } } diff --git a/server/auth_proxy.go b/server/auth_proxy.go index 2df69017..f52caaea 100644 --- a/server/auth_proxy.go +++ b/server/auth_proxy.go @@ -19,16 +19,16 @@ type TrustedHeaderAuthSetting struct { // easily without having to remove configuration. // To be actually enabled, HEADER_NAME must also // be set. - Enabled bool `json:"enabled,omitempty"` + Enabled bool `json:"enabled"` // Required: What is the name of the trusted header // that will contain the logged in users username? - HeaderName string `json:"headerName,omitempty"` + HeaderName string `json:"headerName"` // Should the frontend attempt auto login if // trusted header auth is enabled. - AutoLogin bool `json:"autoLogin,omitempty"` + AutoLogin bool `json:"autoLogin"` // Where can we redirect the user to logout // of the auth service? - LogoutUrl string `json:"logoutUrl,omitempty"` + LogoutUrl string `json:"logoutUrl"` } type TrustedHeaderAuthLogoutDetailsResponse struct { diff --git a/src/app.d.ts b/src/app.d.ts index 899c7e8f..f59b884c 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,12 +1,12 @@ // See https://kit.svelte.dev/docs/types#app // for information about these interfaces declare global { - namespace App { - // interface Error {} - // interface Locals {} - // interface PageData {} - // interface Platform {} - } + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface Platform {} + } } export {}; diff --git a/src/app.html b/src/app.html index aea1909c..3cba61d5 100644 --- a/src/app.html +++ b/src/app.html @@ -1,14 +1,14 @@ - - - - - - Watcharr - %sveltekit.head% - - -
%sveltekit.body%
- + + + + + + Watcharr + %sveltekit.head% + + +
%sveltekit.body%
+ diff --git a/src/hooks.client.ts b/src/hooks.client.ts new file mode 100644 index 00000000..3267a7ce --- /dev/null +++ b/src/hooks.client.ts @@ -0,0 +1,8 @@ +import type { ClientInit } from "@sveltejs/kit"; + +export const init: ClientInit = async () => { + console.info( + `%cWATCHARR v${__WATCHARR_VERSION__}`, + "background: white;color: black;font-size: large;padding: 3px 5px;", + ); +}; diff --git a/src/lib/Activity.svelte b/src/lib/Activity.svelte index 8d7fe3d2..f5618b3b 100644 --- a/src/lib/Activity.svelte +++ b/src/lib/Activity.svelte @@ -1,320 +1,326 @@ -{#if isActivityEditorVisible} - (isActivityEditorVisible = false)} - /> +{#if clickedActivity} + (clickedActivity = undefined)} + /> {/if}
-

Activity

- {#if groupedActivities && Object.keys(groupedActivities).length > 0} -
    - {#each Object.keys(groupedActivities) as k} -

    {k}

    +

    Activity

    + {#if groupedActivities && Object.keys(groupedActivities).length > 0} +
      + {#each Object.keys(groupedActivities) as k} +

      {k}

      - {#each groupedActivities[k] as a} - {@const d = new Date(getCreatedAtVis(a))} -
    • - - {#if a.type?.endsWith("_AUTO")} - {@const data = getActivityDataParsed(a)} - - - - {/if} -
    • - {/each} - {/each} -
    - {:else} - You Have No Activity! - {/if} + {#each groupedActivities[k] as a} + {@const d = new Date(getCreatedAtVis(a))} +
  • + + {#if a.type?.endsWith("_AUTO")} + {@const data = getActivityDataParsed(a)} + + + + {/if} +
  • + {/each} + {/each} +
+ {:else} + You Have No Activity! + {/if}
diff --git a/src/lib/ActivityEditor.svelte b/src/lib/ActivityEditor.svelte index bec2399f..90c102e3 100644 --- a/src/lib/ActivityEditor.svelte +++ b/src/lib/ActivityEditor.svelte @@ -1,131 +1,140 @@ -
-

Date

- -

Time

- +
+

Date

+ +

Time

+ -
- -
- -
-
-
+
+ +
+ +
+
+
diff --git a/src/lib/Checkbox.svelte b/src/lib/Checkbox.svelte index 09c51cb2..bc0f2594 100644 --- a/src/lib/Checkbox.svelte +++ b/src/lib/Checkbox.svelte @@ -1,87 +1,96 @@
- - + +
diff --git a/src/lib/ColorSelector.svelte b/src/lib/ColorSelector.svelte index dddcc31c..6dc6c6cc 100644 --- a/src/lib/ColorSelector.svelte +++ b/src/lib/ColorSelector.svelte @@ -1,25 +1,33 @@ - diff --git a/src/lib/DropDown.svelte b/src/lib/DropDown.svelte index 01acc725..1f215280 100644 --- a/src/lib/DropDown.svelte +++ b/src/lib/DropDown.svelte @@ -1,182 +1,202 @@
- -
    - {#each showActiveElementsInOptions ? options : options.filter( (o) => (typeof o === "string" ? o !== active : o.id !== active) ) as o} -
  • - -
  • - {/each} -
+ +
    + {#each showActiveElementsInOptions ? options : options.filter( (o) => (typeof o === "string" ? o !== active : o.id !== active), ) as o} +
  • + +
  • + {/each} +
diff --git a/src/lib/DropFileButton.svelte b/src/lib/DropFileButton.svelte index bc76f2c1..f6158a86 100644 --- a/src/lib/DropFileButton.svelte +++ b/src/lib/DropFileButton.svelte @@ -1,121 +1,134 @@
- - + +
diff --git a/src/lib/Error.svelte b/src/lib/Error.svelte index 476d205a..0c902675 100644 --- a/src/lib/Error.svelte +++ b/src/lib/Error.svelte @@ -1,44 +1,48 @@
-
- {pretty} - {#if error?.message} -

{error.message}

- {#if error.response?.data?.error} -

{error.response.data.error}

- {/if} - {:else} -

{JSON.stringify(error)}

- {/if} - {#if onRetry} - - {/if} -
+
+ {pretty} + {#if error?.message} +

{error.message}

+ {#if error.response?.data?.error} +

{error.response.data.error}

+ {/if} + {:else} +

{JSON.stringify(error)}

+ {/if} + {#if onRetry} + + {/if} +
diff --git a/src/lib/HorizontalList.svelte b/src/lib/HorizontalList.svelte index 5d9202bd..0dac0636 100644 --- a/src/lib/HorizontalList.svelte +++ b/src/lib/HorizontalList.svelte @@ -1,41 +1,46 @@
- {#if title} -

{title}

- {/if} -
    - -
+ {#if title} +

{title}

+ {/if} +
    + {@render children?.()} +
diff --git a/src/lib/Icon.svelte b/src/lib/Icon.svelte index 60a8c05d..723c7782 100644 --- a/src/lib/Icon.svelte +++ b/src/lib/Icon.svelte @@ -1,316 +1,435 @@ {#if i === "check"} - - - + + + {:else if i === "clock"} - - - + + + {:else if i === "play"} - + {:else if i === "calendar"} - - - + + + {:else if i === "thumb-down"} - + {:else if i === "thumb-up"} - - - - - + + + + + {:else if i === "pause"} - - - + + + {:else if i === "jellyfin"} - - - + + + {:else if i === "emby"} - - - + + + {:else if i === "plex"} - - - + + + {:else if i === "trash"} - - - - + + + + {:else if i === "close"} - - - + + + {:else if i === "close-circle"} - - - + + + {:else if i === "filter"} - - - + + + {:else if i === "filter-circle"} - - - + + + {:else if i === "reel"} - - - - + + + + {:else if i === "compass"} - - - - + + + + {:else if i === "document"} - - - - + + + + {:else if i === "add"} - - - + + + {:else if i === "arrow"} - - - + + + {:else if i === "chevron"} - - - + + + {:else if i === "search"} - - - + + + {:else if i === "sort"} - - - + + + {:else if i === "eye-closed"} - - - - + + + + {:else if i === "people-nocircle"} - - - + + + {:else if i === "people"} - - - - + + + + {:else if i === "person"} - - - - + + + + {:else if i === "person-add"} - - - + + + {:else if i === "person-minus"} - - - + + + {:else if i === "pencil"} - - - + + + {:else if i === "eye"} - - - - + + + + {:else if i === "star"} - - - + + + {:else if i === "refresh"} - - - + + + {:else if i === "movary"} - - - + + - - + /> + + {:else if i === "ryot"} - - - + + - - + /> + + {:else if i === "trakt"} - - - + + + {:else if i === "myanimelist"} - - - + + + {:else if i === "todomovies"} - - - - - + + + + + {:else if i === "themoviedb"} - - - + + + {:else if i === "imdb"} - - - + + + {:else if i === "gamepad"} - - - + + + {:else if i === "film"} - - - + + + {:else if i === "tv"} - - - - + + + + {:else if i === "pin"} - - - + + + {:else if i === "unpin"} - - - + + + {:else if i === "sparkles"} - - - + + + {:else if i === "tag"} - - - + + + {:else if i === "ticket"} - - - + + + {:else if i === "lock-closed"} - - - + + + {/if} diff --git a/src/lib/JobWatcherModal.svelte b/src/lib/JobWatcherModal.svelte index 2c10184e..b9d42fa9 100644 --- a/src/lib/JobWatcherModal.svelte +++ b/src/lib/JobWatcherModal.svelte @@ -1,212 +1,241 @@ -
- {#if step === "done"} - - {:else if step === "errored"} - - {:else} - - {/if} -
- {#if step === "starting"} -

Starting

- {messages.starting} - {:else if step === "job-running"} -

Running

- {#if currentTask} - {currentTask} - {/if} - {:else if step === "done"} - {#if !latestJobStatus?.errors || latestJobStatus?.errors?.length <= 0} -

Finished

- We have finished. Looks like there were no errors! - {:else} -

- Finished With {latestJobStatus?.errors?.length} Error{latestJobStatus?.errors - ?.length === 1 - ? "" - : "s"} -

- Job finished, but with errors: -
    - {#each latestJobStatus?.errors as e} -
  • {e}
  • - {/each} -
- {/if} - {:else if step === "errored"} -

We Errored!

- {#if jobFailError} - {jobFailError} - {:else} - We errored before starting the job or the job was cancelled. - {/if} - {#if latestJobStatus?.errors && latestJobStatus?.errors?.length > 0} -
    - {#each latestJobStatus?.errors as e} -
  • {e}
  • - {/each} -
- {/if} - {:else} -

Unknown State!

- We're not sure of the current job status. - {/if} -
-
+
+ {#if step === "done"} + + {:else if step === "errored"} + + {:else} + + {/if} +
+ {#if step === "starting"} +

Starting

+ {messages.starting} + {:else if step === "job-running"} +

Running

+ {#if currentTask} + {currentTask} + {/if} + {:else if step === "done"} + {#if !latestJobStatus?.errors || latestJobStatus?.errors?.length <= 0} +

Finished

+ We have finished. Looks like there were no errors! + {:else} +

+ Finished With {latestJobStatus?.errors?.length} Error{latestJobStatus + ?.errors?.length === 1 + ? "" + : "s"} +

+ Job finished, but with errors: +
    + {#each latestJobStatus?.errors as e} +
  • {e}
  • + {/each} +
+ {/if} + {:else if step === "errored"} +

We Errored!

+ {#if jobFailError} + {jobFailError} + {:else} + We errored before starting the job or the job was cancelled. + {/if} + {#if latestJobStatus?.errors && latestJobStatus?.errors?.length > 0} +
    + {#each latestJobStatus?.errors as e} +
  • {e}
  • + {/each} +
+ {/if} + {:else} +

Unknown State!

+ We're not sure of the current job status. + {/if} +
+
diff --git a/src/lib/ListBox.svelte b/src/lib/ListBox.svelte index 2472549b..9316c355 100644 --- a/src/lib/ListBox.svelte +++ b/src/lib/ListBox.svelte @@ -1,65 +1,68 @@
- {#if allCheckBox} -
- { - for (let i = 0; i < options.length; i++) { - const e = options[i]; - e.value = on; - } - options = options; - }} - /> - {allCheckBox} -
- {/if} - {#each options as o} -
- { - if (!on) { - allCheckBoxValue = false; - } else if (!allCheckBoxValue) { - if (!options.some((o) => !o.value)) { - allCheckBoxValue = true; - } - } - }} - /> - {o.displayValue} -
- {/each} + {#if allCheckBox} +
+ { + for (let i = 0; i < options.length; i++) { + const e = options[i]; + e.value = on; + } + options = options; + }} + /> + {allCheckBox} +
+ {/if} + {#each options as o} +
+ { + if (!on) { + allCheckBoxValue = false; + } else if (!allCheckBoxValue) { + if (!options.some((o) => !o.value)) { + allCheckBoxValue = true; + } + } + }} + /> + {o.displayValue} +
+ {/each}
diff --git a/src/lib/Menu.svelte b/src/lib/Menu.svelte new file mode 100644 index 00000000..6ac9c1a3 --- /dev/null +++ b/src/lib/Menu.svelte @@ -0,0 +1,112 @@ + + + + + + diff --git a/src/lib/Modal.svelte b/src/lib/Modal.svelte index d4bfadf0..3ad3159a 100644 --- a/src/lib/Modal.svelte +++ b/src/lib/Modal.svelte @@ -1,97 +1,110 @@
diff --git a/src/lib/Notice.svelte b/src/lib/Notice.svelte index f9894334..f248f608 100644 --- a/src/lib/Notice.svelte +++ b/src/lib/Notice.svelte @@ -1,21 +1,25 @@
-

{title}

-

{desc}

+

{title}

+

{desc}

diff --git a/src/lib/PageError.svelte b/src/lib/PageError.svelte index f745cce6..72c84e63 100644 --- a/src/lib/PageError.svelte +++ b/src/lib/PageError.svelte @@ -1,42 +1,46 @@
-
- {pretty} - {#if error?.message} -

{error.message}

- {#if error.response} -

{error.response.data.error}

- {/if} - {:else} -

{JSON.stringify(error)}

- {/if} -
+
+ {pretty} + {#if error?.message} +

{error.message}

+ {#if error.response} +

{error.response.data.error}

+ {/if} + {:else} +

{JSON.stringify(error)}

+ {/if} +
diff --git a/src/lib/RegionDropDown.svelte b/src/lib/RegionDropDown.svelte index fef87757..d790130c 100644 --- a/src/lib/RegionDropDown.svelte +++ b/src/lib/RegionDropDown.svelte @@ -1,37 +1,45 @@ {#await getCountries() then} - onChange(selectedCountry)} - isDropDownItem={true} - {disabled} - /> + onChange(selectedCountry)} + isDropDownItem={true} + {disabled} + /> {:catch err} - + {/await} diff --git a/src/lib/SeasonsList.svelte b/src/lib/SeasonsList.svelte index afdccb9e..27154b6c 100644 --- a/src/lib/SeasonsList.svelte +++ b/src/lib/SeasonsList.svelte @@ -1,354 +1,378 @@
-
    - {#each seasons as season} - - {/each} -
    -
+
    + {#each seasons as season} + + {/each} +
    +
-
- {#await seasonDetailsReq} - - {:then season} -
-

{season.name}

- {#if watchedItem} - {@const ws = watchedItem?.watchedSeasons?.find( - (s) => s.seasonNumber === season.season_number - )} - {#if ws} -
- handleStarClick(r, season.season_number)} - minimal={true} - direction="bot" - /> -
- {/if} -
- handleStatusClick(t, season.season_number)} - direction="bot" - width="100%" - small - /> -
- {/if} -
- {#if season?.episodes?.length > 0} -
    - {#each season.episodes as ep} - - {/each} -
- {:else} -

No episodes in this season yet!

- {/if} - {:catch err} - - {/await} -
+
+ {#await seasonDetailsReq} + + {:then season} +
+

{season.name}

+ {#if watchedItem} + {@const ws = watchedItem?.watchedSeasons?.find( + (s) => s.seasonNumber === season.season_number, + )} + {#if ws} +
+ + handleStarClick(r, season.season_number)} + minimal={true} + direction="bot" + /> +
+ {/if} +
+ + handleStatusClick(t, season.season_number)} + direction="bot" + width="100%" + small + /> +
+ {/if} +
+ {#if season?.episodes?.length > 0} +
    + {#each season.episodes as ep} + + {/each} +
+ {:else} +

No episodes in this season yet!

+ {/if} + {:catch err} + + {/await} +
diff --git a/src/lib/SeasonsListEpisode.svelte b/src/lib/SeasonsListEpisode.svelte index 82961d22..147f5db0 100644 --- a/src/lib/SeasonsListEpisode.svelte +++ b/src/lib/SeasonsListEpisode.svelte @@ -1,408 +1,423 @@
  • - {#if ep.still_path} - - {:else} -
    - {/if} -
    -
    - - {ep.episode_number} - {ep.name} - {#if ep.runtime} - {ep.runtime} min - {/if} - - - * - {Math.round(ep.vote_average * 10) / 10} - -
    - {ep.overview} -
    - {#if watchedItem} - {@const we = watchedItem.watchedEpisodes?.find( - (s) => s.seasonNumber === ep.season_number && s.episodeNumber === ep.episode_number - )} -
    -
    - handleStarClick(r)} - minimal={true} - direction="bot" - hideStarWhenRated - /> -
    -
    - handleStatusClick(t)} - direction="bot" - width="100%" - small - /> -
    -
    - {/if} - {#if isHidden} - - {/if} + {#if ep.still_path} + + {:else} +
    + {/if} +
    +
    + + {ep.episode_number} + {ep.name} + {#if ep.runtime} + {ep.runtime} min + {/if} + + + * + {Math.round(ep.vote_average * 10) / 10} + +
    + {ep.overview} +
    + {#if watchedItem} + {@const we = watchedItem.watchedEpisodes?.find( + (s) => + s.seasonNumber === ep.season_number && + s.episodeNumber === ep.episode_number, + )} +
    +
    + handleStarClick(r)} + minimal={true} + direction="bot" + hideStarWhenRated + /> +
    +
    + handleStatusClick(t)} + direction="bot" + width="100%" + small + /> +
    +
    + {/if} + {#if isHidden} + + {/if}
  • diff --git a/src/lib/Spinner.svelte b/src/lib/Spinner.svelte index 697326a1..33db9571 100644 --- a/src/lib/Spinner.svelte +++ b/src/lib/Spinner.svelte @@ -1,38 +1,41 @@
    -
    +
    diff --git a/src/lib/SpinnerTiny.svelte b/src/lib/SpinnerTiny.svelte index 7563e0d7..48a31cbe 100644 --- a/src/lib/SpinnerTiny.svelte +++ b/src/lib/SpinnerTiny.svelte @@ -1,27 +1,31 @@
    diff --git a/src/lib/Status.svelte b/src/lib/Status.svelte index fc182cb5..2f93d56f 100644 --- a/src/lib/Status.svelte +++ b/src/lib/Status.svelte @@ -1,68 +1,87 @@
    - - - - - + + + + +
    diff --git a/src/lib/UsersList.svelte b/src/lib/UsersList.svelte index 8277d448..b1eb9f8c 100644 --- a/src/lib/UsersList.svelte +++ b/src/lib/UsersList.svelte @@ -1,66 +1,70 @@
    -

    Users

    - +

    Users

    +
    diff --git a/src/lib/WatchedList.svelte b/src/lib/WatchedList.svelte index 7ee38394..ac0fa204 100644 --- a/src/lib/WatchedList.svelte +++ b/src/lib/WatchedList.svelte @@ -1,264 +1,328 @@ - {#if watched?.length > 0} - {#each watched as w (w.id)} - {#if w.game} - - {:else if w.content} - - {/if} - {/each} - {:else} -
    - {#if list?.length > 0} - - -

    Filters are hiding all results!

    -

    Try changing or removing your active filters.

    - - {:else} - - {#if isPublicList} -

    This watched list is empty!

    -

    Come back later to see if they have added anything.

    - {:else} -

    Your watched list is empty!

    -

    Try searching for something you would like to add.

    - - {/if} - {/if} -
    - {/if} + +

    Filters are hiding all results!

    +

    Try changing or removing your active filters.

    + + {:else} + + {#if isPublicList} +

    This watched list is empty!

    +

    + Come back later to see if they have added anything. +

    + {:else} +

    Your watched list is empty!

    +

    + Try searching for something you would like to add. +

    + + {/if} + {/if} +
    + {/if} diff --git a/src/lib/actions/stayInView.ts b/src/lib/actions/stayInView.ts index 36b8d85a..0c1d98eb 100644 --- a/src/lib/actions/stayInView.ts +++ b/src/lib/actions/stayInView.ts @@ -1,65 +1,65 @@ export interface StayInViewOptions { - /** - * If the `node` contains an element (like an arrow for menus), - * that should be shifted over to account for any shifting - * of the `node` itself, then pass a selector for it here. - */ - elToShiftSelector?: string; + /** + * If the `node` contains an element (like an arrow for menus), + * that should be shifted over to account for any shifting + * of the `node` itself, then pass a selector for it here. + */ + elToShiftSelector?: string; } export default function stayInView(node: HTMLElement, opts: StayInViewOptions) { - console.debug("stayInView: Initial opts:", opts); - let { elToShiftSelector } = opts; - let viewDeb: ReturnType; + console.debug("stayInView: Initial opts:", opts); + let { elToShiftSelector } = opts; + let viewDeb: ReturnType; - /** - * Move element to in view, if it isn't. - * - * Currently only supports moving `node` back into view if oob - * on the left. May need to support other sides and/or resizing - * when `node` still wont fit after shifting it in the future. - */ - const getInView = () => { - const nrect = node.getBoundingClientRect(); - const brect = document.body.getBoundingClientRect(); - console.debug("stayInView->getInView: Called.", nrect, brect); - if (nrect.x <= brect.x) { - const diff = nrect.x - brect.x + 10; - console.debug( - "stayInView->getInView: Node is out of bounds on the left, shifting forwards to:", - diff - ); - node.style.left = `${diff}px`; - if (elToShiftSelector) { - const elToShift = node.querySelector(elToShiftSelector) as HTMLElement; - if (elToShift) { - console.debug("stayInView->getInView: Shifting elToShift."); - const nrectNew = node.getBoundingClientRect(); - const arrowDiff = nrectNew.left - nrect.left; - elToShift.style.left = `${elToShift.offsetLeft - arrowDiff}px`; - } else { - console.warn("elToShift not found.", elToShiftSelector); - } - } - } - }; + /** + * Move element to in view, if it isn't. + * + * Currently only supports moving `node` back into view if oob + * on the left. May need to support other sides and/or resizing + * when `node` still wont fit after shifting it in the future. + */ + const getInView = () => { + const nrect = node.getBoundingClientRect(); + const brect = document.body.getBoundingClientRect(); + console.debug("stayInView->getInView: Called.", nrect, brect); + if (nrect.x <= brect.x) { + const diff = nrect.x - brect.x + 10; + console.debug( + "stayInView->getInView: Node is out of bounds on the left, shifting forwards to:", + diff, + ); + node.style.left = `${diff}px`; + if (elToShiftSelector) { + const elToShift = node.querySelector(elToShiftSelector) as HTMLElement; + if (elToShift) { + console.debug("stayInView->getInView: Shifting elToShift."); + const nrectNew = node.getBoundingClientRect(); + const arrowDiff = nrectNew.left - nrect.left; + elToShift.style.left = `${elToShift.offsetLeft - arrowDiff}px`; + } else { + console.warn("elToShift not found.", elToShiftSelector); + } + } + } + }; - const getInViewDeb = () => { - clearTimeout(viewDeb); - viewDeb = setTimeout(getInView, 200); - }; + const getInViewDeb = () => { + clearTimeout(viewDeb); + viewDeb = setTimeout(getInView, 200); + }; - window.addEventListener("resize", getInViewDeb); - getInView(); + window.addEventListener("resize", getInViewDeb); + getInView(); - return { - update(opts: StayInViewOptions) { - console.debug("stayInView: Opts updated", opts); - elToShiftSelector = opts.elToShiftSelector; - getInView(); - }, - destroy() { - window.removeEventListener("resize", getInViewDeb); - } - }; + return { + update(opts: StayInViewOptions) { + console.debug("stayInView: Opts updated", opts); + elToShiftSelector = opts.elToShiftSelector; + getInView(); + }, + destroy() { + window.removeEventListener("resize", getInViewDeb); + }, + }; } diff --git a/src/lib/actions/tooltip.ts b/src/lib/actions/tooltip.ts index 0bf3d50b..4ad331f9 100644 --- a/src/lib/actions/tooltip.ts +++ b/src/lib/actions/tooltip.ts @@ -1,66 +1,66 @@ export interface ToolTipOptions { - text: string; - pos?: "left" | "top" | "bot"; + text: string; + pos?: "left" | "top" | "bot"; - /** - * Only show tooltip if this condition is true. - */ - condition?: boolean; + /** + * Only show tooltip if this condition is true. + */ + condition?: boolean; } export default function tooltip(node: HTMLElement, opts: ToolTipOptions) { - let { text, pos = "left", condition = true } = opts; - const tooltip = document.getElementById("tooltip"); + let { text, pos = "left", condition = true } = opts; + const tooltip = document.getElementById("tooltip"); - const show = () => { - const trimmedText = text?.trim(); - if (!condition || !trimmedText) return; - if (tooltip) { - tooltip.innerHTML = trimmedText; - const nrect = node.getBoundingClientRect(); - const trect = tooltip.getBoundingClientRect(); - nrect.y += window.scrollY; // Add scrollY to node dom rect so tooltip shows correcting when page is scrolled down - if (pos === "left") { - tooltip.style.left = `${nrect.x - trect.width - 10}px`; - tooltip.style.top = `${nrect.y + trect.height / 2 - 19.5}px`; - } else if (pos === "top") { - tooltip.style.left = `${nrect.x - trect.width / 2 + nrect.width / 2}px`; - tooltip.style.top = `${nrect.y - trect.height - 5}px`; - } else if (pos === "bot") { - tooltip.style.left = `${nrect.x - trect.width / 2 + nrect.width / 2}px`; - tooltip.style.top = `${nrect.y + trect.height + 5}px`; - } - tooltip.style.visibility = "visible"; - } - }; + const show = () => { + const trimmedText = text?.trim(); + if (!condition || !trimmedText) return; + if (tooltip) { + tooltip.innerHTML = trimmedText; + const nrect = node.getBoundingClientRect(); + const trect = tooltip.getBoundingClientRect(); + nrect.y += window.scrollY; // Add scrollY to node dom rect so tooltip shows correcting when page is scrolled down + if (pos === "left") { + tooltip.style.left = `${nrect.x - trect.width - 10}px`; + tooltip.style.top = `${nrect.y + trect.height / 2 - 19.5}px`; + } else if (pos === "top") { + tooltip.style.left = `${nrect.x - trect.width / 2 + nrect.width / 2}px`; + tooltip.style.top = `${nrect.y - trect.height - 5}px`; + } else if (pos === "bot") { + tooltip.style.left = `${nrect.x - trect.width / 2 + nrect.width / 2}px`; + tooltip.style.top = `${nrect.y + trect.height + 5}px`; + } + tooltip.style.visibility = "visible"; + } + }; - const hide = () => { - if (tooltip) { - tooltip.style.visibility = "hidden"; - } - }; + const hide = () => { + if (tooltip) { + tooltip.style.visibility = "hidden"; + } + }; - node.addEventListener("mouseover", show); - node.addEventListener("touchstart", show); - node.addEventListener("mouseout", hide); - node.addEventListener("touchend", hide); - node.addEventListener("click", hide); + node.addEventListener("mouseover", show); + node.addEventListener("touchstart", show); + node.addEventListener("mouseout", hide); + node.addEventListener("touchend", hide); + node.addEventListener("click", hide); - return { - update(opts: ToolTipOptions) { - text = opts.text; - condition = opts.condition ?? true; - }, - destroy() { - node.removeEventListener("mouseover", show); - node.removeEventListener("touchstart", show); - node.removeEventListener("mouseout", hide); - node.removeEventListener("touchend", hide); - node.removeEventListener("click", hide); - // Running hide() here fixes scenario where we (eg) hide `node` - // after it is pressed, but tooltip persists and there is no way - // to remove it. - hide(); - } - }; + return { + update(opts: ToolTipOptions) { + text = opts.text; + condition = opts.condition ?? true; + }, + destroy() { + node.removeEventListener("mouseover", show); + node.removeEventListener("touchstart", show); + node.removeEventListener("mouseout", hide); + node.removeEventListener("touchend", hide); + node.removeEventListener("click", hide); + // Running hide() here fixes scenario where we (eg) hide `node` + // after it is pressed, but tooltip persists and there is no way + // to remove it. + hide(); + }, + }; } diff --git a/src/lib/content/FollowedThoughts.svelte b/src/lib/content/FollowedThoughts.svelte index 6c4499c7..cac920eb 100644 --- a/src/lib/content/FollowedThoughts.svelte +++ b/src/lib/content/FollowedThoughts.svelte @@ -1,154 +1,164 @@ {#await getFollowsThoughts()} - + {:then fts} - {#if fts?.length > 0} - - {#each fts as ft} - - {/each} - - {/if} + {#if fts?.length > 0} + + {#each fts as ft} + + {/each} + + {/if} {:catch err} - + {/await} {#if modalShownFor} - (modalShownFor = undefined)} - > - {modalShownFor.thoughts} - + (modalShownFor = undefined)} + > + {modalShownFor.thoughts} + {/if} diff --git a/src/lib/content/MyThoughts.svelte b/src/lib/content/MyThoughts.svelte index 353035ab..4e25ff04 100644 --- a/src/lib/content/MyThoughts.svelte +++ b/src/lib/content/MyThoughts.svelte @@ -1,123 +1,130 @@ {#if modalOpen} - { - if (!textarea) { - notify({ - text: "Failed to find the text box! Please copy your changes to avoid losing them and try again!" - }); - return; - } - // If thoughts weren't changed or changes saved successfully. - if (thoughts === textarea.value || (await onChange(textarea.value))) { - modalOpen = false; - } - }} - > - + {/if} diff --git a/src/lib/content/ProviderIcon.svelte b/src/lib/content/ProviderIcon.svelte index a2769942..04b186c0 100644 --- a/src/lib/content/ProviderIcon.svelte +++ b/src/lib/content/ProviderIcon.svelte @@ -4,138 +4,180 @@ --> {#if i === "Apple TV Plus"} - - - - - + + + + + {:else if i === "Apple TV"} - - - - - + + + + + {:else if i === "Amazon Prime Video"} - - - - - + + + + + {:else if i === "Disney Plus"} - - - - - - - - - - - - - + + + + + + + + + + + + + {:else if i === "Netflix"} - - - - - + + + + + {:else if i === "Sky Go"} - - - - - + + + + + {:else if i === "Paramount Plus"} - - - - - + + + + + {:else if i === "BBC iPlayer"} - - - - - + + + + + {:else if i === "Hulu"} - - - - - + + + + + {:else} - {i} + {i} {/if} diff --git a/src/lib/content/ProvidersList.svelte b/src/lib/content/ProvidersList.svelte index c4dc3c2b..cb224d99 100644 --- a/src/lib/content/ProvidersList.svelte +++ b/src/lib/content/ProvidersList.svelte @@ -1,32 +1,36 @@ {#if providers?.flatrate?.length > 0 || providers?.free?.length > 0} -
    - {#if providers?.flatrate?.length > 0} - {#each providers.flatrate as provider} - - {/each} - {/if} - {#if providers?.free?.length > 0} - {#each providers.free as provider} - - {/each} - {/if} -
    +
    + {#if providers?.flatrate?.length > 0} + {#each providers.flatrate as provider} + + {/each} + {/if} + {#if providers?.free?.length > 0} + {#each providers.free as provider} + + {/each} + {/if} +
    {/if} diff --git a/src/lib/content/SimilarContent.svelte b/src/lib/content/SimilarContent.svelte index 4524de7f..31f46283 100644 --- a/src/lib/content/SimilarContent.svelte +++ b/src/lib/content/SimilarContent.svelte @@ -1,24 +1,26 @@ {#if similar?.results?.length > 0} - - {#each similar.results as content} - - {/each} - + + {#each similar.results as content} + + {/each} + {/if} diff --git a/src/lib/content/Title.svelte b/src/lib/content/Title.svelte index 6f293e8d..60351d7e 100644 --- a/src/lib/content/Title.svelte +++ b/src/lib/content/Title.svelte @@ -1,68 +1,77 @@ - - {#if homepage} - {title} - {:else} - {title} - {/if} - {releaseYear} - - - * - {vote} - + + {#if homepage} + {title} + {:else} + {title} + {/if} + {releaseYear} + + + * + {vote} + diff --git a/src/lib/content/VideoEmbedModal.svelte b/src/lib/content/VideoEmbedModal.svelte index e67887ba..86f59b90 100644 --- a/src/lib/content/VideoEmbedModal.svelte +++ b/src/lib/content/VideoEmbedModal.svelte @@ -1,63 +1,73 @@ diff --git a/src/lib/img/UserAvatar.svelte b/src/lib/img/UserAvatar.svelte index 0add892c..a41dd2fe 100644 --- a/src/lib/img/UserAvatar.svelte +++ b/src/lib/img/UserAvatar.svelte @@ -1,95 +1,111 @@ -
    - {#if img?.path} - - - {:else} - - {/if} - {#if typeof avatarDropped === "function"} - - {/if} +
    + {#if img?.path} + + + {:else} + + {/if} + {#if typeof avatarDropped === "function"} + + {/if}
    diff --git a/src/lib/logout/ProxyUserLogoutModal.svelte b/src/lib/logout/ProxyUserLogoutModal.svelte index fddff700..027567a1 100644 --- a/src/lib/logout/ProxyUserLogoutModal.svelte +++ b/src/lib/logout/ProxyUserLogoutModal.svelte @@ -1,91 +1,98 @@ - {#if loadingBtns} - - {:else} -
    -

    - {#if logoutUrl} - This is likely what you want: Fully logout of your single sign-on service and Watcharr. - {:else} - Single sign-on logout has not been configured on this server. If you are not the server - operator, let them know! - {/if} -

    - -

    - Logging out of Watcharr will clear your local credentials and data, but you will still be logged in to your single sign-on service! Do not do this on a public machine and assume you are logged out, this account could - still be accessible. -

    - -
    - {/if} + {#if loadingBtns} + + {:else} +
    +

    + {#if logoutUrl} + This is likely what you want: Fully logout of your single sign-on service and Watcharr. + {:else} + Single sign-on logout has not been configured on this server. If you + are not the server operator, let them know! + {/if} +

    + +

    + Logging out of Watcharr will clear your local credentials and data, but you will still be logged in to your single sign-on service! Do not do this on a public machine and assume you are logged out, + this account could still be accessible. +

    + +
    + {/if}
    diff --git a/src/lib/logout/index.ts b/src/lib/logout/index.ts index e75fef93..b09a88c1 100644 --- a/src/lib/logout/index.ts +++ b/src/lib/logout/index.ts @@ -1,4 +1,4 @@ -import { clearAllStores } from "@/store"; +import { clearAllStores } from "@/store.svelte"; /** * Helper to clear local data in client for logout @@ -9,6 +9,6 @@ import { clearAllStores } from "@/store"; * should not be included here (eg: redirecting to /login). */ export function clearWatcharrData() { - localStorage.removeItem("token"); - clearAllStores(); + localStorage.removeItem("token"); + clearAllStores(); } diff --git a/src/lib/nav/DetailedMenu.svelte b/src/lib/nav/DetailedMenu.svelte index 5c597bb4..49dd0128 100644 --- a/src/lib/nav/DetailedMenu.svelte +++ b/src/lib/nav/DetailedMenu.svelte @@ -1,93 +1,78 @@ -
    -
    -

    Shown Details

    - - - - -
    -
    + +

    Shown Details

    + + + + +
    diff --git a/src/lib/nav/FaceMenu.svelte b/src/lib/nav/FaceMenu.svelte new file mode 100644 index 00000000..778bf016 --- /dev/null +++ b/src/lib/nav/FaceMenu.svelte @@ -0,0 +1,89 @@ + + + + {#if user?.username} +
    Hi {user.username}!
    + {/if} + + {#if !store.userSettings?.private} + + {/if} + {#if user && userHasPermission(user.permissions, UserPermission.PERM_ADMIN)} + + + {#if store.serverFeatures?.sonarr || store.serverFeatures?.radarr} + + + {/if} + {/if} + + {#if proxyUserLogoutShown} + (proxyUserLogoutShown = false)} /> + {/if} + v{__WATCHARR_VERSION__} +
    diff --git a/src/lib/nav/FilterMenu.svelte b/src/lib/nav/FilterMenu.svelte index cb64cd32..667914b4 100644 --- a/src/lib/nav/FilterMenu.svelte +++ b/src/lib/nav/FilterMenu.svelte @@ -1,187 +1,172 @@ - + +
    +

    type

    + {#if store.activeFilters?.type?.length > 0 || store.activeFilters?.status?.length > 0} + + {/if} +
    +
    + + + {#if store.serverFeatures?.games} + + {/if} +
    +

    status

    + + + + + +
    diff --git a/src/lib/nav/FollowingMenu.svelte b/src/lib/nav/FollowingMenu.svelte index f545bded..f27ef6ef 100644 --- a/src/lib/nav/FollowingMenu.svelte +++ b/src/lib/nav/FollowingMenu.svelte @@ -1,54 +1,50 @@ - + + {#if store.follows?.length > 0} +

    following

    +
    + {#each store.follows as f} + close()} + > + {f.followedUser.username} + + {/each} +
    + {:else} + You are not following anyone. + {/if} +
    diff --git a/src/lib/nav/SortMenu.svelte b/src/lib/nav/SortMenu.svelte index f1cb760b..1370dc13 100644 --- a/src/lib/nav/SortMenu.svelte +++ b/src/lib/nav/SortMenu.svelte @@ -1,107 +1,91 @@ - + + + + + + + diff --git a/src/lib/poster/ExtraDetails.svelte b/src/lib/poster/ExtraDetails.svelte index 155f55c7..af457754 100644 --- a/src/lib/poster/ExtraDetails.svelte +++ b/src/lib/poster/ExtraDetails.svelte @@ -1,148 +1,161 @@ -{#if ($page.url?.pathname === "/" || $page.url?.pathname.startsWith("/search")) && details && dve && dve.length > 0} -
    - -
    - {#if details.dateAdded && dve.includes("dateAdded")} - - - - {formatDate(Date.parse(details.dateAdded))} - - - {/if}{#if details.dateModified && dve.includes("dateModified")} - - - - {formatDate(Date.parse(details.dateModified))} - - - {/if}{#if details.lastWatched && dve.includes("lastWatched")} - - - {details.lastWatched} - - {/if}{#if dve.includes("statusRating")} - - {#if !isUsingThumbs} - - {/if} - - {#if isUsingThumbs} - {@const r = toWhichThumb(rating)} - {#if r === -1} - - {:else if r === 0} - - - - - {:else if r === 1} - - {/if} - {:else} - {toShowableRating(rating)} - {/if} - - {#if status} - - {/if} - - {/if} -
    -
    +
    + {#if details.dateAdded && store.wlDetailedView.includes("dateAdded")} + + + + {formatDate(Date.parse(details.dateAdded))} + + + {/if}{#if details.dateModified && store.wlDetailedView.includes("dateModified")} + + + + {formatDate(Date.parse(details.dateModified))} + + + {/if}{#if details.lastWatched && store.wlDetailedView.includes("lastWatched")} + + + {details.lastWatched} + + {/if}{#if store.wlDetailedView.includes("statusRating")} + + {#if !isUsingThumbs} + + {/if} + + {#if isUsingThumbs} + {@const r = toWhichThumb(rating)} + {#if r === -1} + + {:else if r === 0} + + - + + {:else if r === 1} + + {/if} + {:else} + {toShowableRating(rating)} + {/if} + + {#if status} + + {/if} + + {/if} +
    +
    {/if} diff --git a/src/lib/poster/GamePoster.svelte b/src/lib/poster/GamePoster.svelte index 20ce65f6..ab55b770 100644 --- a/src/lib/poster/GamePoster.svelte +++ b/src/lib/poster/GamePoster.svelte @@ -1,409 +1,464 @@ - +
  • { - mouseOverPoster = true; - if (!posterActive) calculateTransformOrigin(e); - if (!isTouch()) { - posterActive = true; - } - }} - on:focusin={(e) => { - if (!posterActive) calculateTransformOrigin(e); - if (!isTouch()) { - posterActive = true; - } - }} - on:focusout={() => { - if (!isTouch() && !mouseOverPoster) { - // Only on !isTouch (to match focusin) to avoid breaking a tap and hold on link on mobile. - // and only if mouse isn't still over the poster, fixes focusout on click of rating/status - // poster buttons causing poster to shrink until refocused with click/mouse out & in again. - posterActive = false; - } - }} - on:mouseleave={() => { - mouseOverPoster = false; - posterActive = false; - const ae = document.activeElement; - if ( - ae && - ae instanceof HTMLElement && - (ae.parentElement?.id === "ilikemoviessueme" || - ae.parentElement?.parentElement?.id === "ilikemoviessueme") - ) { - // Stops the poster being re-focused after the browser window - // loses focus, then regains it (ex: you middle click the poster, - // go to the opened tab (or lose browser window focus, then when - // you come back the poster is sent `focusin` and stuck activated - // until mouseleave again). - ae.blur(); - } - }} - on:click={() => (posterActive = true)} - on:keyup={(e) => { - if (e.key === "Tab") { - e.currentTarget.scrollIntoView({ block: "center" }); - } - }} - on:keypress={() => console.log("on kpress")} - class={`${posterActive ? "active " : ""}${pinned ? "pinned " : ""}`} + onmouseenter={(e) => { + mouseOverPoster = true; + if (!posterActive) calculateTransformOrigin(e); + if (!isTouch()) { + posterActive = true; + } + }} + onfocusin={(e) => { + if (!posterActive) calculateTransformOrigin(e); + if (!isTouch()) { + posterActive = true; + } + }} + onfocusout={() => { + if (!isTouch() && !mouseOverPoster) { + // Only on !isTouch (to match focusin) to avoid breaking a tap and hold on link on mobile. + // and only if mouse isn't still over the poster, fixes focusout on click of rating/status + // poster buttons causing poster to shrink until refocused with click/mouse out & in again. + posterActive = false; + } + }} + onmouseleave={posterOnMouseLeave} + onclick={() => (posterActive = true)} + onkeyup={(e) => { + if (e.key === "Tab") { + e.currentTarget.scrollIntoView({ block: "center" }); + } + }} + onkeypress={() => console.log("on kpress")} + class={`${posterActive ? "active " : ""}${pinned ? "pinned " : ""}`} > -
    - {#if poster && (media.coverId || media.poster?.path)} - {#if media?.poster?.blurHash} - - {:else} -
    - {/if} - { - addClassToParent(e, "img-loaded"); - }} - on:error={(e) => { - addClassToParent(e, "details-shown"); - }} - /> - {/if} - {#if id && !posterActive} - - - {/if} -
    { - if (typeof onClick !== "undefined") { - onClick(); - // Prevent the link inside this div from being clicked in this case. - e.preventDefault(); - return; - } - if (posterActive && link) goto(link); - }} - on:keyup={handleInnerKeyUp} - id="ilikemoviessueme" - class="inner" - role="button" - tabindex="-1" - > - -

    - {title} - {#if year} - - {/if} -

    - {media.summary} -
    - - {#if !hideButtons} -
    - - -
    - {/if} -
    -
    +
    + {#if poster && (media.coverId || media.poster?.path)} + {#if media?.poster?.blurHash} + + {:else} +
    + {/if} + { + addClassToParent(e, "img-loaded"); + }} + onerror={(e) => { + addClassToParent(e, "details-shown"); + }} + /> + {/if} + {#if id && !posterActive} + + + {/if} +
    { + if (typeof onClick !== "undefined") { + onClick(); + // Prevent the link inside this div from being clicked in this case. + e.preventDefault(); + return; + } + if (posterActive && link) goto(link); + }} + onkeyup={handleInnerKeyUp} + id="ilikemoviessueme" + class="inner" + role="button" + tabindex="-1" + > + +

    + {title} + {#if year} + + {/if} +

    + {media.summary} +
    + + {#if !hideButtons} +
    + + +
    + {/if} +
    +
  • diff --git a/src/lib/poster/PersonPoster.svelte b/src/lib/poster/PersonPoster.svelte index 5e373524..da449734 100644 --- a/src/lib/poster/PersonPoster.svelte +++ b/src/lib/poster/PersonPoster.svelte @@ -1,167 +1,184 @@ - +
  • calculateTransformOrigin(e)} - on:focusin={(e) => calculateTransformOrigin(e)} - on:click={() => { - if (link) goto(link); - }} - on:keypress={() => console.log("on kpress")} + onmouseenter={(e) => calculateTransformOrigin(e)} + onfocusin={(e) => calculateTransformOrigin(e)} + onclick={() => { + if (link) goto(link); + }} + onkeypress={() => console.log("on kpress")} > -
    - {#if poster} -
    - { - addClassToParent(e, "img-loaded"); - }} - on:error={(e) => { - console.log("on err"); - addClassToParent(e, "details-shown"); - }} - /> - {/if} -
    -

    - {#if link} - - {name} - - {:else} - {name} - {/if} -

    - {#if role} -

    {role}

    - {/if} -
    -
    +
    + {#if poster} +
    + { + addClassToParent(e, "img-loaded"); + }} + onerror={(e) => { + console.log("on err"); + addClassToParent(e, "details-shown"); + }} + /> + {/if} +
    +

    + {#if link} + + {name} + + {:else} + {name} + {/if} +

    + {#if role} +

    {role}

    + {/if} +
    +
  • diff --git a/src/lib/poster/Poster.svelte b/src/lib/poster/Poster.svelte index 28695494..93b7ac7c 100644 --- a/src/lib/poster/Poster.svelte +++ b/src/lib/poster/Poster.svelte @@ -1,370 +1,429 @@ - +
  • { - mouseOverPoster = true; - if (!posterActive) calculateTransformOrigin(e); - if (!isTouch()) { - posterActive = true; - } - }} - on:focusin={(e) => { - if (!posterActive) calculateTransformOrigin(e); - if (!isTouch()) { - posterActive = true; - } - }} - on:focusout={() => { - if (!isTouch() && !mouseOverPoster) { - // Only on !isTouch (to match focusin) to avoid breaking a tap and hold on link on mobile. - // and only if mouse isn't still over the poster, fixes focusout on click of rating/status - // poster buttons causing poster to shrink until refocused with click/mouse out & in again. - posterActive = false; - } - }} - on:mouseleave={() => { - mouseOverPoster = false; - posterActive = false; - const ae = document.activeElement; - if ( - ae && - ae instanceof HTMLElement && - (ae.parentElement?.id === "ilikemoviessueme" || - ae.parentElement?.parentElement?.id === "ilikemoviessueme") - ) { - // Stops the poster being re-focused after the browser window - // loses focus, then regains it (ex: you middle click the poster, - // go to the opened tab (or lose browser window focus, then when - // you come back the poster is sent `focusin` and stuck activated - // until mouseleave again). - ae.blur(); - } - }} - on:click={() => (posterActive = true)} - on:keyup={(e) => { - if (e.key === "Tab") { - e.currentTarget.scrollIntoView({ block: "center" }); - } - }} - on:keypress={() => console.log("on kpress")} - class={`${posterActive ? "active " : ""}${pinned ? "pinned " : ""}${hideIfNotOnList && !id ? "hidden " : ""}`} + onmouseenter={(e) => { + mouseOverPoster = true; + if (!posterActive) calculateTransformOrigin(e); + if (!isTouch()) { + posterActive = true; + } + }} + onfocusin={(e) => { + if (!posterActive) calculateTransformOrigin(e); + if (!isTouch()) { + posterActive = true; + } + }} + onfocusout={() => { + if (!isTouch() && !mouseOverPoster) { + // Only on !isTouch (to match focusin) to avoid breaking a tap and hold on link on mobile. + // and only if mouse isn't still over the poster, fixes focusout on click of rating/status + // poster buttons causing poster to shrink until refocused with click/mouse out & in again. + posterActive = false; + } + }} + onmouseleave={posterOnMouseLeave} + onclick={() => (posterActive = true)} + onkeyup={(e) => { + if (e.key === "Tab") { + e.currentTarget.scrollIntoView({ block: "center" }); + } + }} + onkeypress={() => console.log("on kpress")} + class={`${posterActive ? "active " : ""}${pinned ? "pinned " : ""}${hideIfNotOnList && !id ? "hidden " : ""}`} > -
    - {#if poster && media.poster_path} -
    - { - addClassToParent(e, "img-loaded"); - }} - on:error={(e) => { - addClassToParent(e, "details-shown"); - }} - /> - {/if} - {#if id && !posterActive} - - - {/if} -
    { - if (typeof onClick !== "undefined") { - onClick(); - // Prevent the link inside this div from being clicked in this case. - e.preventDefault(); - return; - } - if (posterActive && link) goto(link); - }} - on:keyup={handleInnerKeyUp} - id="ilikemoviessueme" - class="inner" - role="button" - tabindex="-1" - > - -

    - {title} - {#if year} - - {/if} -

    - {media.overview} -
    - - {#if !hideButtons} -
    - - -
    - {/if} -
    -
    +
    + {#if poster && media.poster_path} +
    + { + addClassToParent(e, "img-loaded"); + }} + onerror={(e) => { + addClassToParent(e, "details-shown"); + }} + /> + {/if} + {#if id && !posterActive} + + + {/if} +
    { + if (typeof onClick !== "undefined") { + onClick(); + // Prevent the link inside this div from being clicked in this case. + e.preventDefault(); + return; + } + if (posterActive && link) goto(link); + }} + onkeyup={handleInnerKeyUp} + id="ilikemoviessueme" + class="inner" + role="button" + tabindex="-1" + > + +

    + {title} + {#if year} + + {/if} +

    + {media.overview} +
    + + {#if !hideButtons} +
    + + +
    + {/if} +
    +
  • diff --git a/src/lib/poster/PosterList.svelte b/src/lib/poster/PosterList.svelte index f64f7ea8..f9523943 100644 --- a/src/lib/poster/PosterList.svelte +++ b/src/lib/poster/PosterList.svelte @@ -1,66 +1,71 @@
    -
      - -
    +
      + {@render children?.()} +
    diff --git a/src/lib/poster/PosterRating.svelte b/src/lib/poster/PosterRating.svelte index 142c18b9..b24103d2 100644 --- a/src/lib/poster/PosterRating.svelte +++ b/src/lib/poster/PosterRating.svelte @@ -1,256 +1,298 @@ - - - {:else} - {@const stars = - settings?.ratingSystem == RatingSystem.OutOf5 - ? [5, 4, 3, 2, 1] - : [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]} - {#each stars as v} - - {/each} - {/if} - +
    + {#if isUsingThumbs} + + + + + + + {:else} + {@const stars = + store.userSettings?.ratingSystem == RatingSystem.OutOf5 + ? [5, 4, 3, 2, 1] + : [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]} + {#each stars as v} + + + {/each} + {/if} +
    diff --git a/src/lib/poster/PosterStatus.svelte b/src/lib/poster/PosterStatus.svelte index a5cdede2..29beead9 100644 --- a/src/lib/poster/PosterStatus.svelte +++ b/src/lib/poster/PosterStatus.svelte @@ -1,150 +1,169 @@ - {/each} - {#if status} - - {/if} - + {#if status} + + {:else} + + + {/if} +
    + {#each Object.entries(watchedStatuses) as [statusName, icon]} + + + {/each} + {#if status} + + + {/if} +
    diff --git a/src/lib/rating/Rating.svelte b/src/lib/rating/Rating.svelte index 73440d72..14fec8b6 100644 --- a/src/lib/rating/Rating.svelte +++ b/src/lib/rating/Rating.svelte @@ -1,30 +1,32 @@
    - {#if settings?.ratingSystem === RatingSystem.Thumbs} - - {:else} - - - {/if} + {#if store.userSettings?.ratingSystem === RatingSystem.Thumbs} + + {:else} + + + {/if}
    diff --git a/src/lib/rating/RatingSetting.svelte b/src/lib/rating/RatingSetting.svelte index 603b26fa..33dfa26f 100644 --- a/src/lib/rating/RatingSetting.svelte +++ b/src/lib/rating/RatingSetting.svelte @@ -1,130 +1,158 @@ -
    - - - - -
    +
    + + + + +
    -{#if settings?.ratingSystem === RatingSystem.OutOf10 || settings?.ratingSystem === RatingSystem.OutOf5 || !settings?.ratingSystem} - -
    - - - -
    -
    +{#if store.userSettings?.ratingSystem === RatingSystem.OutOf10 || store.userSettings?.ratingSystem === RatingSystem.OutOf5 || !store.userSettings?.ratingSystem} + +
    + + + +
    +
    {/if} diff --git a/src/lib/rating/StarRating.svelte b/src/lib/rating/StarRating.svelte index 93332778..2535e59a 100644 --- a/src/lib/rating/StarRating.svelte +++ b/src/lib/rating/StarRating.svelte @@ -1,259 +1,276 @@
    - - {#if hoveredRating} - {#if settings?.ratingSystem === RatingSystem.OutOf5 && shownPerc} - {ratingDesc[Math.ceil(shownPerc / 10) - 1]} - {:else} - {ratingDesc[Math.ceil(hoveredRating) - 1]} - {/if} - {#if settings?.ratingSystem === RatingSystem.OutOf100} - ({shownPerc}) - {:else} - ({hoveredRating}) - {/if} - {:else if typeof rating === "number" && rating > 0} - {ratingDesc[Math.ceil(rating) - 1]} - {#if shownPerc} - {#if settings?.ratingSystem === RatingSystem.OutOf100} - ({shownPerc}) - {:else if settings?.ratingSystem === RatingSystem.OutOf5} - ({shownPerc / 20}) - {:else} - ({shownPerc / 10}) - {/if} - {/if} - {:else} - Select Your Rating - {/if} - -
    handleMouseOver(ev)} - on:touchmove={(ev) => handleMouseOver(ev)} - on:touchstart={(ev) => { - // Prevent `click` event from triggering. - // Mainly for firefox mobile, these events dont work the same - // there (as chromium mobile), so forcing touch devices to use - // this flow (touchstart -> touchend) for clicks too will - // workaround that difference. - ev.preventDefault(); - handleMouseOver(ev); - }} - on:mouseleave={(ev) => { - if (!ev.relatedTarget) { - // When not focused on the browser, and then clicking a star directly - // without first focusing the browser, this event can be triggered, - // which causes hoveredRating to reset. This check seems to fix that. - console.debug("rating-wrap: mouseleave event triggered, but me think mistake.. ignoring."); - return; - } - console.debug("rating-wrap: mouseleave"); - handleRatingHoverEnd(); - }} - on:touchend={async () => { - console.debug("rating-wrap: touchend"); - await saveSelectedRating(); - handleRatingHoverEnd(); - }} - on:blur={() => { - console.debug("rating-wrap: blur"); - handleRatingHoverEnd(); - }} - on:click={() => { - saveSelectedRating(); - }} - on:keydown={(ev) => handleKeyDown(ev)} - role="button" - tabindex="0" - > - -
    - {#each stars as _} - - {/each} -
    - -
    - {#each stars as _} - - {/each} -
    - -
    - {#each stars as _} - - {/each} -
    -
    - Left/Right Arrows to change rating, Enter to save. + + {#if hoveredRating} + {#if store.userSettings?.ratingSystem === RatingSystem.OutOf5 && shownPerc} + {ratingDesc[Math.ceil(shownPerc / 10) - 1]} + {:else} + {ratingDesc[Math.ceil(hoveredRating) - 1]} + {/if} + {#if store.userSettings?.ratingSystem === RatingSystem.OutOf100} + ({shownPerc}) + {:else} + ({hoveredRating}) + {/if} + {:else if typeof rating === "number" && rating > 0} + {ratingDesc[Math.ceil(rating) - 1]} + {#if shownPerc} + {#if store.userSettings?.ratingSystem === RatingSystem.OutOf100} + ({shownPerc}) + {:else if store.userSettings?.ratingSystem === RatingSystem.OutOf5} + ({shownPerc / 20}) + {:else} + ({shownPerc / 10}) + {/if} + {/if} + {:else} + Select Your Rating + {/if} + +
    handleMouseOver(ev)} + ontouchmove={(ev) => handleMouseOver(ev)} + ontouchstart={(ev) => { + // Prevent `click` event from triggering. + // Mainly for firefox mobile, these events dont work the same + // there (as chromium mobile), so forcing touch devices to use + // this flow (touchstart -> touchend) for clicks too will + // workaround that difference. + ev.preventDefault(); + handleMouseOver(ev); + }} + onmouseleave={(ev) => { + if (!ev.relatedTarget) { + // When not focused on the browser, and then clicking a star directly + // without first focusing the browser, this event can be triggered, + // which causes hoveredRating to reset. This check seems to fix that. + console.debug( + "rating-wrap: mouseleave event triggered, but me think mistake.. ignoring.", + ); + return; + } + console.debug("rating-wrap: mouseleave"); + handleRatingHoverEnd(); + }} + ontouchend={async () => { + console.debug("rating-wrap: touchend"); + await saveSelectedRating(); + handleRatingHoverEnd(); + }} + onblur={() => { + console.debug("rating-wrap: blur"); + handleRatingHoverEnd(); + }} + onclick={() => { + saveSelectedRating(); + }} + onkeydown={(ev) => handleKeyDown(ev)} + role="button" + tabindex="0" + > + +
    + {#each stars as _} + + {/each} +
    + +
    + {#each stars as _} + + {/each} +
    + +
    + {#each stars as _} + + {/each} +
    +
    + Left/Right Arrows to change rating, Enter to save.
    diff --git a/src/lib/rating/ThumbRating.svelte b/src/lib/rating/ThumbRating.svelte index a648cade..5e15992d 100644 --- a/src/lib/rating/ThumbRating.svelte +++ b/src/lib/rating/ThumbRating.svelte @@ -1,63 +1,67 @@
    - - - + + +
    diff --git a/src/lib/rating/helpers.ts b/src/lib/rating/helpers.ts index 2c65e4b5..6a498a74 100644 --- a/src/lib/rating/helpers.ts +++ b/src/lib/rating/helpers.ts @@ -1,4 +1,4 @@ -import { userSettings } from "@/store"; +import { store } from "@/store.svelte"; import { RatingStep, RatingSystem } from "@/types"; import { get } from "svelte/store"; @@ -9,47 +9,49 @@ import { get } from "svelte/store"; * Only used for star ratings, not thumbs. */ export function toShowableRating(r?: number) { - if (!r) { - return 0; - } - const settings = get(userSettings); - if (!settings || (!settings.ratingSystem && !settings.ratingStep)) { - return Math.round(r); - } - if (settings.ratingSystem === RatingSystem.OutOf100) { - return r * 10; - } - if (settings.ratingSystem === RatingSystem.OutOf5) { - if (settings.ratingStep === RatingStep.Point5) { - return Math.ceil((r / 2) * 2) / 2; - } - if (settings.ratingStep === RatingStep.Point1) { - return Math.round((r / 2) * 10) / 10; - } - return Math.round(r / 2); - } - if (settings.ratingSystem === RatingSystem.OutOf10) { - if (settings.ratingStep === RatingStep.Point5) { - return Math.ceil(r * 2) / 2; - } - if (settings.ratingStep === RatingStep.Point1) { - return r; - } - return Math.round(r); - } - return Math.round(r); + if (!r) { + return 0; + } + if ( + !store.userSettings || + (!store.userSettings.ratingSystem && !store.userSettings.ratingStep) + ) { + return Math.round(r); + } + if (store.userSettings.ratingSystem === RatingSystem.OutOf100) { + return r * 10; + } + if (store.userSettings.ratingSystem === RatingSystem.OutOf5) { + if (store.userSettings.ratingStep === RatingStep.Point5) { + return Math.ceil((r / 2) * 2) / 2; + } + if (store.userSettings.ratingStep === RatingStep.Point1) { + return Math.round((r / 2) * 10) / 10; + } + return Math.round(r / 2); + } + if (store.userSettings.ratingSystem === RatingSystem.OutOf10) { + if (store.userSettings.ratingStep === RatingStep.Point5) { + return Math.ceil(r * 2) / 2; + } + if (store.userSettings.ratingStep === RatingStep.Point1) { + return r; + } + return Math.round(r); + } + return Math.round(r); } export function toWhichThumb(r?: number) { - if (!r) { - return; - } - const rr = Math.round(r); - if (rr > 0 && rr <= 4) { - return -1; - } else if (r >= 4 && r <= 7) { - return 0; - } else if (r >= 8) { - return 1; - } + if (!r) { + return; + } + const rr = Math.round(r); + if (rr > 0 && rr <= 4) { + return -1; + } else if (r >= 4 && r <= 7) { + return 0; + } else if (r >= 8) { + return 1; + } } diff --git a/src/lib/request/ArrRequestButton.svelte b/src/lib/request/ArrRequestButton.svelte index bcaa690c..fe84998a 100644 --- a/src/lib/request/ArrRequestButton.svelte +++ b/src/lib/request/ArrRequestButton.svelte @@ -1,219 +1,243 @@ {#if typeof status === "object" || status === "requested"} - + {:else if status === "available" || status === "FOUND"} - + {:else if status === "PENDING"} - + {:else if status === "APPROVED"} - + {:else if status === "AUTO_APPROVED"} - + {:else if status === "DENIED"} - + {:else} - + {/if} diff --git a/src/lib/request/RequestMovie.svelte b/src/lib/request/RequestMovie.svelte index 2ce29e3f..b9fd092e 100644 --- a/src/lib/request/RequestMovie.svelte +++ b/src/lib/request/RequestMovie.svelte @@ -1,195 +1,213 @@ onClose(undefined)} + title={approveMode ? "Approve Request" : "Request"} + desc={content.title} + onClose={() => onClose(undefined)} > -
    - {#if servarrs} - {@const server = servarrs[selectedServarrIndex]} +
    + {#if servarrs} + {@const server = servarrs[selectedServarrIndex]} - {#if servarrs?.length > 1} - - 0 - ? servarrs.map((s, i) => { - return { id: i, value: s.name }; - }) - : []} - /> - - {/if} + {#if servarrs?.length > 1} + + 0 + ? servarrs.map((s, i) => { + return { id: i, value: s.name }; + }) + : []} + /> + + {/if} - - {:else} - - {/if} -
    + + {:else} + + {/if} +
    diff --git a/src/lib/request/RequestShow.svelte b/src/lib/request/RequestShow.svelte index 3919295e..b563f44e 100644 --- a/src/lib/request/RequestShow.svelte +++ b/src/lib/request/RequestShow.svelte @@ -1,240 +1,262 @@ onClose(undefined)} + title={approveMode ? "Approve Request" : "Request"} + desc={content.name} + onClose={() => onClose(undefined)} > -
    - {#if servarrs} - {@const server = servarrs[selectedServarrIndex]} - -
    - -
    - - {#if servarrs?.length > 1} - - 0 - ? servarrs.map((s, i) => { - return { id: i, value: s.name }; - }) - : []} - /> - - {/if} - - - {:else} - - {/if} -
    +
    + {#if servarrs} + {@const server = servarrs[selectedServarrIndex]} + +
    + +
    + + {#if servarrs?.length > 1} + + 0 + ? servarrs.map((s, i) => { + return { id: i, value: s.name }; + }) + : []} + /> + + {/if} + + + {:else} + + {/if} +
    diff --git a/src/lib/settings/Setting.svelte b/src/lib/settings/Setting.svelte index afdac536..f140a518 100644 --- a/src/lib/settings/Setting.svelte +++ b/src/lib/settings/Setting.svelte @@ -1,73 +1,84 @@
    - {#if row} -
    -

    - {title} - {#if tag} - {tag} - {/if} -

    -
    {desc}
    -
    - {:else} -

    - {title} - {#if tag} - {tag} - {/if} -

    -
    {desc}
    - {/if} + {#if row} +
    +

    + {title} + {#if tag} + {tag} + {/if} +

    +
    {desc}
    +
    + {:else} +

    + {title} + {#if tag} + {tag} + {/if} +

    +
    {desc}
    + {/if} - + {@render children?.()}
    diff --git a/src/lib/settings/SettingButton.svelte b/src/lib/settings/SettingButton.svelte index 69d648db..5e35ae8e 100644 --- a/src/lib/settings/SettingButton.svelte +++ b/src/lib/settings/SettingButton.svelte @@ -1,54 +1,58 @@ - diff --git a/src/lib/settings/SettingsList.svelte b/src/lib/settings/SettingsList.svelte index a737c782..b709778d 100644 --- a/src/lib/settings/SettingsList.svelte +++ b/src/lib/settings/SettingsList.svelte @@ -1,12 +1,20 @@ + +
    - + {@render children?.()}
    diff --git a/src/lib/stats/Stat.svelte b/src/lib/stats/Stat.svelte index f502bdf8..842530ee 100644 --- a/src/lib/stats/Stat.svelte +++ b/src/lib/stats/Stat.svelte @@ -1,48 +1,58 @@ - {#if disc} -
    *
    - {/if} - {value} - {name} + {#if disc} +
    *
    + {/if} + {value} + {name}
    diff --git a/src/lib/stats/Stats.svelte b/src/lib/stats/Stats.svelte index 2464f6fa..29918362 100644 --- a/src/lib/stats/Stats.svelte +++ b/src/lib/stats/Stats.svelte @@ -1,13 +1,21 @@ + +
    - + {@render children?.()}
    diff --git a/src/lib/tag/AddToTagButton.svelte b/src/lib/tag/AddToTagButton.svelte index 39ec0955..bef832be 100644 --- a/src/lib/tag/AddToTagButton.svelte +++ b/src/lib/tag/AddToTagButton.svelte @@ -1,58 +1,68 @@
    - - - {#if menuOpen} - { - console.debug("Tag: Adding content to tag. Remove?:", remove); - if (remove) { - untagWatched(watchedItem.id, tag); - } else { - tagWatched(watchedItem.id, tag); - } - }} - /> - {/if} + + + {#if menuOpen} + { + console.debug("Tag: Adding content to tag. Remove?:", remove); + if (remove) { + untagWatched(watchedItem.id, tag); + } else { + tagWatched(watchedItem.id, tag); + } + }} + menuConfig={{ + top: "50px", + right: "-78px", + arrowLeft: "87px", + /* The place where this button will be is always dark, so white works for both themes */ + arrowColor: "white", + }} + /> + {/if}
    diff --git a/src/lib/tag/CreateTagModal.svelte b/src/lib/tag/CreateTagModal.svelte index b5147298..aeb5ed88 100644 --- a/src/lib/tag/CreateTagModal.svelte +++ b/src/lib/tag/CreateTagModal.svelte @@ -1,154 +1,171 @@
    - - - - - - - - - - - - - - + + + + + + + + + + + + + +
    diff --git a/src/lib/tag/DeleteTagModal.svelte b/src/lib/tag/DeleteTagModal.svelte index 355b6b02..c7733464 100644 --- a/src/lib/tag/DeleteTagModal.svelte +++ b/src/lib/tag/DeleteTagModal.svelte @@ -1,102 +1,112 @@ -
    - - -
    +
    + + +
    diff --git a/src/lib/tag/Tag.svelte b/src/lib/tag/Tag.svelte index 1e451f10..ef925774 100644 --- a/src/lib/tag/Tag.svelte +++ b/src/lib/tag/Tag.svelte @@ -1,48 +1,54 @@ diff --git a/src/lib/tag/TagMenu.svelte b/src/lib/tag/TagMenu.svelte index abf3b67c..9015eafa 100644 --- a/src/lib/tag/TagMenu.svelte +++ b/src/lib/tag/TagMenu.svelte @@ -1,160 +1,154 @@ -
    .arrow" }}> - -
    -
    -

    {titleText ? titleText : "my tags"}

    - {#if showManageBtn} - - {/if} - -
    - {#if allTags && allTags.length > 0} - {#if inManageMode} - Click a tag to delete it. - {/if} -
    - {#each allTags as t} - {@const isSelected = selectedTags - ? selectedTags.find((tag) => tag.id === t.id) - ? true - : false - : false} -
    - (inManageMode ? deleteTag(t) : onTagClick(t, isSelected))} - /> - {#if isSelected} - - {/if} -
    - {/each} -
    - {:else} - You have no tags yet! - {/if} -
    -
    + +
    +

    {titleText ? titleText : "my tags"}

    + {#if showManageBtn} + + {/if} + +
    + {#if allTags && allTags.length > 0} + {#if inManageMode} + Click a tag to delete it. + {/if} +
    + {#each allTags as t} + {@const isSelected = selectedTags + ? selectedTags.find((tag) => tag.id === t.id) + ? true + : false + : false} +
    + + inManageMode ? deleteTag(t) : onTagClick(t, isSelected)} + /> + {#if isSelected} + + {/if} +
    + {/each} +
    + {:else} + You have no tags yet! + {/if} +
    {#if tagModalOpen} - (tagModalOpen = false)} /> + (tagModalOpen = false)} /> {/if} {#if tagToDelete} - (tagToDelete = undefined)} /> + (tagToDelete = undefined)} /> {/if} diff --git a/src/lib/tag/api.ts b/src/lib/tag/api.ts index a4a77208..b6d0bbac 100644 --- a/src/lib/tag/api.ts +++ b/src/lib/tag/api.ts @@ -1,61 +1,73 @@ -import { watchedList } from "@/store"; +import { store } from "@/store.svelte"; import axios from "axios"; -import { get } from "svelte/store"; import { notify } from "../util/notify"; import type { Tag } from "@/types"; -export async function tagWatched(watchedId: number, tag: Tag): Promise { - // If item is already in watched store, run update request instead - const wList = get(watchedList); - const wEntry = wList.find((w) => w.id === watchedId); - const nid = notify({ text: `Tagging`, type: "loading" }); - if (!wEntry) { - notify({ id: nid, text: "Failed To Tag! Watched entry not found.", type: "error" }); - return false; - } - return await axios - .post(`/watched/${watchedId}/tag/${tag.id}`) - .then((resp) => { - console.log("tagWatched: Status:", resp.status); - if (!wEntry.tags) { - wEntry.tags = [tag]; - } else { - wEntry.tags.push(tag); - } - watchedList.update(() => wList); - notify({ id: nid, text: `Tagged!`, type: "success" }); - return true; - }) - .catch((err) => { - console.error("tagWatched: Request failed!", err); - notify({ id: nid, text: "Failed To Tag!", type: "error" }); - return false; - }); +export async function tagWatched( + watchedId: number, + tag: Tag, +): Promise { + // If item is already in watched store, run update request instead + const wEntry = store.watchedList.find((w) => w.id === watchedId); + const nid = notify({ text: `Tagging`, type: "loading" }); + if (!wEntry) { + notify({ + id: nid, + text: "Failed To Tag! Watched entry not found.", + type: "error", + }); + return false; + } + return await axios + .post(`/watched/${watchedId}/tag/${tag.id}`) + .then((resp) => { + console.log("tagWatched: Status:", resp.status); + if (!wEntry.tags) { + wEntry.tags = [tag]; + } else { + wEntry.tags.push(tag); + } + // watchedList.update(() => wList); + notify({ id: nid, text: `Tagged!`, type: "success" }); + return true; + }) + .catch((err) => { + console.error("tagWatched: Request failed!", err); + notify({ id: nid, text: "Failed To Tag!", type: "error" }); + return false; + }); } -export async function untagWatched(watchedId: number, tag: Tag): Promise { - // If item is already in watched store, run update request instead - const wList = get(watchedList); - const wEntry = wList.find((w) => w.id === watchedId); - const nid = notify({ text: `Untagging`, type: "loading" }); - if (!wEntry) { - notify({ id: nid, text: "Failed To Untag! Watched entry not found.", type: "error" }); - return false; - } - return await axios - .delete(`/watched/${watchedId}/tag/${tag.id}`) - .then((resp) => { - console.log("untagWatched: Status:", resp.status); - if (wEntry.tags) { - wEntry.tags = wEntry.tags.filter((t) => t.id !== tag.id); - } - watchedList.update(() => wList); - notify({ id: nid, text: `Untagged!`, type: "success" }); - return true; - }) - .catch((err) => { - console.error("untagWatched: Request failed!", err); - notify({ id: nid, text: "Failed To Untag!", type: "error" }); - return false; - }); +export async function untagWatched( + watchedId: number, + tag: Tag, +): Promise { + // If item is already in watched store, run update request instead + // const wList = get(watchedList); + const wEntry = store.watchedList.find((w) => w.id === watchedId); + const nid = notify({ text: `Untagging`, type: "loading" }); + if (!wEntry) { + notify({ + id: nid, + text: "Failed To Untag! Watched entry not found.", + type: "error", + }); + return false; + } + return await axios + .delete(`/watched/${watchedId}/tag/${tag.id}`) + .then((resp) => { + console.log("untagWatched: Status:", resp.status); + if (wEntry.tags) { + wEntry.tags = wEntry.tags.filter((t) => t.id !== tag.id); + } + // watchedList.update(() => wList); + notify({ id: nid, text: `Untagged!`, type: "success" }); + return true; + }) + .catch((err) => { + console.error("untagWatched: Request failed!", err); + notify({ id: nid, text: "Failed To Untag!", type: "error" }); + return false; + }); } diff --git a/src/lib/user/UserTypeIcon.svelte b/src/lib/user/UserTypeIcon.svelte index 423679a1..5a13d55b 100644 --- a/src/lib/user/UserTypeIcon.svelte +++ b/src/lib/user/UserTypeIcon.svelte @@ -1,27 +1,31 @@ {#if !type} - - W - + + W + {:else if type == UserType.Jellyfin} - + {:else if type == UserType.Plex} - + {:else if type == UserType.Proxy} - + {:else} - - - ? - + + + ? + {/if} diff --git a/src/lib/util/api.ts b/src/lib/util/api.ts index 191fed3f..f5d62de0 100644 --- a/src/lib/util/api.ts +++ b/src/lib/util/api.ts @@ -1,30 +1,29 @@ -import { follows, serverFeatures, userInfo, userSettings, watchedList } from "@/store"; +import { store } from "@/store.svelte"; import { - UserType, - type JellyfinFoundContent, - type MediaType, - type Watched, - type WatchedAddRequest, - type WatchedStatus, - type WatchedUpdateRequest, - type WatchedUpdateResponse, - type UserSettings, - type Follow, - type PlayedAddRequest, - type ActivityUpdateRequest + UserType, + type JellyfinFoundContent, + type MediaType, + type Watched, + type WatchedAddRequest, + type WatchedStatus, + type WatchedUpdateRequest, + type WatchedUpdateResponse, + type UserSettings, + type Follow, + type PlayedAddRequest, + type ActivityUpdateRequest, } from "@/types"; import axios from "axios"; -import { get } from "svelte/store"; import { notify, unNotify } from "./notify"; import { browser } from "$app/environment"; const { MODE } = import.meta.env; export const baseURL = - MODE === "development" - ? browser - ? `${location.protocol}//${location.hostname}:3080/api` - : "http://127.0.0.1:3080/api" - : "/api"; + MODE === "development" + ? browser + ? `${location.protocol}//${location.hostname}:3080/api` + : "http://127.0.0.1:3080/api" + : "/api"; console.log("api: baseURL constructed:", baseURL); /** @@ -32,50 +31,57 @@ console.log("api: baseURL constructed:", baseURL); * @returns Was success? */ async function _updateWatched( - wEntry: Watched, - status?: WatchedStatus, - rating?: number, - thoughts?: string, - pinned?: boolean + wEntry: Watched, + status?: WatchedStatus, + rating?: number, + thoughts?: string, + pinned?: boolean, ): Promise { - if (!status && !rating && typeof thoughts === "undefined" && typeof pinned === "undefined") { - console.warn("_updateWatched: Nothing was provided, so nothing can be updated!!!!"); - return false; - } - const nid = notify({ text: `Saving`, type: "loading" }); - const obj = {} as WatchedUpdateRequest; - if (status) obj.status = status; - if (rating) obj.rating = rating; - if (typeof thoughts !== "undefined") obj.thoughts = thoughts; - if (thoughts === "") obj.removeThoughts = true; - if (typeof pinned !== "undefined") obj.pinned = pinned; - return await axios - .put(`/watched/${wEntry.id}`, obj) - .then((resp) => { - if (status) wEntry.status = status; - if (rating) wEntry.rating = rating; - if (typeof thoughts !== "undefined") wEntry.thoughts = thoughts; - if (typeof pinned !== "undefined") wEntry.pinned = pinned; - if (resp?.data?.newActivity && resp?.data?.newActivity?.id) { - if (wEntry.activity?.length > 0) { - wEntry.activity.push(resp.data.newActivity); - } else { - wEntry.activity = [resp.data.newActivity]; - } - // We want to update the updatedAt field too (so - // change is reflected when filtering modified at) - // We can piggy back from this data for now. - wEntry.updatedAt = resp.data.newActivity.createdAt; - } - watchedList.update((w) => w); - notify({ id: nid, text: `Saved!`, type: "success" }); - return true; - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed To Update!", type: "error" }); - return false; - }); + if ( + !status && + !rating && + typeof thoughts === "undefined" && + typeof pinned === "undefined" + ) { + console.warn( + "_updateWatched: Nothing was provided, so nothing can be updated!!!!", + ); + return false; + } + const nid = notify({ text: `Saving`, type: "loading" }); + const obj = {} as WatchedUpdateRequest; + if (status) obj.status = status; + if (rating) obj.rating = rating; + if (typeof thoughts !== "undefined") obj.thoughts = thoughts; + if (thoughts === "") obj.removeThoughts = true; + if (typeof pinned !== "undefined") obj.pinned = pinned; + return await axios + .put(`/watched/${wEntry.id}`, obj) + .then((resp) => { + if (status) wEntry.status = status; + if (rating) wEntry.rating = rating; + if (typeof thoughts !== "undefined") wEntry.thoughts = thoughts; + if (typeof pinned !== "undefined") wEntry.pinned = pinned; + if (resp?.data?.newActivity && resp?.data?.newActivity?.id) { + if (wEntry.activity?.length > 0) { + wEntry.activity.push(resp.data.newActivity); + } else { + wEntry.activity = [resp.data.newActivity]; + } + // We want to update the updatedAt field too (so + // change is reflected when filtering modified at) + // We can piggy back from this data for now. + wEntry.updatedAt = resp.data.newActivity.createdAt; + } + // watchedList.update((w) => w); + notify({ id: nid, text: `Saved!`, type: "success" }); + return true; + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed To Update!", type: "error" }); + return false; + }); } /** @@ -87,42 +93,40 @@ async function _updateWatched( * @returns Was success? */ export async function updateWatched( - contentId: number, - contentType: MediaType, - status?: WatchedStatus, - rating?: number, - thoughts?: string, - pinned?: boolean + contentId: number, + contentType: MediaType, + status?: WatchedStatus, + rating?: number, + thoughts?: string, + pinned?: boolean, ): Promise { - // If item is already in watched store, run update request instead - const wList = get(watchedList); - const wEntry = wList.find( - (w) => w.content?.tmdbId === contentId && w.content?.type === contentType - ); - if (wEntry?.id) { - return await _updateWatched(wEntry, status, rating, thoughts, pinned); - } - // Add new watched item - const nid = notify({ text: `Adding`, type: "loading" }); - return await axios - .post("/watched", { - contentId, - contentType, - rating, - status - } as WatchedAddRequest) - .then((resp) => { - console.log("Added watched:", resp.data); - wList.push(resp.data as Watched); - watchedList.update(() => wList); - notify({ id: nid, text: `Added!`, type: "success" }); - return true; - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed To Add!", type: "error" }); - return false; - }); + // If item is already in watched store, run update request instead + const wEntry = store.watchedList.find( + (w) => w.content?.tmdbId === contentId && w.content?.type === contentType, + ); + if (wEntry?.id) { + return await _updateWatched(wEntry, status, rating, thoughts, pinned); + } + // Add new watched item + const nid = notify({ text: `Adding`, type: "loading" }); + return await axios + .post("/watched", { + contentId, + contentType, + rating, + status, + } as WatchedAddRequest) + .then((resp) => { + console.log("Added watched:", resp.data); + store.watchedList.push(resp.data as Watched); + notify({ id: nid, text: `Added!`, type: "success" }); + return true; + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed To Add!", type: "error" }); + return false; + }); } /** @@ -130,236 +134,230 @@ export async function updateWatched( * @param id Watched Entry ID */ export function removeWatched(id: number) { - const nid = notify({ text: `Removing`, type: "loading" }); - const wList = get(watchedList); - const wEntry = wList.find((w) => w.id === id); - if (!wEntry) { - console.log("Watched entry does not exist!"); - notify({ text: "Item Doesn't Exist On Watched List!", type: "error" }); - return; - } - axios - .delete(`/watched/${id}`) - .then((resp) => { - console.log("Removed watched:", resp.data); - const newList = wList.filter((w) => w.id !== id); - watchedList.update(() => newList); - notify({ id: nid, text: "Removed!", type: "error" }); - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed To Remove!", type: "error" }); - }); + const nid = notify({ text: `Removing`, type: "loading" }); + const wEntry = store.watchedList.find((w) => w.id === id); + if (!wEntry) { + console.log("Watched entry does not exist!"); + notify({ text: "Item Doesn't Exist On Watched List!", type: "error" }); + return; + } + axios + .delete(`/watched/${id}`) + .then((resp) => { + console.log("Removed watched:", resp.data); + store.watchedList = store.watchedList.filter((w) => w.id !== id); + notify({ id: nid, text: "Removed!", type: "error" }); + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed To Remove!", type: "error" }); + }); } export async function updatePlayed( - igdbId: number, - status?: WatchedStatus, - rating?: number, - thoughts?: string, - pinned?: boolean + igdbId: number, + status?: WatchedStatus, + rating?: number, + thoughts?: string, + pinned?: boolean, ): Promise { - // If item is already in watched store, run update request instead - const wList = get(watchedList); - const wEntry = wList.find((w) => w.game?.igdbId === igdbId); - if (wEntry?.id) { - return await _updateWatched(wEntry, status, rating, thoughts, pinned); - } - // Add new played item - const nid = notify({ text: `Adding`, type: "loading" }); - return await axios - .post("/game/played", { - igdbId, - rating, - status - } as PlayedAddRequest) - .then((resp) => { - console.log("Added watched(played) game:", resp.data); - wList.push(resp.data as Watched); - watchedList.update(() => wList); - notify({ id: nid, text: `Added!`, type: "success" }); - return true; - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed To Add!", type: "error" }); - return false; - }); + // If item is already in watched store, run update request instead + const wEntry = store.watchedList.find((w) => w.game?.igdbId === igdbId); + if (wEntry?.id) { + return await _updateWatched(wEntry, status, rating, thoughts, pinned); + } + // Add new played item + const nid = notify({ text: `Adding`, type: "loading" }); + return await axios + .post("/game/played", { + igdbId, + rating, + status, + } as PlayedAddRequest) + .then((resp) => { + console.log("Added watched(played) game:", resp.data); + store.watchedList.push(resp.data as Watched); + notify({ id: nid, text: `Added!`, type: "success" }); + return true; + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed To Add!", type: "error" }); + return false; + }); } -export function updateActivity(watchedId: number, activityId: number, date: Date) { - const nid = notify({ text: "Updating", type: "loading" }); - console.debug("updateActivity called", watchedId, activityId, date); - try { - axios - .put("/activity/" + activityId, { - customDate: date.toISOString() - } as ActivityUpdateRequest) - .then((resp) => { - console.log("Updated activity timestamp:", resp.status); - const wList = get(watchedList); - const activity = wList - .find((w) => w.id === watchedId) - ?.activity.find((a) => a.id === activityId); - if (activity) { - activity.customDate = date.toISOString(); - watchedList.update(() => wList); - } - notify({ id: nid, text: "Updated!", type: "success" }); - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed to Update!", type: "error" }); - }); - } catch (err) { - console.error("updateActivity failed!", err); - notify({ id: nid, text: "Failed!", type: "error" }); - } +export function updateActivity( + watchedId: number, + activityId: number, + date: Date, +) { + const nid = notify({ text: "Updating", type: "loading" }); + console.debug("updateActivity called", watchedId, activityId, date); + try { + axios + .put("/activity/" + activityId, { + customDate: date.toISOString(), + } as ActivityUpdateRequest) + .then((resp) => { + console.log("Updated activity timestamp:", resp.status); + const activity = store.watchedList + .find((w) => w.id === watchedId) + ?.activity.find((a) => a.id === activityId); + if (activity) { + activity.customDate = date.toISOString(); + } + notify({ id: nid, text: "Updated!", type: "success" }); + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed to Update!", type: "error" }); + }); + } catch (err) { + console.error("updateActivity failed!", err); + notify({ id: nid, text: "Failed!", type: "error" }); + } } export function removeActivity(watchedId: number, activityId: number) { - const nid = notify({ text: "Deleting", type: "loading" }); - axios - .delete("/activity/" + activityId) - .then((resp) => { - const wList = get(watchedList); - const wListItem = wList.find((w) => w.id === watchedId); - if (wListItem) { - wListItem.activity = wListItem.activity.filter((i) => i.id !== activityId); - watchedList.update(() => wList); - } - notify({ id: nid, text: "Deleted!", type: "success" }); - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed to Delete!", type: "error" }); - }); + const nid = notify({ text: "Deleting", type: "loading" }); + axios + .delete("/activity/" + activityId) + .then((resp) => { + const wListItem = store.watchedList.find((w) => w.id === watchedId); + if (wListItem) { + wListItem.activity = wListItem.activity.filter( + (i) => i.id !== activityId, + ); + } + notify({ id: nid, text: "Deleted!", type: "success" }); + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed to Delete!", type: "error" }); + }); } export async function contentExistsOnJellyfin( - type: MediaType, - name: string, - tmdbId: number + type: MediaType, + name: string, + tmdbId: number, ): Promise { - try { - const user = get(userInfo); - if (Number(user?.type) == UserType.Jellyfin) { - const resp = await axios.get(`/jellyfin/${type}/${name}/${tmdbId}`); - console.log("contentExistsOnJellyfin response:", resp.data); - return resp.data as JellyfinFoundContent; - } - } catch (err) { - console.error(err); - // notify({ text: "Failed To Remove!", type: "error" }); - } + try { + if (Number(store.userInfo?.type) == UserType.Jellyfin) { + const resp = await axios.get(`/jellyfin/${type}/${name}/${tmdbId}`); + console.log("contentExistsOnJellyfin response:", resp.data); + return resp.data as JellyfinFoundContent; + } + } catch (err) { + console.error(err); + // notify({ text: "Failed To Remove!", type: "error" }); + } } export function updateUserSetting( - name: K, - value: UserSettings[K], - done?: () => void + name: K, + value: UserSettings[K], + done?: () => void, ) { - console.log("Updating user setting", name, "to", value); - const uSettings = get(userSettings); - if (!uSettings) { - console.log("updateUserSetting: userSettings not set.."); - return; - } - const originalValue = uSettings[name]; - const nid = notify({ type: "loading", text: "Updating" }); - axios - .post("/user/update", { [name]: value }) - .then((r) => { - if (r.status === 200) { - uSettings[name] = value; - userSettings.update((u) => (u = uSettings)); - notify({ id: nid, type: "success", text: "Updated" }); - if (typeof done !== "undefined") done(); - } - }) - .catch((err) => { - console.error("Failed to update user setting", err); - notify({ id: nid, type: "error", text: "Couldn't Update" }); - uSettings[name] = originalValue; - userSettings.update((u) => (u = uSettings)); - if (typeof done !== "undefined") done(); - }); + console.log("Updating user setting", name, "to", value); + if (!store.userSettings) { + console.log("updateUserSetting: userSettings not set.."); + return; + } + const originalValue = store.userSettings[name]; + const nid = notify({ type: "loading", text: "Updating" }); + axios + .post("/user/update", { [name]: value }) + .then((r) => { + if (r.status === 200) { + if (store.userSettings) store.userSettings[name] = value; + notify({ id: nid, type: "success", text: "Updated" }); + if (typeof done !== "undefined") done(); + } + }) + .catch((err) => { + console.error("Failed to update user setting", err); + notify({ id: nid, type: "error", text: "Couldn't Update" }); + if (store.userSettings) store.userSettings[name] = originalValue; + if (typeof done !== "undefined") done(); + }); } export function changeUserPassword( - oldPassword: string, - newPassword: string, - done?: (errMsg?: string) => void + oldPassword: string, + newPassword: string, + done?: (errMsg?: string) => void, ) { - const nid = notify({ type: "loading", text: "Changing Password" }); - axios - .post("/auth/change_password", { oldPassword, newPassword }) - .then((r) => { - if (r.status === 200) { - notify({ id: nid, type: "success", text: "Password Changed" }); - if (typeof done !== "undefined") done(); - } - }) - .catch((err) => { - const errMsg = err?.response?.data?.error - ? err.response.data.error - : "Couldn't Change Password"; - console.error("Change Password Form - Failed to change password on the server", err); - unNotify(nid); - if (typeof done !== "undefined") done(errMsg); - }); + const nid = notify({ type: "loading", text: "Changing Password" }); + axios + .post("/auth/change_password", { oldPassword, newPassword }) + .then((r) => { + if (r.status === 200) { + notify({ id: nid, type: "success", text: "Password Changed" }); + if (typeof done !== "undefined") done(); + } + }) + .catch((err) => { + const errMsg = err?.response?.data?.error + ? err.response.data.error + : "Couldn't Change Password"; + console.error( + "Change Password Form - Failed to change password on the server", + err, + ); + unNotify(nid); + if (typeof done !== "undefined") done(errMsg); + }); } /** * Update serverFeatues store with fresh data. */ export async function getServerFeatures() { - try { - const f = await axios.get("/features"); - if (f?.data) { - serverFeatures.update((sf) => (sf = f.data)); - } - } catch (err) { - console.error("getServerFeatures failed!", err); - } + try { + const f = await axios.get("/features"); + if (f?.data) { + store.serverFeatures = f.data; + } + } catch (err) { + console.error("getServerFeatures failed!", err); + } } export async function followUser(id: number) { - const nid = notify({ text: `Following`, type: "loading" }); - axios - .post(`/follow/${id}`) - .then((resp) => { - console.log("Followed:", resp.data); - const f = get(follows); - f.push(resp.data as Follow); - follows.update(() => f); - notify({ id: nid, text: `Followed!`, type: "success" }); - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed To Follow!", type: "error" }); - }); + const nid = notify({ text: `Following`, type: "loading" }); + axios + .post(`/follow/${id}`) + .then((resp) => { + console.log("Followed:", resp.data); + store.follows.push(resp.data as Follow); + notify({ id: nid, text: `Followed!`, type: "success" }); + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed To Follow!", type: "error" }); + }); } export async function unfollowUser(id: number) { - const nid = notify({ text: `Unfollowing`, type: "loading" }); - axios - .delete(`/follow/${id}`) - .then((resp) => { - console.log("Unfollowed:", resp.data); - const f = get(follows); - follows.update(() => f.filter((fo) => fo.followedUser.id != id)); - notify({ id: nid, text: `Unfollowed!`, type: "success" }); - }) - .catch((err) => { - console.error(err); - notify({ id: nid, text: "Failed To Unfollow!", type: "error" }); - }); + const nid = notify({ text: `Unfollowing`, type: "loading" }); + axios + .delete(`/follow/${id}`) + .then((resp) => { + console.log("Unfollowed:", resp.data); + store.follows = store.follows.filter((fo) => fo.followedUser.id != id); + notify({ id: nid, text: `Unfollowed!`, type: "success" }); + }) + .catch((err) => { + console.error(err); + notify({ id: nid, text: "Failed To Unfollow!", type: "error" }); + }); } /** * For use with routes that don't require authentication (eg login/register) */ export const noAuthAxios = axios.create({ - baseURL: baseURL + baseURL: baseURL, }); diff --git a/src/lib/util/helpers.ts b/src/lib/util/helpers.ts index 6cf750a6..5a282138 100644 --- a/src/lib/util/helpers.ts +++ b/src/lib/util/helpers.ts @@ -1,167 +1,179 @@ -import { appTheme } from "@/store"; +import { store } from "@/store.svelte"; import { - UserPermission, - type Icon, - type MediaType, - type TMDBContentCreditsCrew, - type Theme, - type TokenClaims, - type Watched, - type WatchedStatus, - type WatchedEpisode, - type WatchedSeason + UserPermission, + type Icon, + type MediaType, + type TMDBContentCreditsCrew, + type Theme, + type TokenClaims, + type Watched, + type WatchedStatus, + type WatchedEpisode, + type WatchedSeason, } from "@/types"; export const watchedStatuses: { - [key in WatchedStatus]: Icon; + [key in WatchedStatus]: Icon; } = { - PLANNED: "calendar", - WATCHING: "clock", - FINISHED: "check", - HOLD: "pause", - DROPPED: "thumb-down" + PLANNED: "calendar", + WATCHING: "clock", + FINISHED: "check", + HOLD: "pause", + DROPPED: "thumb-down", }; export const months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", ]; export const monthsShort = [ - "Jan", - "Feb", - "March", - "Apr", - "May", - "June", - "July", - "Aug", - "Sept", - "Oct", - "Nov", - "Dec" + "Jan", + "Feb", + "March", + "Apr", + "May", + "June", + "July", + "Aug", + "Sept", + "Oct", + "Nov", + "Dec", ]; export function isTouch() { - return "ontouchstart" in window; + return "ontouchstart" in window; } // Not passing wList from #each loop caused it not to have reactivity. // Passing it through must allow it to recognize it as a dependency? -export function getWatchedDependedProps(wid: number, wtype: MediaType, list: Watched[]) { - const wel = list.find((wl) => wl.content?.tmdbId === wid && wl.content?.type === wtype); - if (!wel) return {}; - console.log(wid, wtype, wel?.content?.title, wel?.status, wel?.rating); - return { - id: wel.id, - status: wel.status, - rating: wel.rating, - extraDetails: { - dateAdded: wel.createdAt, - dateModified: wel.updatedAt, - lastWatched: getLatestWatchedInTv(wel.watchedSeasons, wel.watchedEpisodes) - } - }; +export function getWatchedDependedProps( + wid: number, + wtype: MediaType, + list: Watched[], +) { + const wel = list.find( + (wl) => wl.content?.tmdbId === wid && wl.content?.type === wtype, + ); + if (!wel) return {}; + console.log(wid, wtype, wel?.content?.title, wel?.status, wel?.rating); + return { + id: wel.id, + status: wel.status, + rating: wel.rating, + extraDetails: { + dateAdded: wel.createdAt, + dateModified: wel.updatedAt, + lastWatched: getLatestWatchedInTv( + wel.watchedSeasons, + wel.watchedEpisodes, + ), + }, + }; } export function getPlayedDependedProps(wid: number, list: Watched[]) { - const wel = list.find((wl) => wl.game?.igdbId === wid); - if (!wel) return {}; - return { - id: wel.id, - status: wel.status, - rating: wel.rating, - extraDetails: { - dateAdded: wel.createdAt, - dateModified: wel.updatedAt - } - }; + const wel = list.find((wl) => wl.game?.igdbId === wid); + if (!wel) return {}; + return { + id: wel.id, + status: wel.status, + rating: wel.rating, + extraDetails: { + dateAdded: wel.createdAt, + dateModified: wel.updatedAt, + }, + }; } // Get biggest season watching or biggest season watched. // This could probably be simpler but -_- export function getLatestWatchedInTv( - ws: WatchedSeason[] | undefined, - we: WatchedEpisode[] | undefined + ws: WatchedSeason[] | undefined, + we: WatchedEpisode[] | undefined, ): string { - if ((!ws || ws.length <= 0) && (!we || we.length <= 0)) { - return ""; - } + if ((!ws || ws.length <= 0) && (!we || we.length <= 0)) { + return ""; + } - let biggestSeasonWatched = -1; - let biggestSeasonWatching = -1; - if (ws && ws.length > 0) { - for (let i = 0; i < ws.length; i++) { - const s = ws[i]; - if (s.status === "WATCHING") { - if (s.seasonNumber > biggestSeasonWatching) { - biggestSeasonWatching = s.seasonNumber; - } - } else if (s.status === "FINISHED") { - if (s.seasonNumber > biggestSeasonWatched) { - biggestSeasonWatched = s.seasonNumber; - } - } - } - } - const season = biggestSeasonWatching >= 0 ? biggestSeasonWatching : biggestSeasonWatched; + let biggestSeasonWatched = -1; + let biggestSeasonWatching = -1; + if (ws && ws.length > 0) { + for (let i = 0; i < ws.length; i++) { + const s = ws[i]; + if (s.status === "WATCHING") { + if (s.seasonNumber > biggestSeasonWatching) { + biggestSeasonWatching = s.seasonNumber; + } + } else if (s.status === "FINISHED") { + if (s.seasonNumber > biggestSeasonWatched) { + biggestSeasonWatched = s.seasonNumber; + } + } + } + } + const season = + biggestSeasonWatching >= 0 ? biggestSeasonWatching : biggestSeasonWatched; - // Look for biggest watched/watching episode in season if any. - // Does same thing as above. - let episode: WatchedEpisode | undefined; - if (we && we.length > 0) { - let biggestEpisodeWatched: WatchedEpisode | undefined; - let biggestEpisodeWatching: WatchedEpisode | undefined; - for (let i = 0; i < we.length; i++) { - const s = we[i]; - if (season >= 0 && s.seasonNumber !== season) continue; - if (s.status === "WATCHING") { - if (!biggestEpisodeWatching) { - biggestEpisodeWatching = s; - } - if ( - s.episodeNumber > biggestEpisodeWatching.episodeNumber || - s.seasonNumber > biggestEpisodeWatching.seasonNumber - ) { - biggestEpisodeWatching = s; - } - } else if (s.status === "FINISHED") { - if (!biggestEpisodeWatched) { - biggestEpisodeWatched = s; - } - if ( - s.episodeNumber > biggestEpisodeWatched.episodeNumber || - s.seasonNumber > biggestEpisodeWatched.seasonNumber - ) { - biggestEpisodeWatched = s; - } - } - } - if (biggestEpisodeWatched || biggestEpisodeWatching) { - episode = - biggestEpisodeWatching !== undefined ? biggestEpisodeWatching : biggestEpisodeWatched; - } - } + // Look for biggest watched/watching episode in season if any. + // Does same thing as above. + let episode: WatchedEpisode | undefined; + if (we && we.length > 0) { + let biggestEpisodeWatched: WatchedEpisode | undefined; + let biggestEpisodeWatching: WatchedEpisode | undefined; + for (let i = 0; i < we.length; i++) { + const s = we[i]; + if (season >= 0 && s.seasonNumber !== season) continue; + if (s.status === "WATCHING") { + if (!biggestEpisodeWatching) { + biggestEpisodeWatching = s; + } + if ( + s.episodeNumber > biggestEpisodeWatching.episodeNumber || + s.seasonNumber > biggestEpisodeWatching.seasonNumber + ) { + biggestEpisodeWatching = s; + } + } else if (s.status === "FINISHED") { + if (!biggestEpisodeWatched) { + biggestEpisodeWatched = s; + } + if ( + s.episodeNumber > biggestEpisodeWatched.episodeNumber || + s.seasonNumber > biggestEpisodeWatched.seasonNumber + ) { + biggestEpisodeWatched = s; + } + } + } + if (biggestEpisodeWatched || biggestEpisodeWatching) { + episode = + biggestEpisodeWatching !== undefined + ? biggestEpisodeWatching + : biggestEpisodeWatched; + } + } - if (season >= 0 && episode) { - return seasonAndEpToReadable(season, episode.episodeNumber); - } else if (season >= 0) { - return `Season ${season}`; - } else if (episode) { - return seasonAndEpToReadable(episode.seasonNumber, episode.episodeNumber); - } else { - return ""; - } + if (season >= 0 && episode) { + return seasonAndEpToReadable(season, episode.episodeNumber); + } else if (season >= 0) { + return `Season ${season}`; + } else if (episode) { + return seasonAndEpToReadable(episode.seasonNumber, episode.episodeNumber); + } else { + return ""; + } } /** @@ -183,17 +195,17 @@ export function getLatestWatchedInTv( * @param isForGame If this status is being displayed for a game or not. */ export function toUnderstandableStatus(s: WatchedStatus, isForGame: boolean) { - if (isForGame) { - if (s === "FINISHED") { - return "played"; - } else if (s === "WATCHING") { - return "playing"; - } - } - if (s === "HOLD") { - return "on hold"; - } - return s?.toLowerCase(); + if (isForGame) { + if (s === "FINISHED") { + return "played"; + } else if (s === "WATCHING") { + return "playing"; + } + } + if (s === "HOLD") { + return "on hold"; + } + return s?.toLowerCase(); } /** @@ -202,12 +214,12 @@ export function toUnderstandableStatus(s: WatchedStatus, isForGame: boolean) { * @param c Class to add to parent. */ export function addClassToParent( - e: Event & { - currentTarget: EventTarget & Element; - }, - c: string + e: Event & { + currentTarget: EventTarget & Element; + }, + c: string, ) { - (e.currentTarget?.parentNode as HTMLDivElement)?.classList.add(c); + (e.currentTarget?.parentNode as HTMLDivElement)?.classList.add(c); } /** @@ -216,9 +228,13 @@ export function addClassToParent( * @returns Top Crew */ export function getTopCrew(crew: TMDBContentCreditsCrew[]) { - return crew.filter( - (c) => c.job === "Director" || c.job === "Writer" || c.job === "Characters" || c.job === "Story" - ); + return crew.filter( + (c) => + c.job === "Director" || + c.job === "Writer" || + c.job === "Characters" || + c.job === "Story", + ); } /** @@ -228,35 +244,35 @@ export function getTopCrew(crew: TMDBContentCreditsCrew[]) { * @param e */ export function calculateTransformOrigin( - e: Event & { - currentTarget: EventTarget & HTMLLIElement; - } + e: Event & { + currentTarget: EventTarget & HTMLLIElement; + }, ) { - const magicNumber = 26; - const ctr = e.currentTarget.querySelector(".container") as HTMLElement; - const pb = ctr.getBoundingClientRect(); - const sx = pb.x; - const sw = pb.width; - const wb = document.body.getBoundingClientRect(); + const magicNumber = 26; + const ctr = e.currentTarget.querySelector(".container") as HTMLElement; + const pb = ctr.getBoundingClientRect(); + const sx = pb.x; + const sw = pb.width; + const wb = document.body.getBoundingClientRect(); - if (ctr) { - ctr.style.transformOrigin = "unset"; - const origins = []; - // Overflow on right - if (sx + sw + magicNumber > wb.x + wb.width) { - origins.push("right"); - } - // Overflow on left - if (sx - magicNumber < wb.x) { - origins.push("left"); - } - // Overflow on bottom - const ppb = e.currentTarget.getBoundingClientRect(); - if (ppb.bottom + magicNumber > window.innerHeight) { - origins.push("bottom"); - } - ctr.style.transformOrigin = `${origins.join(" ")}`; - } + if (ctr) { + ctr.style.transformOrigin = "unset"; + const origins = []; + // Overflow on right + if (sx + sw + magicNumber > wb.x + wb.width) { + origins.push("right"); + } + // Overflow on left + if (sx - magicNumber < wb.x) { + origins.push("left"); + } + // Overflow on bottom + const ppb = e.currentTarget.getBoundingClientRect(); + if (ppb.bottom + magicNumber > window.innerHeight) { + origins.push("bottom"); + } + ctr.style.transformOrigin = `${origins.join(" ")}`; + } } /** @@ -264,91 +280,103 @@ export function calculateTransformOrigin( * @param i Day number. */ export function getOrdinalSuffix(i: number) { - const j = i % 10, - k = i % 100; - if (j == 1 && k != 11) { - return "st"; - } - if (j == 2 && k != 12) { - return "nd"; - } - if (j == 3 && k != 13) { - return "rd"; - } - return "th"; + const j = i % 10, + k = i % 100; + if (j == 1 && k != 11) { + return "st"; + } + if (j == 2 && k != 12) { + return "nd"; + } + if (j == 3 && k != 13) { + return "rd"; + } + return "th"; } /** * Toggle site wide theme. * @param theme The theme to switch to. + * @param updateStore Should the store be updated to new theme? + * **If set to `false`, state should be manually updated.** */ -export function toggleTheme(theme: Theme) { - if (theme === "dark") { - document.documentElement.classList.add("theme-dark"); - appTheme.update((t) => (t = "dark")); - } else { - document.documentElement.classList.remove("theme-dark"); - appTheme.update((t) => (t = "light")); - } +export function toggleTheme(theme: Theme, updateStore = true) { + if (theme === "dark") { + document.documentElement.classList.add("theme-dark"); + if (updateStore) { + store.appTheme = "dark"; + } + } else { + document.documentElement.classList.remove("theme-dark"); + if (updateStore) { + store.appTheme = "light"; + } + } } export function parseTokenPayload(): TokenClaims | undefined { - try { - const token = localStorage.getItem("token"); - if (!token) return; - return JSON.parse(atob(token.split(".")[1])) as TokenClaims; - } catch (err) { - return; - } + try { + const token = localStorage.getItem("token"); + if (!token) return; + return JSON.parse(atob(token.split(".")[1])) as TokenClaims; + } catch (err) { + return; + } } export async function sleep(ms: number) { - return new Promise((r) => - setTimeout(() => { - r(); - }, ms) - ); + return new Promise((r) => + setTimeout(() => { + r(); + }, ms), + ); } -export function userHasPermission(perms: UserPermission, reqPerm: UserPermission): boolean { - // Admins have permission for everything. - if (perms & UserPermission.PERM_ADMIN) { - return true; - } - return (perms & reqPerm) == reqPerm; +export function userHasPermission( + perms: UserPermission, + reqPerm: UserPermission, +): boolean { + // Admins have permission for everything. + if (perms & UserPermission.PERM_ADMIN) { + return true; + } + return (perms & reqPerm) == reqPerm; } /** * Takes season and episode number to make a quickly understandable * string in this format S1E1. */ -export function seasonAndEpToReadable(season: number | undefined, episode: number | undefined) { - return `S${typeof season === "number" ? String(season) : "(unknown)"}E${typeof episode === "number" ? String(episode) : "(unknown)"}`; +export function seasonAndEpToReadable( + season: number | undefined, + episode: number | undefined, +) { + return `S${typeof season === "number" ? String(season) : "(unknown)"}E${typeof episode === "number" ? String(episode) : "(unknown)"}`; } export function msToAmountsOfTime(ms: number) { - const seconds = Math.floor((ms / 1000) % 60); - const minutes = Math.floor((ms / (1000 * 60)) % 60); - const hours = Math.floor((ms / (1000 * 60 * 60)) % 24); - const days = Math.floor(ms / (1000 * 60 * 60 * 24)); - return { days, hours, minutes, seconds }; + const seconds = Math.floor((ms / 1000) % 60); + const minutes = Math.floor((ms / (1000 * 60)) % 60); + const hours = Math.floor((ms / (1000 * 60 * 60)) % 24); + const days = Math.floor(ms / (1000 * 60 * 60 * 24)); + return { days, hours, minutes, seconds }; } /** I'm no warden of time, this is as relative as it's getting. */ export function toRelativeDate(d: Date): string { - if (!d) { - return "Unknown"; - } - const dn = new Date(Date.now()); - if (d.getFullYear() === dn.getFullYear()) { - if (d.getMonth() === dn.getMonth()) { - if (d.getDate() === dn.getDate()) { - return "Today"; - } - } - return `${d.getDate()}${getOrdinalSuffix(d.getDate())} ${monthsShort[d.getMonth()]}`; - } - return `${d.getDate()}${getOrdinalSuffix(d.getDate())} ${monthsShort[d.getMonth()]} ${d.getFullYear()}`; + if (!d) { + return "Unknown"; + } + const dn = new Date(Date.now()); + if (d.getFullYear() === dn.getFullYear()) { + if (d.getMonth() === dn.getMonth()) { + if (d.getDate() === dn.getDate()) { + return "Today"; + } + } + return `${d.getDate()}${getOrdinalSuffix(d.getDate())} ${monthsShort[d.getMonth()]}`; + } + return `${d.getDate()}${getOrdinalSuffix(d.getDate())} ${monthsShort[d.getMonth()]} ${d.getFullYear()}`; } /** @@ -356,18 +384,28 @@ export function toRelativeDate(d: Date): string { * @param s Seconds. */ export function toRelativeTime(s: number) { - const totalMinutes = Math.floor(s / 60); - const hours = Math.floor(totalMinutes / 60); - const mins = totalMinutes % 60; - const secs = Math.floor(s % 60); - if (hours > 0) { - return `${hours} hours`; - } - if (mins > 0) { - return `${mins} minutes`; - } - if (secs > 0) { - return `${secs} seconds`; - } - return "now"; + const totalMinutes = Math.floor(s / 60); + const hours = Math.floor(totalMinutes / 60); + const mins = totalMinutes % 60; + const secs = Math.floor(s % 60); + if (hours > 0) { + return `${hours} hours`; + } + if (mins > 0) { + return `${mins} minutes`; + } + if (secs > 0) { + return `${secs} seconds`; + } + return "now"; +} + +/** + * Tests whether the mouse is hovering over `el`. + */ +export function mouseOverEl(el?: HTMLElement) { + if (!el) { + return false; + } + return el.matches(":hover"); } diff --git a/src/lib/util/notify.ts b/src/lib/util/notify.ts index eb153db2..8e79e44b 100644 --- a/src/lib/util/notify.ts +++ b/src/lib/util/notify.ts @@ -1,55 +1,53 @@ -import { notifications } from "@/store"; -import { get } from "svelte/store"; +import { store } from "@/store.svelte"; export interface Notification { - /** - * Notification ID. - * Used to reference an exiting notification. - */ - id?: number; + /** + * Notification ID. + * Used to reference an exiting notification. + */ + id?: number; - /** - * Text shown in popup; - */ - text: string; + /** + * Text shown in popup; + */ + text: string; - /** - * Type of notification, controls the style. - * Loading notifs never hide, so after request completion - * or failure, the notif must be updated or `unNotify`ed. - */ - type?: "error" | "success" | "loading"; + /** + * Type of notification, controls the style. + * Loading notifs never hide, so after request completion + * or failure, the notif must be updated or `unNotify`ed. + */ + type?: "error" | "success" | "loading"; - /** - * How long in milliseconds the popup will stay shown for. - */ - time?: number; + /** + * How long in milliseconds the popup will stay shown for. + */ + time?: number; } export function notify(n: Notification) { - const notifs = get(notifications); - if (n.id) { - const notif = notifs.find((not) => not.id === n.id); - if (notif) { - notif.type = n.type; - notif.text = n.text; - notifications.update(() => notifs); - } else { - console.error("Can't update notif that doesnt exist", n); - } - } else { - n.id = Math.random(); - notifs.push({ ...n }); - notifications.update(() => notifs); - } - if (n.type !== "loading" && n.time !== Infinity) { - setTimeout(() => unNotify(n.id!), n.time ?? 2500); - } - return n.id; + if (n.id) { + const notif = store.notifications.find((not) => not.id === n.id); + if (notif) { + notif.type = n.type; + notif.text = n.text; + } else { + console.error("Can't update notif that doesnt exist", n); + } + } else { + n.id = Math.random(); + store.notifications.push({ ...n }); + } + if (n.type !== "loading" && n.time !== Infinity) { + setTimeout(() => unNotify(n.id!), n.time ?? 2500); + } + return n.id; } -export function unNotify(id: number) { - const ns = get(notifications); - const dn = ns.filter((e) => e.id !== id); - notifications.update(() => dn); +export function unNotify(id?: number) { + if (!id) { + console.warn("unNotify: Tried removing a notification without an id."); + return; + } + store.notifications = store.notifications.filter((e) => e.id !== id); } diff --git a/src/lib/util/plex.ts b/src/lib/util/plex.ts index e7e31f73..7922efb7 100644 --- a/src/lib/util/plex.ts +++ b/src/lib/util/plex.ts @@ -1,120 +1,133 @@ import { noAuthAxios } from "./api"; interface Plex { - win: Window; - headers: Record; - clientId: string; + win: Window; + headers: Record; + clientId: string; } interface PlexPin { - id: number; - code: string; + id: number; + code: string; } // function uuidv4() { - return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c: any) => - (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) - ); + return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c: any) => + ( + c ^ + (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4))) + ).toString(16), + ); } export function preparePlexAuth(): Plex { - // No point making a store for this. - let clientId = localStorage.getItem("plex-cid"); - if (!clientId) { - if (crypto.randomUUID) { - console.log("preparePlexAuth: Using randomUUID"); - clientId = crypto.randomUUID(); - } else { - // Use this if randomUUID is unavailable (ex in unsecure context, this use case isn't as big a deelio) - console.log("preparePlexAuth: Not using randomUUID"); - clientId = uuidv4(); - } - localStorage.setItem("plex-cid", clientId); - } + // No point making a store for this. + let clientId = localStorage.getItem("plex-cid"); + if (!clientId) { + if (crypto.randomUUID) { + console.log("preparePlexAuth: Using randomUUID"); + clientId = crypto.randomUUID(); + } else { + // Use this if randomUUID is unavailable (ex in unsecure context, this use case isn't as big a deelio) + console.log("preparePlexAuth: Not using randomUUID"); + clientId = uuidv4(); + } + localStorage.setItem("plex-cid", clientId); + } - const w = 600; - const h = 800; - // Fixes dual-screen position Most browsers Firefox - const dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : window.screenX; - const dualScreenTop = window.screenTop != undefined ? window.screenTop : window.screenY; - const width = window.innerWidth - ? window.innerWidth - : document.documentElement.clientWidth - ? document.documentElement.clientWidth - : screen.width; - const height = window.innerHeight - ? window.innerHeight - : document.documentElement.clientHeight - ? document.documentElement.clientHeight - : screen.height; - const left = width / 2 - w / 2 + dualScreenLeft; - const top = height / 2 - h / 2 + dualScreenTop; + const w = 600; + const h = 800; + // Fixes dual-screen position Most browsers Firefox + const dualScreenLeft = + window.screenLeft != undefined ? window.screenLeft : window.screenX; + const dualScreenTop = + window.screenTop != undefined ? window.screenTop : window.screenY; + const width = window.innerWidth + ? window.innerWidth + : document.documentElement.clientWidth + ? document.documentElement.clientWidth + : screen.width; + const height = window.innerHeight + ? window.innerHeight + : document.documentElement.clientHeight + ? document.documentElement.clientHeight + : screen.height; + const left = width / 2 - w / 2 + dualScreenLeft; + const top = height / 2 - h / 2 + dualScreenTop; - const win = window.open( - "", - "Continue to Watcharr With Plex", - `scrollbars=yes, width=${w}, height=${h}, top=${top}, left=${left}` - ); - if (win) { - win.focus(); - return { - win, - // Don't really want to give all the possible headers, - // trying to minimize it to what gets it working. - headers: { - "X-Plex-Product": "Watcharr", - "X-Plex-Client-Identifier": clientId, - "X-Plex-Version": "Plex OAuth", - "X-Plex-Model": "Plex OAuth", - "X-Plex-Platform": "Firefox", - "X-Plex-Platform-Version": "123.0", - "X-Plex-Device": "Windows", - "X-Plex-Device-Name": "Watcharr" - }, - clientId - }; - } - throw new Error("Failed to prepare popup!"); + const win = window.open( + "", + "Continue to Watcharr With Plex", + `scrollbars=yes, width=${w}, height=${h}, top=${top}, left=${left}`, + ); + if (win) { + win.focus(); + return { + win, + // Don't really want to give all the possible headers, + // trying to minimize it to what gets it working. + headers: { + "X-Plex-Product": "Watcharr", + "X-Plex-Client-Identifier": clientId, + "X-Plex-Version": "Plex OAuth", + "X-Plex-Model": "Plex OAuth", + "X-Plex-Platform": "Firefox", + "X-Plex-Platform-Version": "123.0", + "X-Plex-Device": "Windows", + "X-Plex-Device-Name": "Watcharr", + }, + clientId, + }; + } + throw new Error("Failed to prepare popup!"); } -export async function doPlexLogin({ win, headers, clientId }: Plex): Promise { - const pin = await getPlexPin(headers); - win.location.href = `https://app.plex.tv/auth/#!?clientID=${clientId}&code=${pin.code}&context=Watcharr&context[device][device]=${headers["X-Plex-Device"]}&context[device][deviceName]=${headers["X-Plex-Device-Name"]}&context[device][platform]=${headers["X-Plex-Platform"]}&context[device][platformVersion]=${headers["X-Plex-Platform-Version"]}&context[device][product]=${headers["X-Plex-Product"]}`; - return pin; +export async function doPlexLogin({ + win, + headers, + clientId, +}: Plex): Promise { + const pin = await getPlexPin(headers); + win.location.href = `https://app.plex.tv/auth/#!?clientID=${clientId}&code=${pin.code}&context=Watcharr&context[device][device]=${headers["X-Plex-Device"]}&context[device][deviceName]=${headers["X-Plex-Device-Name"]}&context[device][platform]=${headers["X-Plex-Platform"]}&context[device][platformVersion]=${headers["X-Plex-Platform-Version"]}&context[device][product]=${headers["X-Plex-Product"]}`; + return pin; } export async function plexPinPoll( - pin: PlexPin, - { win, headers }: Plex, - done: (err?: Error, token?: string) => void + pin: PlexPin, + { win, headers }: Plex, + done: (err?: Error, token?: string) => void, ) { - const doPoll = async () => { - try { - console.debug("plexPinPoll"); - const r = await noAuthAxios.get(`https://plex.tv/api/v2/pins/${pin.id}`, { - headers: { ...headers, code: pin.code } - }); - if (r.data?.authToken) { - done(undefined, r.data.authToken); - win.close(); - } else if (win?.closed) { - done(new Error("Plex popup closed before login completed")); - } else { - setTimeout(doPoll, 1000); - } - } catch (err) { - console.error("plexPinPoll: Failed!", err); - done(new Error("Pin poll failed")); - } - }; - setTimeout(doPoll, 1000); + const doPoll = async () => { + try { + console.debug("plexPinPoll"); + const r = await noAuthAxios.get(`https://plex.tv/api/v2/pins/${pin.id}`, { + headers: { ...headers, code: pin.code }, + }); + if (r.data?.authToken) { + done(undefined, r.data.authToken); + win.close(); + } else if (win?.closed) { + done(new Error("Plex popup closed before login completed")); + } else { + setTimeout(doPoll, 1000); + } + } catch (err) { + console.error("plexPinPoll: Failed!", err); + done(new Error("Pin poll failed")); + } + }; + setTimeout(doPoll, 1000); } async function getPlexPin(headers: Record): Promise { - const r = await noAuthAxios.post(`https://plex.tv/api/v2/pins?strong=true`, undefined, { - headers: headers - }); - console.debug("getPlexPin:", r.data); - return { id: r.data.id, code: r.data.code }; + const r = await noAuthAxios.post( + `https://plex.tv/api/v2/pins?strong=true`, + undefined, + { + headers: headers, + }, + ); + console.debug("getPlexPin:", r.data); + return { id: r.data.id, code: r.data.code }; } diff --git a/src/norm.scss b/src/norm.scss index 56013643..766ec3cf 100644 --- a/src/norm.scss +++ b/src/norm.scss @@ -1,441 +1,378 @@ @import "./vars.scss"; @font-face { - font-family: "Shrikhand"; - src: - local("Shrikhand Regular"), - local("Shrikhand-Regular"), - url("/Shrikhand-Regular.woff2") format("woff2"); - font-weight: normal; - font-style: italic; - font-display: swap; + font-family: "Shrikhand"; + src: + local("Shrikhand Regular"), + local("Shrikhand-Regular"), + url("/Shrikhand-Regular.woff2") format("woff2"); + font-weight: normal; + font-style: italic; + font-display: swap; } @font-face { - font-family: "Rampart One"; - src: - local("Rampart One Regular"), - local("RampartOne-Regular"), - url("/RampartOne-Regular.woff2") format("woff2"); - font-weight: normal; - font-style: normal; - font-display: swap; + font-family: "Rampart One"; + src: + local("Rampart One Regular"), + local("RampartOne-Regular"), + url("/RampartOne-Regular.woff2") format("woff2"); + font-weight: normal; + font-style: normal; + font-display: swap; } :global(*) { - padding: 0; - margin: 0; - box-sizing: border-box; + padding: 0; + margin: 0; + box-sizing: border-box; } :global(body) { - font-family: - sans-serif, - system-ui, - -apple-system, - BlinkMacSystemFont; - background-color: $bg-color; - color: $text-color; + font-family: + sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont; + background-color: $bg-color; + color: $text-color; } -:global(h1:not(.norm), h2:not(.norm), h3:not(.norm), h4:not(.norm), h5:not(.norm)) { - font-family: - "Shrikhand", - system-ui, - -apple-system, - BlinkMacSystemFont; +:global( + h1:not(.norm), + h2:not(.norm), + h3:not(.norm), + h4:not(.norm), + h5:not(.norm) +) { + font-family: + "Shrikhand", + system-ui, + -apple-system, + BlinkMacSystemFont; } :global(.sm-caps) { - font-variant: small-caps; + font-variant: small-caps; } :global(a) { - text-decoration: none; - color: $text-color; + text-decoration: none; + color: $text-color; } :global(input, textarea) { - padding: 7px 10px; - border: 2px solid black; - border-radius: 5px; - width: 100%; + padding: 7px 10px; + border: 2px solid black; + border-radius: 5px; + width: 100%; } :global(input.invalid) { - border: 3px solid $error; + border: 3px solid $error; } :global(textarea) { - padding: 5px; - max-width: 100%; - color: $text-color; - background-color: transparent; - border-color: $text-color; + padding: 5px; + max-width: 100%; + color: $text-color; + background-color: transparent; + border-color: $text-color; } :global(button) { - cursor: pointer; + cursor: pointer; } :global(button:not(.plain)), :global(a.btn) { - display: flex; - align-items: center; - justify-content: center; - padding: 7px 10px; - border: 2px solid $text-color; - border-radius: 5px; - background-color: $bg-color; - color: $text-color; - fill: $text-color; - font-weight: bold; - width: 100%; - transition: - background-color 100ms ease, - opacity 100ms ease; - - & :global(svg) { - height: 100%; - width: auto; - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - &:not(:disabled) { - &:hover, - &:focus-visible, - &.active { - background-color: $text-color; - color: $bg-color; - fill: $bg-color; - opacity: 1; - } - } + display: flex; + align-items: center; + justify-content: center; + padding: 7px 10px; + border: 2px solid $text-color; + border-radius: 5px; + background-color: $bg-color; + color: $text-color; + fill: $text-color; + font-weight: bold; + width: 100%; + transition: + background-color 100ms ease, + opacity 100ms ease; + + & :global(svg) { + height: 100%; + width: auto; + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + &:not(:disabled) { + &:hover, + &:focus-visible, + &.active { + background-color: $text-color; + color: $bg-color; + fill: $bg-color; + opacity: 1; + } + } } :global(button.secondary) { - border: 2px solid transparent; - - &:hover, - &:focus-visible { - background-color: white; - color: black; - border: 2px solid black; - } + border: 2px solid transparent; + + &:hover, + &:focus-visible { + background-color: white; + color: black; + border: 2px solid black; + } } :global(button.danger) { - border: 2px solid $error; - color: $error; - - &:not(:disabled) { - &:hover, - &:focus-visible { - background-color: $error; - color: white; - } - } + border: 2px solid $error; + color: $error; + + &:not(:disabled) { + &:hover, + &:focus-visible { + background-color: $error; + color: white; + } + } } :global(button.plain), :global(a.plain-btn) { - background-color: transparent; - color: $text-color; - border: 0; + background-color: transparent; + color: $text-color; + border: 0; } :global(button.not-active) { - opacity: 0.5; + opacity: 0.5; } :global(#tooltip) { - visibility: hidden; - position: absolute; - padding: 8px 5px; - background-color: black; - color: white; - border: 1px solid white; - border-radius: 6px; - text-transform: capitalize; - z-index: 99999; - transition: - top 100ms ease, - left 100ms ease; - pointer-events: none; + visibility: hidden; + position: absolute; + padding: 8px 5px; + background-color: black; + color: white; + border: 1px solid white; + border-radius: 6px; + text-transform: capitalize; + z-index: 99999; + transition: + top 100ms ease, + left 100ms ease; + pointer-events: none; } :global { - #notifications { - display: flex; - flex-flow: column; - gap: 10px; - position: fixed; - bottom: 0; - left: 50%; - transform: translateX(-50%); - margin-bottom: 8px; - z-index: 99999; - - .notif { - display: flex; - flex-flow: row; - align-items: center; - min-width: 200px; - color: black; - background-color: white; - border-radius: 8px; - border: 1px solid rgba($color: #000000, $alpha: 0.2); - box-shadow: 0 4px 10px rgba($color: #000000, $alpha: 0.2); - animation: comein 250ms ease forwards; - position: relative; - - &.loading { - padding-left: 10px; - } - - @keyframes comein { - from { - opacity: 0; - } - - to { - opacity: 1; - } - } - - &.error { - color: white; - background-color: $error; - border: 1px solid $error; - - span { - border-color: rgba($color: white, $alpha: 0.5); - } - } - - &.success { - color: white; - background-color: $success; - border: 1px solid $success; - - span { - border-color: rgba($color: white, $alpha: 0.5); - } - } - - span { - width: 100%; - height: 100%; - padding-right: 12px; - border-right: 1px solid rgba($color: black, $alpha: 0.2); - padding: 10px 12px; - padding-left: 9px; - - a { - color: white; - text-decoration: underline; - } - } - - button { - display: flex; - align-items: center; - margin: 8px; - width: 22px; - height: 100%; - color: inherit; - } - } - } - - .small-scrollbar { - @supports selector(::-webkit-scrollbar) { - &::-webkit-scrollbar { - width: 4.5px; - } - - &::-webkit-scrollbar-track { - background: transparent; - } - - &::-webkit-scrollbar-thumb { - background-color: rgba(155, 155, 155, 0.5); - border-radius: 20px; - border: transparent; - } - - // The scrollbar-width property will always override - // -webkit-scrollbar, but since the scrollbars in - // chromium look ugly af, we will try to unset scrollbar-width - // in these cases and use our manual styling instead to try - // mimicking beatiful firefox. - scrollbar-width: auto !important; - } - } -} - -:global(div.menu) { - display: flex; - flex-flow: column; - position: absolute; - right: 10px; - top: 55px; - width: 125px; - border: 3px solid $text-color; - border-radius: 10px; - background-color: $bg-color; - list-style: none; - z-index: 50; - - // The lil arrow, adjust its pos under each specific menu. - &:not(:has(> .arrow)):before, - :global(.arrow) { - // Works by showing arrow in ::before pseudoelement, - // or if more control is needed, applies to any .arrow - // element. - content: ""; - position: absolute; - bottom: 100%; - width: 0; - border-top: 10px solid transparent; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-bottom: 10px solid $text-color; - } - - & > div { - display: flex; - flex-flow: column; - padding: 10px; - width: 100%; - max-height: calc(100dvh - 65px); - overflow: auto; - - h5 { - margin-bottom: 2px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - cursor: default; - } - - button, - a { - font-size: 14px; - padding: 8px 16px; - text-align: center; - cursor: pointer; - transition: background-color 200ms ease; - - &:hover, - &:focus-visible { - background-color: $text-color; - color: $bg-color; - } - } - - span { - margin-top: 8px; - font-size: 11px; - color: gray; - text-align: center; - } - } + #notifications { + display: flex; + flex-flow: column; + gap: 10px; + position: fixed; + bottom: 0; + left: 50%; + transform: translateX(-50%); + margin-bottom: 8px; + z-index: 99999; + + .notif { + display: flex; + flex-flow: row; + align-items: center; + min-width: 200px; + color: black; + background-color: white; + border-radius: 8px; + border: 1px solid rgba($color: #000000, $alpha: 0.2); + box-shadow: 0 4px 10px rgba($color: #000000, $alpha: 0.2); + animation: comein 250ms ease forwards; + position: relative; + + &.loading { + padding-left: 10px; + } + + @keyframes comein { + from { + opacity: 0; + } + + to { + opacity: 1; + } + } + + &.error { + color: white; + background-color: $error; + border: 1px solid $error; + + span { + border-color: rgba($color: white, $alpha: 0.5); + } + } + + &.success { + color: white; + background-color: $success; + border: 1px solid $success; + + span { + border-color: rgba($color: white, $alpha: 0.5); + } + } + + span { + width: 100%; + height: 100%; + padding-right: 12px; + border-right: 1px solid rgba($color: black, $alpha: 0.2); + padding: 10px 12px; + padding-left: 9px; + + a { + color: white; + text-decoration: underline; + } + } + + button { + display: flex; + align-items: center; + margin: 8px; + width: 22px; + height: 100%; + color: inherit; + } + } + } + + .small-scrollbar { + @supports selector(::-webkit-scrollbar) { + &::-webkit-scrollbar { + width: 4.5px; + } + + &::-webkit-scrollbar-track { + background: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: rgba(155, 155, 155, 0.5); + border-radius: 20px; + border: transparent; + } + + // The scrollbar-width property will always override + // -webkit-scrollbar, but since the scrollbars in + // chromium look ugly af, we will try to unset scrollbar-width + // in these cases and use our manual styling instead to try + // mimicking beatiful firefox. + scrollbar-width: auto !important; + } + } } :global(table) { - margin-top: 20px; - width: 100%; - border-spacing: 0px; - border: 1px solid $accent-color; - border-radius: 10px; - font-size: 16px; - - th { - padding: 12px 15px; - text-align: left; - transition: padding 100ms ease; - - &:first-of-type { - border-top-left-radius: 10px; - } - - &:last-of-type { - border-top-right-radius: 10px; - } - - &.loading-col { - width: 28px; - padding: 0; - } - } - - tr { - th { - background-color: $accent-color; - } - - &:last-child { - td:first-of-type { - border-bottom-left-radius: 10px; - } - - td:last-of-type { - border-bottom-right-radius: 10px; - } - } - - &:nth-child(odd) td { - background-color: $accent-color; - } - } - - td { - padding: 5px; - - &.icon-cell { - padding-right: 3px; - - & > div { - display: flex; - padding-left: 4px; - } - } - - input { - background: transparent; - color: $text-color; - border: 0; - font-size: 16px; - padding: 0; - padding: 7px 10px; - transition: padding 100ms ease; - - &[type="number"] { - appearance: textfield; - - &::-webkit-outer-spin-button, - &::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - } - } - - button { - &.delete { - display: flex; - justify-content: center; - color: $placeholder-color; - - &:hover { - color: $error; - } - } - } - } + margin-top: 20px; + width: 100%; + border-spacing: 0px; + border: 1px solid $accent-color; + border-radius: 10px; + font-size: 16px; + + th { + padding: 12px 15px; + text-align: left; + transition: padding 100ms ease; + + &:first-of-type { + border-top-left-radius: 10px; + } + + &:last-of-type { + border-top-right-radius: 10px; + } + + &.loading-col { + width: 28px; + padding: 0; + } + } + + tr { + th { + background-color: $accent-color; + } + + &:last-child { + td:first-of-type { + border-bottom-left-radius: 10px; + } + + td:last-of-type { + border-bottom-right-radius: 10px; + } + } + + &:nth-child(odd) td { + background-color: $accent-color; + } + } + + td { + padding: 5px; + + &.icon-cell { + padding-right: 3px; + + & > div { + display: flex; + padding-left: 4px; + } + } + + input { + background: transparent; + color: $text-color; + border: 0; + font-size: 16px; + padding: 0; + padding: 7px 10px; + transition: padding 100ms ease; + + &[type="number"] { + appearance: textfield; + + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + } + } + + button { + &.delete { + display: flex; + justify-content: center; + color: $placeholder-color; + + &:hover { + color: $error; + } + } + } + } } diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index d4a7f47d..231dc75b 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -1,675 +1,593 @@ {#await getInitialData()} - + {:then} - + {@render children?.()} {:catch err} - + {/await} diff --git a/src/routes/(app)/+layout.ts b/src/routes/(app)/+layout.ts index 86f30fa0..e67e1e1b 100644 --- a/src/routes/(app)/+layout.ts +++ b/src/routes/(app)/+layout.ts @@ -9,39 +9,39 @@ import { notify } from "@/lib/util/notify"; import { clearWatcharrData } from "@/lib/logout"; axios.interceptors.request.use( - (config) => { - if (!config.baseURL) { - config.baseURL = baseURL; + (config) => { + if (!config.baseURL) { + config.baseURL = baseURL; - // Only want to set auth header if requesting to our backend. - const token = localStorage.getItem("token"); - // Don't require token check if going to auth route (login/register) - if (!token && !config.url?.includes("/auth")) { - console.error("No token, going to login. Endpoint:", config.url); - goto("/login?again=1"); - throw new axios.Cancel("No auth token found"); - } - config.headers.set("Authorization", token); - } + // Only want to set auth header if requesting to our backend. + const token = localStorage.getItem("token"); + // Don't require token check if going to auth route (login/register) + if (!token && !config.url?.includes("/auth")) { + console.error("No token, going to login. Endpoint:", config.url); + goto("/login?again=1"); + throw new axios.Cancel("No auth token found"); + } + config.headers.set("Authorization", token); + } - return config; - }, - (error) => { - return Promise.reject(error); - } + return config; + }, + (error) => { + return Promise.reject(error); + }, ); axios.interceptors.response.use( - (response) => { - return response; - }, - (error) => { - if (error.response?.status === 401) { - console.error("Recieved 401 response, going to login."); - notify({ text: "Request Authorization Failed!", type: "error" }); - clearWatcharrData(); - goto("/login?again=1"); - } - return Promise.reject(error); - } + (response) => { + return response; + }, + (error) => { + if (error.response?.status === 401) { + console.error("Recieved 401 response, going to login."); + notify({ text: "Request Authorization Failed!", type: "error" }); + clearWatcharrData(); + goto("/login?again=1"); + } + return Promise.reject(error); + }, ); diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte index 46958329..ced36423 100644 --- a/src/routes/(app)/+page.svelte +++ b/src/routes/(app)/+page.svelte @@ -1,10 +1,10 @@ - Watched List + Watched List - + diff --git a/src/routes/(app)/arr_requests/+page.svelte b/src/routes/(app)/arr_requests/+page.svelte index 21f69100..4ae0999d 100644 --- a/src/routes/(app)/arr_requests/+page.svelte +++ b/src/routes/(app)/arr_requests/+page.svelte @@ -1,321 +1,340 @@
    -
    -

    Media Requests

    -
    Manage and view all of your media requests.
    - - {#await getRequests()} - - {:then} -
    - {#each allRequests as r} -
    -
    - - {r.serverName} -
    - -
    -

    - - {r.content.title} - - {#if r.content.release_date} - {new Date(r.content.release_date).getFullYear()} - {/if} -

    -

    {r.content.overview}

    -
    - {#if r.username} - - By {r.username}  •  {toRelativeDate(new Date(r.createdAt))} - - {/if} - {#if r.status === "PENDING"} - - - {:else} - - {/if} -
    -
    -
    - {/each} -
    - {:catch err} - - {/await} - - {#if showBeingApproved} - { - showBeingApproved = undefined; - // HACK - getRequests(); - }} - /> - {:else if movieBeingApproved} - { - movieBeingApproved = undefined; - // HACK - getRequests(); - }} - /> - {/if} -
    +
    +

    Media Requests

    +
    Manage and view all of your media requests.
    + + {#await getRequests()} + + {:then} +
    + {#each allRequests as r} +
    +
    + + {r.serverName} +
    + +
    +

    + + {r.content.title} + + {#if r.content.release_date} + {new Date(r.content.release_date).getFullYear()} + {/if} +

    +

    {r.content.overview}

    +
    + {#if r.username} + + By {r.username}  •  {toRelativeDate( + new Date(r.createdAt), + )} + + {/if} + {#if r.status === "PENDING"} + + + {:else} + + {/if} +
    +
    +
    + {/each} +
    + {:catch err} + + {/await} + + {#if showBeingApproved} + { + showBeingApproved = undefined; + // HACK + getRequests(); + }} + /> + {:else if movieBeingApproved} + { + movieBeingApproved = undefined; + // HACK + getRequests(); + }} + /> + {/if} +
    diff --git a/src/routes/(app)/discover/+page.svelte b/src/routes/(app)/discover/+page.svelte index 0c5f30c9..00794f40 100644 --- a/src/routes/(app)/discover/+page.svelte +++ b/src/routes/(app)/discover/+page.svelte @@ -1,157 +1,159 @@ - Discover Content + Discover Content
    -

    Discover

    - -

    Trending Today

    - {#await allTrending()} - - {:then trending} - - {#each trending.results as trend} - - {#if trend.media_type === "movie" || trend.media_type === "tv"} - - {/if} - {/each} - - {:catch err} - - {/await} - -

    Trending Movies

    - {#await trendingMovies()} - - {:then movies} - - {#each movies.results as movie} - - {/each} - - {:catch err} - - {/await} - -

    Trending Shows

    - {#await trendingShows()} - - {:then shows} - - {#each shows.results as tv} - - {/each} - - {:catch err} - - {/await} - -

    Upcoming Movies

    - {#await upcomingMovies()} - - {:then shows} - - {#each shows.results as tv} - - {/each} - - {:catch err} - - {/await} - -

    Upcoming Shows

    - {#await upcomingShows()} - - {:then shows} - - {#each shows.results as tv} - - {/each} - - {:catch err} - - {/await} +

    Discover

    + +

    Trending Today

    + {#await allTrending()} + + {:then trending} + + {#each trending.results as trend} + + {#if trend.media_type === "movie" || trend.media_type === "tv"} + + {/if} + {/each} + + {:catch err} + + {/await} + +

    Trending Movies

    + {#await trendingMovies()} + + {:then movies} + + {#each movies.results as movie} + + {/each} + + {:catch err} + + {/await} + +

    Trending Shows

    + {#await trendingShows()} + + {:then shows} + + {#each shows.results as tv} + + {/each} + + {:catch err} + + {/await} + +

    Upcoming Movies

    + {#await upcomingMovies()} + + {:then shows} + + {#each shows.results as tv} + + {/each} + + {:catch err} + + {/await} + +

    Upcoming Shows

    + {#await upcomingShows()} + + {:then shows} + + {#each shows.results as tv} + + {/each} + + {:catch err} + + {/await}
    diff --git a/src/routes/(app)/game/[id]/+page.svelte b/src/routes/(app)/game/[id]/+page.svelte index b484a2dc..07c171ed 100644 --- a/src/routes/(app)/game/[id]/+page.svelte +++ b/src/routes/(app)/game/[id]/+page.svelte @@ -1,411 +1,430 @@ - {game?.name ? `${game.name} - ` : ""}Game + {game?.name ? `${game.name} - ` : ""}Game {#if pageError} - + {:else if !game} - + {:else if Object.keys(game).length > 0} -
    -
    - {#if game?.artworks?.length > 0} - - {:else if game?.cover?.image_id} - - - {/if} -
    - -
    - - -
    - w.category == GameWebsiteCategory.Official)?.url} - releaseYear={new Date(game.first_release_date).getFullYear()} - voteAverage={game.rating} - voteCount={game.rating_count} - /> - - <span class="quick-info"> - {#if game.genres?.length > 0} - <div> - {#each game.genres as g, i} - <span>{g.name}{i !== game.genres.length - 1 ? ", " : ""}</span> - {/each} - </div> - {:else} - <span>Unknown Genres</span> - {/if} - <span></span> - <div> - {#if game.game_modes?.length > 0} - {#each game.game_modes as g, i} - <span>{g.name}{i !== game.game_modes.length - 1 ? ", " : ""}</span> - {/each} - {:else} - <span>Unknown Game Modes</span> - {/if} - </div> - </span> - - <span style="font-weight: bold; font-size: 14px;">Overview</span> - <p>{game.summary}</p> - - <div class="btns"> - {#if trailer} - <button on:click={() => (trailerShown = !trailerShown)}>View Trailer</button> - {#if trailerShown} - <VideoEmbedModal embed={trailer} closed={() => (trailerShown = false)} /> - {/if} - {/if} - {#if wListItem} - <div class="other-side"> - <AddToTagButton watchedItem={wListItem} /> - <button - on:click={() => { - if (wListItem?.pinned) { - contentChanged(undefined, undefined, undefined, false); - } else { - contentChanged(undefined, undefined, undefined, true); - } - }} - use:tooltip={{ - text: `${wListItem?.pinned ? "Unpin from" : "Pin to"} top of list`, - pos: "bot" - }} - > - <Icon i={wListItem?.pinned ? "unpin" : "pin"} wh={19} /> - </button> - <button - class="delete-btn" - on:click={() => - wListItem - ? removeWatched(wListItem.id) - : console.error("no wlistItem.. can't delete")} - use:tooltip={{ text: "Delete", pos: "bot" }} - > - <Icon i="trash" wh={19} /> - </button> - </div> - {/if} - </div> - - <!-- <ProvidersList providers={game["watch/providers"]} /> --> - </div> - </div> - </div> - - <div class="page"> - <div class="review"> - <Rating rating={wListItem?.rating} onChange={(n) => contentChanged(undefined, n)} /> - <Status status={wListItem?.status} isForGame={true} onChange={(n) => contentChanged(n)} /> - {#if wListItem} - <MyThoughts - contentTitle={game.name} - thoughts={wListItem?.thoughts} - onChange={(newThoughts) => { - return contentChanged(undefined, undefined, newThoughts); - }} - /> - {/if} - </div> - - {#if gameId} - <FollowedThoughts mediaType="game" mediaId={gameId} /> - {/if} - - {#if game.similar_games?.length > 0} - <HorizontalList title="Similar"> - {#each game.similar_games as g} - <GamePoster - media={{ - id: g.id, - coverId: g.cover.image_id, - name: g.name, - summary: g.summary, - firstReleaseDate: g.first_release_date - }} - {...getPlayedDependedProps(g.id, wList)} - small={true} - /> - {/each} - </HorizontalList> - {/if} - - {#if wListItem} - <Activity wListId={wListItem.id} activity={wListItem.activity} /> - {/if} - </div> - </div> + <div> + <div class="content"> + {#if game?.artworks?.length > 0} + <img + class="backdrop" + src={"https://images.igdb.com/igdb/image/upload/t_720p/" + + game.artworks[Math.floor(Math.random() * game.artworks.length)] + .image_id + + ".jpg"} + alt="" + /> + {:else if game?.cover?.image_id} + <!-- Fallback to using the game cover for backdrop if there is no artwork --> + <img + class="backdrop" + src={"https://images.igdb.com/igdb/image/upload/t_720p/" + + game.cover.image_id + + ".jpg"} + alt="" + /> + {/if} + <div class="vignette"></div> + + <div class="details-container"> + <img + class="poster" + src={"https://images.igdb.com/igdb/image/upload/t_cover_big/" + + game.cover.image_id + + ".jpg"} + alt="" + /> + + <div class="details"> + <Title + title={game.name} + homepage={game.websites?.find( + (w) => w.category == GameWebsiteCategory.Official, + )?.url} + releaseYear={new Date(game.first_release_date).getFullYear()} + voteAverage={game.rating} + voteCount={game.rating_count} + /> + + <span class="quick-info"> + {#if game.genres?.length > 0} + <div> + {#each game.genres as g, i} + <span>{g.name}{i !== game.genres.length - 1 ? ", " : ""}</span + > + {/each} + </div> + {:else} + <span>Unknown Genres</span> + {/if} + <span></span> + <div> + {#if game.game_modes?.length > 0} + {#each game.game_modes as g, i} + <span + >{g.name}{i !== game.game_modes.length - 1 + ? ", " + : ""}</span + > + {/each} + {:else} + <span>Unknown Game Modes</span> + {/if} + </div> + </span> + + <span style="font-weight: bold; font-size: 14px;">Overview</span> + <p>{game.summary}</p> + + <div class="btns"> + {#if trailer} + <button onclick={() => (trailerShown = !trailerShown)} + >View Trailer</button + > + {#if trailerShown} + <VideoEmbedModal + embed={trailer} + closed={() => (trailerShown = false)} + /> + {/if} + {/if} + {#if wListItem} + <div class="other-side"> + <AddToTagButton watchedItem={wListItem} /> + <button + onclick={() => { + if (wListItem?.pinned) { + contentChanged(undefined, undefined, undefined, false); + } else { + contentChanged(undefined, undefined, undefined, true); + } + }} + use:tooltip={{ + text: `${wListItem?.pinned ? "Unpin from" : "Pin to"} top of list`, + pos: "bot", + }} + > + <Icon i={wListItem?.pinned ? "unpin" : "pin"} wh={19} /> + </button> + <button + class="delete-btn" + onclick={() => + wListItem + ? removeWatched(wListItem.id) + : console.error("no wlistItem.. can't delete")} + use:tooltip={{ text: "Delete", pos: "bot" }} + > + <Icon i="trash" wh={19} /> + </button> + </div> + {/if} + </div> + + <!-- <ProvidersList providers={game["watch/providers"]} /> --> + </div> + </div> + </div> + + <div class="page"> + <div class="review"> + <Rating + rating={wListItem?.rating} + onChange={(n) => contentChanged(undefined, n)} + /> + <Status + status={wListItem?.status} + isForGame={true} + onChange={(n) => contentChanged(n)} + /> + {#if wListItem} + <MyThoughts + contentTitle={game.name} + thoughts={wListItem?.thoughts} + onChange={(newThoughts) => { + return contentChanged(undefined, undefined, newThoughts); + }} + /> + {/if} + </div> + + {#if data.gameId} + <FollowedThoughts mediaType="game" mediaId={data.gameId} /> + {/if} + + {#if game.similar_games?.length > 0} + <HorizontalList title="Similar"> + {#each game.similar_games as g} + <GamePoster + media={{ + id: g.id, + coverId: g.cover.image_id, + name: g.name, + summary: g.summary, + firstReleaseDate: g.first_release_date, + }} + {...getPlayedDependedProps(g.id, store.watchedList)} + small={true} + /> + {/each} + </HorizontalList> + {/if} + + {#if wListItem} + <Activity wListId={wListItem.id} activity={wListItem.activity} /> + {/if} + </div> + </div> {:else} - <Error error="Game not found" pretty="Game not found" /> + <Error error="Game not found" pretty="Game not found" /> {/if} <style lang="scss"> - .content { - position: relative; - color: white; - - img.backdrop { - position: absolute; - left: 0; - top: 0; - z-index: -2; - width: 100%; - height: 100%; - object-fit: cover; - filter: $backdrop-filter; - mix-blend-mode: $backdrop-mix-blend-mode; - mask-image: $backdrop-mask-image; - } - - .vignette { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba($color: #000000, $alpha: 0.7); - z-index: -1; - mask-image: $backdrop-mask-image; - } - - .details-container { - display: flex; - flex-flow: row; - gap: 35px; - max-width: 1100px; - padding: 40px 80px; - margin-left: auto; - margin-right: auto; - - img.poster { - width: 235px; - height: 100%; - box-shadow: 0px 0px 14px -4px #9c8080; - border-radius: 12px; - } - - .details { - display: flex; - flex-flow: column; - gap: 5px; - - .quick-info { - display: flex; - gap: 10px; - margin-bottom: 8px; - } - - p { - font-size: 14px; - margin-bottom: 18px; - } - - .btns { - display: flex; - flex-flow: row; - flex-wrap: wrap; - gap: 8px; - margin-top: auto; - - a.btn, - button { - max-width: fit-content; - overflow: hidden; - animation: 50ms cubic-bezier(0.86, 0, 0.07, 1) forwards otherbtn; - white-space: nowrap; - gap: 6px; - justify-content: flex-start; - font-size: 14px; - - @keyframes otherbtn { - from { - width: 0px; - } - to { - width: 100%; - } - } - } - - .other-side { - display: flex; - flex-flow: row; - gap: 8px; - - @media screen and (min-width: 900px) { - margin-left: auto; - } - } - - .delete-btn { - &:hover { - color: $error; - } - } - } - } - - @media screen and (max-width: 700px) { - padding: 40px; - } - - @media screen and (max-width: 590px) { - flex-flow: column; - align-items: center; - } - } - } - - .page { - display: flex; - flex-flow: column; - align-items: center; - margin-left: auto; - margin-right: auto; - gap: 30px; - padding: 20px 50px; - max-width: 1200px; - - @media screen and (max-width: 500px) { - padding: 20px; - } - } - - .review { - display: flex; - flex-flow: column; - gap: 10px; - width: 100%; - max-width: 380px; - - @media screen and (max-width: 420px) { - max-width: 340px; - } - } - - .creators { - display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 35px; - margin: 10px 60px; - - div { - display: flex; - flex-flow: column; - min-width: 150px; - - span:first-child { - font-weight: bold; - } - } - } + .content { + position: relative; + color: white; + + img.backdrop { + position: absolute; + left: 0; + top: 0; + z-index: -2; + width: 100%; + height: 100%; + object-fit: cover; + filter: $backdrop-filter; + mix-blend-mode: $backdrop-mix-blend-mode; + mask-image: $backdrop-mask-image; + } + + .vignette { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba($color: #000000, $alpha: 0.7); + z-index: -1; + mask-image: $backdrop-mask-image; + } + + .details-container { + display: flex; + flex-flow: row; + gap: 35px; + max-width: 1100px; + padding: 40px 80px; + margin-left: auto; + margin-right: auto; + + img.poster { + width: 235px; + height: 100%; + box-shadow: 0px 0px 14px -4px #9c8080; + border-radius: 12px; + } + + .details { + display: flex; + flex-flow: column; + gap: 5px; + + .quick-info { + display: flex; + gap: 10px; + margin-bottom: 8px; + } + + p { + font-size: 14px; + margin-bottom: 18px; + } + + .btns { + display: flex; + flex-flow: row; + flex-wrap: wrap; + gap: 8px; + margin-top: auto; + + a.btn, + button { + max-width: fit-content; + overflow: hidden; + animation: 50ms cubic-bezier(0.86, 0, 0.07, 1) forwards otherbtn; + white-space: nowrap; + gap: 6px; + justify-content: flex-start; + font-size: 14px; + + @keyframes otherbtn { + from { + width: 0px; + } + to { + width: 100%; + } + } + } + + .other-side { + display: flex; + flex-flow: row; + gap: 8px; + + @media screen and (min-width: 900px) { + margin-left: auto; + } + } + + .delete-btn { + &:hover { + color: $error; + } + } + } + } + + @media screen and (max-width: 700px) { + padding: 40px; + } + + @media screen and (max-width: 590px) { + flex-flow: column; + align-items: center; + } + } + } + + .page { + display: flex; + flex-flow: column; + align-items: center; + margin-left: auto; + margin-right: auto; + gap: 30px; + padding: 20px 50px; + max-width: 1200px; + + @media screen and (max-width: 500px) { + padding: 20px; + } + } + + .review { + display: flex; + flex-flow: column; + gap: 10px; + width: 100%; + max-width: 380px; + + @media screen and (max-width: 420px) { + max-width: 340px; + } + } + + .creators { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 35px; + margin: 10px 60px; + + div { + display: flex; + flex-flow: column; + min-width: 150px; + + span:first-child { + font-weight: bold; + } + } + } </style> diff --git a/src/routes/(app)/game/[id]/+page.ts b/src/routes/(app)/game/[id]/+page.ts index 21a398b2..2a2e9a0f 100644 --- a/src/routes/(app)/game/[id]/+page.ts +++ b/src/routes/(app)/game/[id]/+page.ts @@ -2,14 +2,14 @@ import { error } from "@sveltejs/kit"; import type { PageLoad } from "./$types"; export const load = (async ({ params }) => { - const { id } = params; + const { id } = params; - if (!id) { - error(400); - return; - } + if (!id) { + error(400); + return; + } - return { - gameId: Number(id) - }; + return { + gameId: Number(id), + }; }) satisfies PageLoad; diff --git a/src/routes/(app)/import/+page.svelte b/src/routes/(app)/import/+page.svelte index cf70387a..e0578b27 100644 --- a/src/routes/(app)/import/+page.svelte +++ b/src/routes/(app)/import/+page.svelte @@ -6,768 +6,808 @@ --> <script lang="ts"> - import { goto } from "$app/navigation"; - import DropFileButton from "@/lib/DropFileButton.svelte"; - import Spinner from "@/lib/Spinner.svelte"; - import { notify } from "@/lib/util/notify"; - import { importedList } from "@/store"; - import { onMount } from "svelte"; - import papa from "papaparse"; - import type { - ImportedList, - MovaryHistory, - MovaryRatings, - MovaryWatchlist, - Watched, - WatchedStatus, - TodoMoviesExport, - TagAddRequest, - TodoMoviesCustomList, - TodoMoviesMovie - } from "@/types"; - import Icon from "@/lib/Icon.svelte"; - - let isDragOver = false; - let isLoading = false; - - function processFiles(files: FileList | null | undefined, type: "text-list" | "tmdb" | "imdb") { - try { - console.log("processFiles", files); - if (!files || files?.length <= 0) { - console.error("processFiles", "No files to process!"); - notify({ - type: "error", - text: "File not found in dropped items. Please try again or refresh.", - time: 6000 - }); - isDragOver = false; - return; - } - isLoading = true; - if (files.length > 1) { - notify({ - type: "error", - text: "Only one file at a time is supported. Continuing with the first.", - time: 6000 - }); - } - // Currently only support for importing one file at a time - const file = files[0]; - if (type === "text-list" && file.type !== "text/plain") { - notify({ - type: "error", - text: "Text list export must be a .txt file!" - }); - isLoading = false; - isDragOver = false; - return; - } - if ((type === "tmdb" || type === "imdb") && file.type !== "text/csv") { - notify({ - type: "error", - text: `${type} export must be a .csv file!` - }); - isLoading = false; - isDragOver = false; - return; - } - const r = new FileReader(); - r.addEventListener( - "load", - () => { - if (r.result) { - importedList.set({ - data: r.result.toString(), - type - }); - goto("/import/process"); - } - }, - false - ); - r.readAsText(file); - } catch (err) { - isLoading = false; - notify({ type: "error", text: "Failed to read file!" }); - console.error("import: Failed to read file!", err); - } - } - - async function readFile(fr: FileReader, file: File): Promise<string> { - return new Promise((resolve, reject) => { - const res = () => { - fr.removeEventListener("load", res); - fr.removeEventListener("error", rej); - if (fr.result) { - resolve(fr.result.toString()); - } else { - reject("no result"); - } - }; - const rej = () => { - fr.removeEventListener("load", res); - fr.removeEventListener("error", rej); - reject(); - }; - fr.addEventListener("load", res); - fr.addEventListener("error", rej); - fr.readAsText(file); - }); - } - - /** - * Process movary import files. - * - * Movary exports 3 different files: - * - * - watchlist.csv = Planned movies. - * - history.csv = Watched movies, movie can be watched multiple times. - * - ratings.csv = Ratings for movies. One rating per movie. - * - * Export types explained better here: - * /~https://github.com/sbondCo/Watcharr/issues/332#issuecomment-1920662244 - */ - async function processFilesMovary(files?: FileList | null) { - try { - console.log("processFilesMovary", files); - if (!files || files?.length <= 0) { - console.error("processFilesMovary", "No files to process!"); - notify({ - type: "error", - text: "File not found in dropped items. Please try again or refresh.", - time: 6000 - }); - isDragOver = false; - return; - } - if (files.length !== 3) { - notify({ - type: "error", - text: "You must select or drop 3 files: history.csv, ratings.csv and watchlist.csv.", - time: 6000 - }); - isDragOver = false; - return; - } - isLoading = true; - // Read file data into strings - let history: string | undefined; - let ratings: string | undefined; - let watchlist: string | undefined; - const r = new FileReader(); - for (let i = 0; i < files.length; i++) { - const f = files[i]; - if (f.name === "history.csv") { - history = await readFile(r, f); - } else if (f.name === "ratings.csv") { - ratings = await readFile(r, f); - } else if (f.name === "watchlist.csv") { - watchlist = await readFile(r, f); - } - } - if (!history || !ratings || !watchlist) { - notify({ - type: "error", - text: "Failed to read history, ratings or watchlist. Ensure you have attached 3 files: history.csv, ratings.csv and watchlist.csv.", - time: 6000 - }); - isDragOver = false; - isLoading = false; - return; - } - console.log("loaded all files"); - // Convert csv strings into json - const historyJson = papa.parse<MovaryHistory>(history.trim(), { header: true }); - const ratingsJson = papa.parse<MovaryRatings>(ratings.trim(), { header: true }); - const watchlistJson = papa.parse<MovaryWatchlist>(watchlist.trim(), { header: true }); - // Build toImport array - const toImport: ImportedList[] = []; - // Add all history movies (watched). There can be multiple entries for each movie. - for (let i = 0; i < historyJson.data.length; i++) { - const h = historyJson.data[i]; - // Skip if no tmdb id. - if (!h.tmdbId) { - continue; - } - // Skip if already added. The first time it is added we get all info needed from other entries. - if (toImport.filter((ti) => ti.tmdbId == Number(h.tmdbId)).length > 0) { - continue; - } - const ratingsEntry = ratingsJson.data.find((r) => r.tmdbId == h.tmdbId); - const t: ImportedList = { - name: h.title, - tmdbId: Number(h.tmdbId), - status: "FINISHED", - type: "movie", // movary only supports movies - datesWatched: [], - thoughts: "" - }; - // Movie can be watched more than once, get all entries to store all watch dates. - const allEntries = historyJson.data.filter((he) => he.tmdbId === h.tmdbId); - for (let i = 0; i < allEntries.length; i++) { - const e = allEntries[i]; - if (e.watchedAt) { - t.datesWatched?.push(new Date(e.watchedAt)); - } - if (e.comment) { - t.thoughts += e.comment + "\n"; - } - } - if (h.year) { - t.year = h.year; - } - if (ratingsEntry && ratingsEntry?.userRating) { - t.rating = Number(ratingsEntry.userRating); - } - toImport.push(t); - } - // Add all watchlist movies (planned). - for (let i = 0; i < watchlistJson.data.length; i++) { - const wl = watchlistJson.data[i]; - const existing = toImport.find((ti) => ti.tmdbId == Number(wl.tmdbId)); - // If already exists in toImport, simply update status to PLANNED. - // The movie must have been completed in past, but added back to - // the users movary watch list as they are planning to watch it again. - if (existing) { - existing.status = "PLANNED"; - continue; - } - toImport.push({ - name: wl.title, - tmdbId: Number(wl.tmdbId), - status: "PLANNED", - type: "movie" // movary only supports movies - }); - } - console.log("toImport:", toImport); - importedList.set({ - data: JSON.stringify(toImport), - type: "movary" - }); - goto("/import/process"); - } catch (err) { - isLoading = false; - notify({ type: "error", text: "Failed to read files!" }); - console.error("import: Failed to read files!", err); - } - } - - async function processWatcharrFile(files?: FileList | null) { - try { - console.log("processWatcharrFile", files); - if (!files || files?.length <= 0) { - console.error("processWatcharrFile", "No files to process!"); - notify({ - type: "error", - text: "File not found in dropped items. Please try again or refresh.", - time: 6000 - }); - isDragOver = false; - return; - } - isLoading = true; - if (files.length > 1) { - notify({ - type: "error", - text: "Only one file at a time is supported. Continuing with the first.", - time: 6000 - }); - } - // Currently only support for importing one file at a time - const file = files[0]; - if (file.type !== "application/json") { - notify({ - type: "error", - text: "Must be a Watcharr JSON export file" - }); - isLoading = false; - isDragOver = false; - return; - } - // Build toImport array - const toImport: ImportedList[] = []; - const fileText = await readFile(new FileReader(), file); - const jsonData = JSON.parse(fileText) as Watched[]; - for (const v of jsonData) { - if (!v.content || !v.content.title) { - notify({ - type: "error", - text: "Item in export has no content or a missing title! Look in console for more details." - }); - console.error( - "Can't add export item to import table! It has no content or a missing content.title! Item:", - v - ); - continue; - } - const t: ImportedList = { - tmdbId: v.content.tmdbId, - name: v.content.title, - year: new Date(v.content.release_date)?.getFullYear()?.toString(), - type: v.content.type, - rating: v.rating, - status: v.status, - thoughts: v.thoughts, - // datesWatched: [new Date(v.createdAt)], // Shouldn't need this, all activity will be imported, including ADDED_WATCHED activity - activity: v.activity, - watchedEpisodes: v.watchedEpisodes, - watchedSeasons: v.watchedSeasons - }; - toImport.push(t); - } - console.log("toImport:", toImport); - importedList.set({ - data: JSON.stringify(toImport), - type: "watcharr" - }); - goto("/import/process"); - } catch (err) { - isLoading = false; - notify({ type: "error", text: "Failed to read file!" }); - console.error("import: Failed to read file!", err); - } - } - - function processFilesMyAnimeList(files?: FileList | null) { - try { - console.log("processFilesMyAnimeList", files); - if (!files || files?.length <= 0) { - console.error("processFilesMyAnimeList", "No files to process!"); - notify({ - type: "error", - text: "File not found in dropped items. Please try again or refresh.", - time: 6000 - }); - isDragOver = false; - return; - } - isLoading = true; - if (files.length > 1) { - notify({ - type: "error", - text: "Only one file at a time is supported. Continuing with the first.", - time: 6000 - }); - } - // Currently only support for importing one file at a time - const file = files[0]; - if (file.type !== "text/xml") { - notify({ - type: "error", - text: "Your MyAnimeList export should be a xml file." - }); - isLoading = false; - isDragOver = false; - return; - } - const r = new FileReader(); - r.addEventListener( - "load", - () => { - if (r.result) { - importedList.set({ - data: r.result.toString(), - type: "myanimelist" - }); - goto("/import/process"); - } - }, - false - ); - r.readAsText(file); - } catch (err) { - isLoading = false; - notify({ type: "error", text: "Failed to read file!" }); - console.error("import: Failed to read file!", err); - } - } - - async function processRyotFile(files?: FileList | null) { - try { - console.log("processRyotFile", files); - if (!files || files?.length <= 0) { - console.error("processRyotFile", "No files to process!"); - notify({ - type: "error", - text: "File not found in dropped items. Please try again or refresh.", - time: 6000 - }); - isDragOver = false; - return; - } - isLoading = true; - if (files.length > 1) { - notify({ - type: "error", - text: "Only one file at a time is supported. Continuing with the first.", - time: 6000 - }); - } - - // Currently only support for importing one file at a time - const file = files[0]; - if (file.type !== "application/json") { - notify({ - type: "error", - text: "Must be a Ryot JSON export file" - }); - isLoading = false; - isDragOver = false; - return; - } - - // Build toImport array - const toImport: ImportedList[] = []; - const fileText = await readFile(new FileReader(), file); - const jsonData = JSON.parse(fileText)["media"] as any[]; - for (const v of jsonData) { - if (!v.source_id || !v.identifier || !(v.lot == "show" || v.lot == "movie")) { - notify({ - type: "error", - text: "Item in export either has no title, TMDB identifier or is not a movie/tv show! Look in console for more details." - }); - console.error( - "Can't add export item to import table! It has title, TMDB identifier or is not a movie/tv show! Item:", - v - ); - continue; - } - - // Define the main general status of the movie/show - // In Ryot, it can be marked as multiple of the following, so choose the most relevant - const statusRanks: [string, WatchedStatus][] = [ - ["", "DROPPED"], - ["Watchlist", "PLANNED"], - ["Monitoring", "PLANNED"], - ["In Progress", "WATCHING"], - ["Completed", "FINISHED"] - ]; - let rank = 0; - for (const s of v.collections) { - rank = Math.max( - rank, - statusRanks.findIndex((pair) => pair[0] == s) - ); - } - - /** - * Ryot ratings are scored out of 100, - * scale this down to fit with watcharrs - * ratings that are out of 10. - */ - const validifyRating = (ryotRating: number) => { - const r = Number(ryotRating); - if (isNaN(r)) { - return 0; - } - return Math.floor(r / 10); - }; - - const t: ImportedList = { - tmdbId: Number(v.identifier), - name: v.source_id, - type: v.lot === "show" ? "tv" : v.lot, - status: statusRanks[rank][1], - - // In Ryot, shows can have one review for each episode - Not supported in Watcharr - // Will ignore the episodes' reviews - thoughts: v.lot === "movie" && v.reviews?.length ? v.reviews[0].review?.text : "", - - // Ryot does not support overall rating for shows - rating: - v.lot === "movie" && v.reviews?.length - ? validifyRating(Number(v.reviews[0].rating)) - : undefined, - - datesWatched: - v.lot === "movie" && v.seen_history?.length - ? v.seen_history.map((seen: any) => new Date(seen.ended_on)) - : [], - - // Episode ratings are on a separate field: "reviews" - watchedEpisodes: - v.lot === "show" - ? v.seen_history?.map((episode: any) => ({ - status: episode.progress === "100" ? "FINISHED" : "WATCHING", - - // Linear :( search the reviews for a match - rating: - validifyRating( - Number( - ( - v.reviews?.find( - (review: any) => - review.show_season_number === episode.show_season_number && - review.show_episode_number === episode.show_episode_number - ) || {} - )?.rating - ) - ) || null, - - seasonNumber: episode.show_season_number, - episodeNumber: episode.show_episode_number, - createdAt: episode.ended_on ? new Date(episode.ended_on) : undefined - })) - : undefined - }; - toImport.push(t); - } - console.log("toImport:", toImport); - importedList.set({ - data: JSON.stringify(toImport), - type: "ryot" - }); - goto("/import/process"); - } catch (err) { - isLoading = false; - notify({ type: "error", text: "Failed to read file!" }); - console.error("import: Failed to read file!", err); - } - } - - async function processTodoMoviesFile(files?: FileList | null) { - try { - console.log("processFilesTodoMovies", files); - if (!files || files?.length <= 0) { - console.error("processFilesTodoMovies", "No files to process!"); - notify({ - type: "error", - text: "File not found in dropped items. Please try again or refresh.", - time: 6000 - }); - isDragOver = false; - return; - } - isLoading = true; - if (files.length > 1) { - notify({ - type: "error", - text: "Only one file at a time is supported. Continuing with the first.", - time: 6000 - }); - } - - // Currently only support for importing one file at a time - const file = files[0]; - if (file.type !== "" && !file.name.endsWith(".todomovieslist")) { - notify({ - type: "error", - text: "Must be a TodoMovies backup file (.todomovieslist)" - }); - isLoading = false; - isDragOver = false; - return; - } - - // Read file data into strings - let exportTodoMoviesStr: string | undefined; - const r = new FileReader(); - exportTodoMoviesStr = await readFile(r, file); - if (!exportTodoMoviesStr) { - notify({ - type: "error", - text: "Failed to read export file. Ensure you have attached the correct file.", - time: 6000 - }); - isDragOver = false; - isLoading = false; - return; - } - console.log("Loaded file"); - - const exportTodoMovies: TodoMoviesExport = JSON.parse(exportTodoMoviesStr); - - console.log("exportTodoMovies:", exportTodoMovies); - - const movieList: TodoMoviesMovie[] = exportTodoMovies.Movie; - const customLists: TodoMoviesCustomList[] = exportTodoMovies.MovieList; - - // Build toImport array - const toImport: ImportedList[] = []; - - // Convert the timestamp to seconds (NSDate uses seconds since 2001-01-01 00:00:00 UTC) - const referenceDate = new Date(2001, 0, 1); - - // Add all history movies. There is only one entry for every movie. - // Movies which have already been watched but which have been added back in planning are also included, as this could also have ratings and comments. - for (let i = 0; i < movieList.length; i++) { - const h = movieList[i]; - // Skip if no tmdb id. - if (!h.Attrs.tmdbID) { - continue; - } - // Skip if already added. The first time it is added we get all info needed from other entries. - if (toImport.filter((ti) => ti.tmdbId == Number(h.Attrs.tmdbID)).length > 0) { - continue; - } - - const nsInsertionDate = h.Attrs.insertionDate.Value; - const date = new Date(referenceDate.getTime() + nsInsertionDate * 1000); - const tagsIds = h.Rels.lists.Items; - const tags = tagsIds.map((tagId) => { - const tag = customLists.find((list) => list.ObjectID == tagId); - return { - name: "TodoMovies list: " + tag?.Attrs.name, - color: "#000000", - bgColor: tag?.Attrs.colorInHex - } as TagAddRequest; - }); - const t: ImportedList = { - name: h.Attrs.title, - tmdbId: Number(h.Attrs.tmdbID), - status: h.Attrs.isWatched == 1 ? "FINISHED" : "PLANNED", - type: "movie", // TodoMovies only supports movies - datesWatched: [date], // use activities instead - thoughts: "", // no comments in TodoMovies - rating: h.Attrs.myScore, - tags: tags - }; - toImport.push(t); - } - - console.log("toImport:", toImport); - importedList.set({ - data: JSON.stringify(toImport), - type: "todomovies" - }); - - goto("/import/process"); - } catch (err) { - isLoading = false; - notify({ type: "error", text: "Failed to read files!" }); - console.error("import: Failed to read files!", err); - } - } - - onMount(() => { - if (!localStorage.getItem("token")) { - goto("/login"); - } - }); + import { goto } from "$app/navigation"; + import DropFileButton from "@/lib/DropFileButton.svelte"; + import Spinner from "@/lib/Spinner.svelte"; + import { notify } from "@/lib/util/notify"; + import { store } from "@/store.svelte"; + import { onMount } from "svelte"; + import papa from "papaparse"; + import type { + ImportedList, + MovaryHistory, + MovaryRatings, + MovaryWatchlist, + Watched, + WatchedStatus, + TodoMoviesExport, + TagAddRequest, + TodoMoviesCustomList, + TodoMoviesMovie, + } from "@/types"; + import Icon from "@/lib/Icon.svelte"; + + let isDragOver = false; + let isLoading = $state(false); + + function processFiles( + files: FileList | null | undefined, + type: "text-list" | "tmdb" | "imdb", + ) { + try { + console.log("processFiles", files); + if (!files || files?.length <= 0) { + console.error("processFiles", "No files to process!"); + notify({ + type: "error", + text: "File not found in dropped items. Please try again or refresh.", + time: 6000, + }); + isDragOver = false; + return; + } + isLoading = true; + if (files.length > 1) { + notify({ + type: "error", + text: "Only one file at a time is supported. Continuing with the first.", + time: 6000, + }); + } + // Currently only support for importing one file at a time + const file = files[0]; + if (type === "text-list" && file.type !== "text/plain") { + notify({ + type: "error", + text: "Text list export must be a .txt file!", + }); + isLoading = false; + isDragOver = false; + return; + } + if ((type === "tmdb" || type === "imdb") && file.type !== "text/csv") { + notify({ + type: "error", + text: `${type} export must be a .csv file!`, + }); + isLoading = false; + isDragOver = false; + return; + } + const r = new FileReader(); + r.addEventListener( + "load", + () => { + if (r.result) { + store.importedList = { + data: r.result.toString(), + type, + }; + goto("/import/process"); + } + }, + false, + ); + r.readAsText(file); + } catch (err) { + isLoading = false; + notify({ type: "error", text: "Failed to read file!" }); + console.error("import: Failed to read file!", err); + } + } + + async function readFile(fr: FileReader, file: File): Promise<string> { + return new Promise((resolve, reject) => { + const res = () => { + fr.removeEventListener("load", res); + fr.removeEventListener("error", rej); + if (fr.result) { + resolve(fr.result.toString()); + } else { + reject("no result"); + } + }; + const rej = () => { + fr.removeEventListener("load", res); + fr.removeEventListener("error", rej); + reject(); + }; + fr.addEventListener("load", res); + fr.addEventListener("error", rej); + fr.readAsText(file); + }); + } + + /** + * Process movary import files. + * + * Movary exports 3 different files: + * + * - watchlist.csv = Planned movies. + * - history.csv = Watched movies, movie can be watched multiple times. + * - ratings.csv = Ratings for movies. One rating per movie. + * + * Export types explained better here: + * /~https://github.com/sbondCo/Watcharr/issues/332#issuecomment-1920662244 + */ + async function processFilesMovary(files?: FileList | null) { + try { + console.log("processFilesMovary", files); + if (!files || files?.length <= 0) { + console.error("processFilesMovary", "No files to process!"); + notify({ + type: "error", + text: "File not found in dropped items. Please try again or refresh.", + time: 6000, + }); + isDragOver = false; + return; + } + if (files.length !== 3) { + notify({ + type: "error", + text: "You must select or drop 3 files: history.csv, ratings.csv and watchlist.csv.", + time: 6000, + }); + isDragOver = false; + return; + } + isLoading = true; + // Read file data into strings + let history: string | undefined; + let ratings: string | undefined; + let watchlist: string | undefined; + const r = new FileReader(); + for (let i = 0; i < files.length; i++) { + const f = files[i]; + if (f.name === "history.csv") { + history = await readFile(r, f); + } else if (f.name === "ratings.csv") { + ratings = await readFile(r, f); + } else if (f.name === "watchlist.csv") { + watchlist = await readFile(r, f); + } + } + if (!history || !ratings || !watchlist) { + notify({ + type: "error", + text: "Failed to read history, ratings or watchlist. Ensure you have attached 3 files: history.csv, ratings.csv and watchlist.csv.", + time: 6000, + }); + isDragOver = false; + isLoading = false; + return; + } + console.log("loaded all files"); + // Convert csv strings into json + const historyJson = papa.parse<MovaryHistory>(history.trim(), { + header: true, + }); + const ratingsJson = papa.parse<MovaryRatings>(ratings.trim(), { + header: true, + }); + const watchlistJson = papa.parse<MovaryWatchlist>(watchlist.trim(), { + header: true, + }); + // Build toImport array + const toImport: ImportedList[] = []; + // Add all history movies (watched). There can be multiple entries for each movie. + for (let i = 0; i < historyJson.data.length; i++) { + const h = historyJson.data[i]; + // Skip if no tmdb id. + if (!h.tmdbId) { + continue; + } + // Skip if already added. The first time it is added we get all info needed from other entries. + if (toImport.filter((ti) => ti.tmdbId == Number(h.tmdbId)).length > 0) { + continue; + } + const ratingsEntry = ratingsJson.data.find((r) => r.tmdbId == h.tmdbId); + const t: ImportedList = { + name: h.title, + tmdbId: Number(h.tmdbId), + status: "FINISHED", + type: "movie", // movary only supports movies + datesWatched: [], + thoughts: "", + }; + // Movie can be watched more than once, get all entries to store all watch dates. + const allEntries = historyJson.data.filter( + (he) => he.tmdbId === h.tmdbId, + ); + for (let i = 0; i < allEntries.length; i++) { + const e = allEntries[i]; + if (e.watchedAt) { + t.datesWatched?.push(new Date(e.watchedAt)); + } + if (e.comment) { + t.thoughts += e.comment + "\n"; + } + } + if (h.year) { + t.year = h.year; + } + if (ratingsEntry && ratingsEntry?.userRating) { + t.rating = Number(ratingsEntry.userRating); + } + toImport.push(t); + } + // Add all watchlist movies (planned). + for (let i = 0; i < watchlistJson.data.length; i++) { + const wl = watchlistJson.data[i]; + const existing = toImport.find((ti) => ti.tmdbId == Number(wl.tmdbId)); + // If already exists in toImport, simply update status to PLANNED. + // The movie must have been completed in past, but added back to + // the users movary watch list as they are planning to watch it again. + if (existing) { + existing.status = "PLANNED"; + continue; + } + toImport.push({ + name: wl.title, + tmdbId: Number(wl.tmdbId), + status: "PLANNED", + type: "movie", // movary only supports movies + }); + } + console.log("toImport:", toImport); + store.importedList = { + data: JSON.stringify(toImport), + type: "movary", + }; + goto("/import/process"); + } catch (err) { + isLoading = false; + notify({ type: "error", text: "Failed to read files!" }); + console.error("import: Failed to read files!", err); + } + } + + async function processWatcharrFile(files?: FileList | null) { + try { + console.log("processWatcharrFile", files); + if (!files || files?.length <= 0) { + console.error("processWatcharrFile", "No files to process!"); + notify({ + type: "error", + text: "File not found in dropped items. Please try again or refresh.", + time: 6000, + }); + isDragOver = false; + return; + } + isLoading = true; + if (files.length > 1) { + notify({ + type: "error", + text: "Only one file at a time is supported. Continuing with the first.", + time: 6000, + }); + } + // Currently only support for importing one file at a time + const file = files[0]; + if (file.type !== "application/json") { + notify({ + type: "error", + text: "Must be a Watcharr JSON export file", + }); + isLoading = false; + isDragOver = false; + return; + } + // Build toImport array + const toImport: ImportedList[] = []; + const fileText = await readFile(new FileReader(), file); + const jsonData = JSON.parse(fileText) as Watched[]; + for (const v of jsonData) { + if (!v.content || !v.content.title) { + notify({ + type: "error", + text: "Item in export has no content or a missing title! Look in console for more details.", + }); + console.error( + "Can't add export item to import table! It has no content or a missing content.title! Item:", + v, + ); + continue; + } + const t: ImportedList = { + tmdbId: v.content.tmdbId, + name: v.content.title, + year: new Date(v.content.release_date)?.getFullYear()?.toString(), + type: v.content.type, + rating: v.rating, + status: v.status, + thoughts: v.thoughts, + // datesWatched: [new Date(v.createdAt)], // Shouldn't need this, all activity will be imported, including ADDED_WATCHED activity + activity: v.activity, + watchedEpisodes: v.watchedEpisodes, + watchedSeasons: v.watchedSeasons, + }; + toImport.push(t); + } + console.log("toImport:", toImport); + store.importedList = { + data: JSON.stringify(toImport), + type: "watcharr", + }; + goto("/import/process"); + } catch (err) { + isLoading = false; + notify({ type: "error", text: "Failed to read file!" }); + console.error("import: Failed to read file!", err); + } + } + + function processFilesMyAnimeList(files?: FileList | null) { + try { + console.log("processFilesMyAnimeList", files); + if (!files || files?.length <= 0) { + console.error("processFilesMyAnimeList", "No files to process!"); + notify({ + type: "error", + text: "File not found in dropped items. Please try again or refresh.", + time: 6000, + }); + isDragOver = false; + return; + } + isLoading = true; + if (files.length > 1) { + notify({ + type: "error", + text: "Only one file at a time is supported. Continuing with the first.", + time: 6000, + }); + } + // Currently only support for importing one file at a time + const file = files[0]; + if (file.type !== "text/xml") { + notify({ + type: "error", + text: "Your MyAnimeList export should be a xml file.", + }); + isLoading = false; + isDragOver = false; + return; + } + const r = new FileReader(); + r.addEventListener( + "load", + () => { + if (r.result) { + store.importedList = { + data: r.result.toString(), + type: "myanimelist", + }; + goto("/import/process"); + } + }, + false, + ); + r.readAsText(file); + } catch (err) { + isLoading = false; + notify({ type: "error", text: "Failed to read file!" }); + console.error("import: Failed to read file!", err); + } + } + + async function processRyotFile(files?: FileList | null) { + try { + console.log("processRyotFile", files); + if (!files || files?.length <= 0) { + console.error("processRyotFile", "No files to process!"); + notify({ + type: "error", + text: "File not found in dropped items. Please try again or refresh.", + time: 6000, + }); + isDragOver = false; + return; + } + isLoading = true; + if (files.length > 1) { + notify({ + type: "error", + text: "Only one file at a time is supported. Continuing with the first.", + time: 6000, + }); + } + + // Currently only support for importing one file at a time + const file = files[0]; + if (file.type !== "application/json") { + notify({ + type: "error", + text: "Must be a Ryot JSON export file", + }); + isLoading = false; + isDragOver = false; + return; + } + + // Build toImport array + const toImport: ImportedList[] = []; + const fileText = await readFile(new FileReader(), file); + const jsonData = JSON.parse(fileText)["media"] as any[]; + for (const v of jsonData) { + if ( + !v.source_id || + !v.identifier || + !(v.lot == "show" || v.lot == "movie") + ) { + notify({ + type: "error", + text: "Item in export either has no title, TMDB identifier or is not a movie/tv show! Look in console for more details.", + }); + console.error( + "Can't add export item to import table! It has title, TMDB identifier or is not a movie/tv show! Item:", + v, + ); + continue; + } + + // Define the main general status of the movie/show + // In Ryot, it can be marked as multiple of the following, so choose the most relevant + const statusRanks: [string, WatchedStatus][] = [ + ["", "DROPPED"], + ["Watchlist", "PLANNED"], + ["Monitoring", "PLANNED"], + ["In Progress", "WATCHING"], + ["Completed", "FINISHED"], + ]; + let rank = 0; + for (const s of v.collections) { + rank = Math.max( + rank, + statusRanks.findIndex((pair) => pair[0] == s), + ); + } + + /** + * Ryot ratings are scored out of 100, + * scale this down to fit with watcharrs + * ratings that are out of 10. + */ + const validifyRating = (ryotRating: number) => { + const r = Number(ryotRating); + if (isNaN(r)) { + return 0; + } + return Math.floor(r / 10); + }; + + const t: ImportedList = { + tmdbId: Number(v.identifier), + name: v.source_id, + type: v.lot === "show" ? "tv" : v.lot, + status: statusRanks[rank][1], + + // In Ryot, shows can have one review for each episode - Not supported in Watcharr + // Will ignore the episodes' reviews + thoughts: + v.lot === "movie" && v.reviews?.length + ? v.reviews[0].review?.text + : "", + + // Ryot does not support overall rating for shows + rating: + v.lot === "movie" && v.reviews?.length + ? validifyRating(Number(v.reviews[0].rating)) + : undefined, + + datesWatched: + v.lot === "movie" && v.seen_history?.length + ? v.seen_history.map((seen: any) => new Date(seen.ended_on)) + : [], + + // Episode ratings are on a separate field: "reviews" + watchedEpisodes: + v.lot === "show" + ? v.seen_history?.map((episode: any) => ({ + status: episode.progress === "100" ? "FINISHED" : "WATCHING", + + // Linear :( search the reviews for a match + rating: + validifyRating( + Number( + ( + v.reviews?.find( + (review: any) => + review.show_season_number === + episode.show_season_number && + review.show_episode_number === + episode.show_episode_number, + ) || {} + )?.rating, + ), + ) || null, + + seasonNumber: episode.show_season_number, + episodeNumber: episode.show_episode_number, + createdAt: episode.ended_on + ? new Date(episode.ended_on) + : undefined, + })) + : undefined, + }; + toImport.push(t); + } + console.log("toImport:", toImport); + store.importedList = { + data: JSON.stringify(toImport), + type: "ryot", + }; + goto("/import/process"); + } catch (err) { + isLoading = false; + notify({ type: "error", text: "Failed to read file!" }); + console.error("import: Failed to read file!", err); + } + } + + async function processTodoMoviesFile(files?: FileList | null) { + try { + console.log("processFilesTodoMovies", files); + if (!files || files?.length <= 0) { + console.error("processFilesTodoMovies", "No files to process!"); + notify({ + type: "error", + text: "File not found in dropped items. Please try again or refresh.", + time: 6000, + }); + isDragOver = false; + return; + } + isLoading = true; + if (files.length > 1) { + notify({ + type: "error", + text: "Only one file at a time is supported. Continuing with the first.", + time: 6000, + }); + } + + // Currently only support for importing one file at a time + const file = files[0]; + if (file.type !== "" && !file.name.endsWith(".todomovieslist")) { + notify({ + type: "error", + text: "Must be a TodoMovies backup file (.todomovieslist)", + }); + isLoading = false; + isDragOver = false; + return; + } + + // Read file data into strings + let exportTodoMoviesStr: string | undefined; + const r = new FileReader(); + exportTodoMoviesStr = await readFile(r, file); + if (!exportTodoMoviesStr) { + notify({ + type: "error", + text: "Failed to read export file. Ensure you have attached the correct file.", + time: 6000, + }); + isDragOver = false; + isLoading = false; + return; + } + console.log("Loaded file"); + + const exportTodoMovies: TodoMoviesExport = + JSON.parse(exportTodoMoviesStr); + + console.log("exportTodoMovies:", exportTodoMovies); + + const movieList: TodoMoviesMovie[] = exportTodoMovies.Movie; + const customLists: TodoMoviesCustomList[] = exportTodoMovies.MovieList; + + // Build toImport array + const toImport: ImportedList[] = []; + + // Convert the timestamp to seconds (NSDate uses seconds since 2001-01-01 00:00:00 UTC) + const referenceDate = new Date(2001, 0, 1); + + // Add all history movies. There is only one entry for every movie. + // Movies which have already been watched but which have been added back in planning are also included, as this could also have ratings and comments. + for (let i = 0; i < movieList.length; i++) { + const h = movieList[i]; + // Skip if no tmdb id. + if (!h.Attrs.tmdbID) { + continue; + } + // Skip if already added. The first time it is added we get all info needed from other entries. + if ( + toImport.filter((ti) => ti.tmdbId == Number(h.Attrs.tmdbID)).length > + 0 + ) { + continue; + } + + const nsInsertionDate = h.Attrs.insertionDate.Value; + const date = new Date(referenceDate.getTime() + nsInsertionDate * 1000); + const tagsIds = h.Rels.lists.Items; + const tags = tagsIds.map((tagId) => { + const tag = customLists.find((list) => list.ObjectID == tagId); + return { + name: "TodoMovies list: " + tag?.Attrs.name, + color: "#000000", + bgColor: tag?.Attrs.colorInHex, + } as TagAddRequest; + }); + const t: ImportedList = { + name: h.Attrs.title, + tmdbId: Number(h.Attrs.tmdbID), + status: h.Attrs.isWatched == 1 ? "FINISHED" : "PLANNED", + type: "movie", // TodoMovies only supports movies + datesWatched: [date], // use activities instead + thoughts: "", // no comments in TodoMovies + rating: h.Attrs.myScore, + tags: tags, + }; + toImport.push(t); + } + + console.log("toImport:", toImport); + store.importedList = { + data: JSON.stringify(toImport), + type: "todomovies", + }; + + goto("/import/process"); + } catch (err) { + isLoading = false; + notify({ type: "error", text: "Failed to read files!" }); + console.error("import: Failed to read files!", err); + } + } + + onMount(() => { + if (!localStorage.getItem("token")) { + goto("/login"); + } + }); </script> <div class="content"> - <div class="inner"> - <div> - <span class="header"> - <h2>Import Your Watchlist</h2> - <h5 class="norm">beta</h5> - </span> - <!-- <h4 class="norm">Currently txt and csv (TMDb export) files are supported.</h4> --> - </div> - <div class="big-btns"> - {#if isLoading} - <Spinner /> - {:else} - <DropFileButton text="Watcharr Export" filesSelected={(f) => processWatcharrFile(f)} /> - - <!-- TODO Add info... on what a '.txt list' means and supports --> - <DropFileButton text=".txt list" filesSelected={(f) => processFiles(f, "text-list")} /> - - <DropFileButton - icon="themoviedb" - text="TMDb" - filesSelected={(f) => processFiles(f, "tmdb")} - /> - - <button class="plain" on:click={() => goto("/import/trakt")}> - <Icon i="trakt" wh="100%" /> - <h4 class="norm">Trakt Import</h4> - </button> - - <DropFileButton icon="imdb" text="IMDb" filesSelected={(f) => processFiles(f, "imdb")} /> - - <DropFileButton - icon="movary" - text="Movary Exports" - filesSelected={(f) => processFilesMovary(f)} - allowSelectMultipleFiles - /> - - <DropFileButton - icon="myanimelist" - text="MyAnimeList Export" - filesSelected={(f) => processFilesMyAnimeList(f)} - /> - - <DropFileButton icon="ryot" text="Ryot Exports" filesSelected={(f) => processRyotFile(f)} /> - - <DropFileButton - icon="todomovies" - text="TodoMovies" - filesSelected={(f) => processTodoMoviesFile(f)} - /> - {/if} - </div> - </div> + <div class="inner"> + <div> + <span class="header"> + <h2>Import Your Watchlist</h2> + <h5 class="norm">beta</h5> + </span> + <!-- <h4 class="norm">Currently txt and csv (TMDb export) files are supported.</h4> --> + </div> + <div class="big-btns"> + {#if isLoading} + <Spinner /> + {:else} + <DropFileButton + text="Watcharr Export" + filesSelected={(f) => processWatcharrFile(f)} + /> + + <!-- TODO Add info... on what a '.txt list' means and supports --> + <DropFileButton + text=".txt list" + filesSelected={(f) => processFiles(f, "text-list")} + /> + + <DropFileButton + icon="themoviedb" + text="TMDb" + filesSelected={(f) => processFiles(f, "tmdb")} + /> + + <button class="plain" onclick={() => goto("/import/trakt")}> + <Icon i="trakt" wh="100%" /> + <h4 class="norm">Trakt Import</h4> + </button> + + <DropFileButton + icon="imdb" + text="IMDb" + filesSelected={(f) => processFiles(f, "imdb")} + /> + + <DropFileButton + icon="movary" + text="Movary Exports" + filesSelected={(f) => processFilesMovary(f)} + allowSelectMultipleFiles + /> + + <DropFileButton + icon="myanimelist" + text="MyAnimeList Export" + filesSelected={(f) => processFilesMyAnimeList(f)} + /> + + <DropFileButton + icon="ryot" + text="Ryot Exports" + filesSelected={(f) => processRyotFile(f)} + /> + + <DropFileButton + icon="todomovies" + text="TodoMovies" + filesSelected={(f) => processTodoMoviesFile(f)} + /> + {/if} + </div> + </div> </div> <style lang="scss"> - .content { - display: flex; - width: 100%; - justify-content: center; - padding: 0 30px 30px 30px; - - .inner { - display: flex; - flex-flow: column; - min-width: 400px; - max-width: 400px; - overflow: hidden; - - @media screen and (max-width: 420px) { - min-width: 100%; - } - } - - .big-btns { - display: flex; - justify-content: center; - flex-flow: row; - flex-wrap: wrap; - gap: 20px; - margin-top: 20px; - - & > :global(div), - & > :global(button) { - flex-basis: 40%; - flex-grow: 1; - } - } - - .header { - display: flex; - gap: 10px; - - h5 { - margin-top: 3px; - } - } - - /* Same style as DropFileButton for the buttons that don't need file support */ - button { - display: flex; - flex-flow: column; - justify-content: center; - align-items: center; - gap: 10px; - height: 180px; - padding: 20px; - background-color: $accent-color; - border: unset; - border-radius: 10px; - user-select: none; - transition: 180ms ease-in-out; - color: $text-color; - fill: $text-color; - - &:hover, - &.dragging-over { - fill: $bg-color; - color: $bg-color; - background-color: $accent-color-hover; - } - } - } + .content { + display: flex; + width: 100%; + justify-content: center; + padding: 0 30px 30px 30px; + + .inner { + display: flex; + flex-flow: column; + min-width: 400px; + max-width: 400px; + overflow: hidden; + + @media screen and (max-width: 420px) { + min-width: 100%; + } + } + + .big-btns { + display: flex; + justify-content: center; + flex-flow: row; + flex-wrap: wrap; + gap: 20px; + margin-top: 20px; + + & > :global(div), + & > :global(button) { + flex-basis: 40%; + flex-grow: 1; + } + } + + .header { + display: flex; + gap: 10px; + + h5 { + margin-top: 3px; + } + } + + /* Same style as DropFileButton for the buttons that don't need file support */ + button { + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + gap: 10px; + height: 180px; + padding: 20px; + background-color: $accent-color; + border: unset; + border-radius: 10px; + user-select: none; + transition: 180ms ease-in-out; + color: $text-color; + fill: $text-color; + + &:hover, + &.dragging-over { + fill: $bg-color; + color: $bg-color; + background-color: $accent-color-hover; + } + } + } </style> diff --git a/src/routes/(app)/import/process/+page.svelte b/src/routes/(app)/import/process/+page.svelte index f31b4c74..a2617c53 100644 --- a/src/routes/(app)/import/process/+page.svelte +++ b/src/routes/(app)/import/process/+page.svelte @@ -5,764 +5,815 @@ --> <script lang="ts"> - import { goto } from "$app/navigation"; - import DropDown from "@/lib/DropDown.svelte"; - import Error from "@/lib/Error.svelte"; - import Icon from "@/lib/Icon.svelte"; - import Modal from "@/lib/Modal.svelte"; - import Poster from "@/lib/poster/Poster.svelte"; - import PosterList from "@/lib/poster/PosterList.svelte"; - import Spinner from "@/lib/Spinner.svelte"; - import SpinnerTiny from "@/lib/SpinnerTiny.svelte"; - import { sleep } from "@/lib/util/helpers"; - import { notify } from "@/lib/util/notify"; - import { importedList, parsedImportedList, watchedList } from "@/store"; - import { - ImportResponseType, - type ImportResponse, - type ContentSearchTv, - type ContentSearchMovie, - type ImportedList, - type WatchedStatus - } from "@/types"; - import axios from "axios"; - import { onDestroy } from "svelte"; - import { get } from "svelte/store"; - import papa from "papaparse"; - import Status from "@/lib/Status.svelte"; + import { goto } from "$app/navigation"; + import DropDown from "@/lib/DropDown.svelte"; + import Error from "@/lib/Error.svelte"; + import Icon from "@/lib/Icon.svelte"; + import Modal from "@/lib/Modal.svelte"; + import Poster from "@/lib/poster/Poster.svelte"; + import PosterList from "@/lib/poster/PosterList.svelte"; + import Spinner from "@/lib/Spinner.svelte"; + import SpinnerTiny from "@/lib/SpinnerTiny.svelte"; + import { sleep } from "@/lib/util/helpers"; + import { notify } from "@/lib/util/notify"; + import { store } from "@/store.svelte"; + import { + ImportResponseType, + type ImportResponse, + type ContentSearchTv, + type ContentSearchMovie, + type ImportedList, + type WatchedStatus, + } from "@/types"; + import axios from "axios"; + import { onDestroy } from "svelte"; + import { get } from "svelte/store"; + import papa from "papaparse"; + import Status from "@/lib/Status.svelte"; - const wList = get(watchedList); + interface ImportedListItemMultiProblem { + original: ImportedList; + results: (ContentSearchMovie | ContentSearchTv)[]; + callback: (err: Error | string | undefined) => void; + } - interface ImportedListItemMultiProblem { - original: ImportedList; - results: (ContentSearchMovie | ContentSearchTv)[]; - callback: (err: Error | string | undefined) => void; - } + let rList: ImportedList[] = []; + let isImporting = false; + let cancelled = false; + let importText = ""; - let rList: ImportedList[] = []; - let isImporting = false; - let cancelled = false; - let importText = ""; + onDestroy(() => { + cancelled = true; + }); - onDestroy(() => { - cancelled = true; - }); + // Set when current item being imported gets an IMPORT_MULTI + // response, which then shows the modal for user to pick correct item. + let importMultiItem: ImportedListItemMultiProblem | undefined; + // Set when user clicks 'Change Statuses' button for the change all + // statuses modal. + let changeAllStatusesModalCb: + | ((newStatus?: WatchedStatus) => void) + | undefined; - // Set when current item being imported gets an IMPORT_MULTI - // response, which then shows the modal for user to pick correct item. - let importMultiItem: ImportedListItemMultiProblem | undefined; - // Set when user clicks 'Change Statuses' button for the change all - // statuses modal. - let changeAllStatusesModalCb: ((newStatus?: WatchedStatus) => void) | undefined; + async function getList() { + const list = store.importedList; + if (!list) { + console.log("import/process, no list, returning to /import"); + goto("/import"); + return; + } + console.log("getList", list); + if (list?.type === "text-list") { + importText = "Text List"; + // Regex to match a year in between brackets, + // which we assume is the release year of content. + const yearRegex = new RegExp(/\([0-9]{4}\)/); + const s = list.data.split("\n"); + for (let i = 0; i < s.length; i++) { + const el = s[i]?.trim(); + if (el) { + const l: ImportedList = { name: el }; + const year = el.match(yearRegex); + if (year && year.length > 0) { + l.year = year[0].replaceAll(/\(|\)/g, ""); + l.name = l.name.replace(yearRegex, "").trim(); + } + rList.push(l); + } + } + } else if (list?.type === "tmdb") { + importText = "TMDB"; + const s = papa.parse(list.data.trim(), { header: true }); + console.debug("parsed csv", s); + for (let i = 0; i < s.data.length; i++) { + try { + const el = s.data[i] as any; + if (el) { + // Skip if no name or tmdb id + if (!el.Name && !el["TMDb ID"]) { + console.warn("Skipping item with no name or tmdb id", el); + return; + } + const l: ImportedList = { name: el.Name }; + const year = el["Release Date"] + ? new Date(el["Release Date"]) + : undefined; + if (year) { + l.year = String(year.getFullYear()); + } + if (el.Type === "movie" || el.Type === "tv") { + l.type = el.Type; + } + if (el["TMDb ID"]) { + l.tmdbId = Number(el["TMDb ID"]); + } + if (el["Your Rating"]) { + l.rating = Math.floor(Number(el["Your Rating"])); + } + if (el["Date Rated"]) { + l.ratingCustomDate = new Date(el["Date Rated"]); + } + rList.push(l); + } + } catch (err) { + console.error("Failed to process an item!", err); + notify({ + type: "error", + text: "Failed to process an item!", + }); + } + } + } else if (list?.type === "imdb") { + // There are different types of imdb exports (ratings & watchlist/list), + // there are common keys between these types that we use below so should + // be okay with importing either. + importText = "IMDb"; + const s = papa.parse<any>(list.data.trim(), { header: true }); + console.debug("parsed csv", s); + let anySkipped = false; + // Sort so that episodes comes last, so they are imported last. + s.data?.sort((a, b) => { + const aType = a["Title Type"]?.toLowerCase(); + if (aType === "tv episode") { + return 1; + } + const bType = b["Title Type"]?.toLowerCase(); + if (bType === "tv episode") { + return -1; + } + return 0; + }); + for (let i = 0; i < s.data.length; i++) { + try { + const el = s.data[i] as any; + if (el) { + const imdbId = el["Const"]; + const type = el["Title Type"]?.toLowerCase(); + // Skip if no name or tmdb id + if (!el.Title && !imdbId) { + console.warn("Skipping item with no title or imdb id", el); + anySkipped = true; + continue; + } + if (!type) { + console.warn("Skipping item with no type", el); + anySkipped = true; + continue; + } + const l: ImportedList = { name: el.Title }; + const year = el["Release Date"] + ? new Date(el["Release Date"]) + : undefined; + if (year) { + l.year = String(year.getFullYear()); + } + if (type === "movie") { + l.type = "movie"; + } else if (type === "tv series") { + l.type = "tv"; + } else if (type === "tv episode") { + l.type = "tv_episode"; + } else { + console.warn("Skipping item with invalid type", `(${type})`, el); + anySkipped = true; + continue; + } + if (imdbId) { + l.imdbId = imdbId; + } + if (el["Your Rating"]) { + l.rating = Math.floor(Number(el["Your Rating"])); + } + if (el["Date Rated"]) { + l.ratingCustomDate = new Date(el["Date Rated"]); + } + rList.push(l); + } + } catch (err) { + console.error("Failed to process an item!", err); + notify({ + type: "error", + text: "Failed to process an item!", + }); + } + } + notify({ + text: "Any tv episodes will be added to the bottom of the table, don't change the Type on these!", + time: 20000, + }); + if (anySkipped) { + notify({ + type: "error", + text: "Some items with invalid data may have been skipped (check source data for missing ids/titles or look in console for more details).", + }); + } + } else if (list?.type === "movary") { + importText = "Movary"; + try { + const s = JSON.parse(list.data); + // Builds imported list in previous step for ease. + rList = s; + } catch (err) { + console.error("Movary import processing failed!", err); + notify({ + type: "error", + text: "Processing failed!. Please report this issue if it persists.", + }); + } + } else if (list?.type === "watcharr") { + importText = "Watcharr"; + try { + const s = JSON.parse(list.data); + // Builds imported list in previous step for ease. + rList = s; + } catch (err) { + console.error("Watcharr import processing failed!", err); + notify({ + type: "error", + text: "Processing failed!. Please report this issue if it persists.", + }); + } + } else if (list?.type === "myanimelist") { + importText = "MyAnimeList"; + try { + const parser = new DOMParser(); + const doc = parser.parseFromString(list.data.trim(), "application/xml"); + const errorNode = doc.querySelector("parsererror"); + if (errorNode) { + console.error("MyAnimeList parse error:", errorNode); + notify({ + type: "error", + text: "An error occurred while parsing your MyAnimeList export!", + }); + return; + } + console.log(doc.documentElement.querySelectorAll("anime")); + const animeNodes = doc.documentElement.querySelectorAll("anime"); + if (animeNodes?.length <= 0) { + console.error("MyAnimeList: Found no anime nodes:", animeNodes); + notify({ + type: "error", + text: "We found no Anime entries in your export file!", + }); + return; + } + for (let i = 0; i < animeNodes.length; i++) { + const animeNode = animeNodes[i]; + const titleNode = animeNode.querySelector("series_title"); + console.debug("Processing anime:", titleNode?.textContent); + if (!titleNode?.textContent) { + console.error("No title found for an anime!", animeNode, titleNode); + notify({ + type: "error", + text: "An anime failed to import, a title was not found! Check console for more details.", + }); + continue; + } + const l: ImportedList = { name: titleNode.textContent }; + const scoreNode = animeNode.querySelector("my_score"); + if (scoreNode?.textContent) { + l.rating = Number(scoreNode.textContent); + } + const statusNode = animeNode.querySelector("my_status"); + if (statusNode?.textContent) { + let malStatus = statusNode.textContent?.toLowerCase(); + if (malStatus === "on-hold") { + l.status = "HOLD"; + } else if (malStatus === "dropped") { + l.status = "DROPPED"; + } else if (malStatus === "plan to watch") { + l.status = "PLANNED"; + } else if (malStatus === "watching") { + l.status = "WATCHING"; + } else if (malStatus === "completed") { + l.status = "FINISHED"; + } else { + console.warn( + "Anime has no status or an unrecognized status:", + malStatus, + "anime_title:", + titleNode.textContent, + ); + } + } + const typeNode = animeNode.querySelector("series_type"); + if (typeNode?.textContent) { + const malSeriesType = typeNode.textContent?.toLowerCase(); + if (malSeriesType === "tv" || malSeriesType === "movie") { + l.type = malSeriesType; + } else { + console.warn( + "Anime has no type or an unrecognized type:", + malSeriesType, + "anime_title:", + titleNode.textContent, + ); + } + } + try { + const startDateNode = animeNode.querySelector("my_start_date"); + const finishDateNode = animeNode.querySelector("my_finish_date"); + if (startDateNode?.textContent) { + // For start date, we can simply add the activity manually. + l.activity = [ + // We don't need all the data when importing activity. + // customDate must be a date object. + { + type: "STATUS_CHANGED", + data: "WATCHING", + customDate: new Date(startDateNode.textContent), + }, + ] as any[]; + } + if (finishDateNode?.textContent) { + l.datesWatched = [new Date(finishDateNode.textContent)]; + } + } catch (err) { + console.error( + "Processing start/finish times for anime failed!", + err, + ); + notify({ + type: "error", + text: "Failed to process start/finish times for an anime! Check console for more details.", + }); + } + rList.push(l); + } + } catch (err) { + console.error("MyAnimeList import failed!", err); + notify({ + type: "error", + text: "Failed to process import data!", + }); + } + } else if (list?.type === "ryot") { + importText = "Ryot"; + try { + const s = JSON.parse(list.data); + // Builds imported list in previous step for ease. + rList = s; + } catch (err) { + console.error("Ryot import processing failed!", err); + notify({ + type: "error", + text: "Processing failed!. Please report this issue if it persists.", + }); + } + } else if (list?.type === "todomovies") { + importText = "TodoMovies"; + try { + const s = JSON.parse(list.data); + // Builds imported list in previous step for ease. + rList = s; + } catch (err) { + console.error("TodoMovies import processing failed!", err); + notify({ + type: "error", + text: "Processing failed!. Please report this issue if it persists.", + }); + } + } + // TODO: remove duplicate names in list + return list; + } - async function getList() { - const list = get(importedList); - if (!list) { - console.log("import/process, no list, returning to /import"); - goto("/import"); - return; - } - console.log("getList", list); - if (list?.type === "text-list") { - importText = "Text List"; - // Regex to match a year in between brackets, - // which we assume is the release year of content. - const yearRegex = new RegExp(/\([0-9]{4}\)/); - const s = list.data.split("\n"); - for (let i = 0; i < s.length; i++) { - const el = s[i]?.trim(); - if (el) { - const l: ImportedList = { name: el }; - const year = el.match(yearRegex); - if (year && year.length > 0) { - l.year = year[0].replaceAll(/\(|\)/g, ""); - l.name = l.name.replace(yearRegex, "").trim(); - } - rList.push(l); - } - } - } else if (list?.type === "tmdb") { - importText = "TMDB"; - const s = papa.parse(list.data.trim(), { header: true }); - console.debug("parsed csv", s); - for (let i = 0; i < s.data.length; i++) { - try { - const el = s.data[i] as any; - if (el) { - // Skip if no name or tmdb id - if (!el.Name && !el["TMDb ID"]) { - console.warn("Skipping item with no name or tmdb id", el); - return; - } - const l: ImportedList = { name: el.Name }; - const year = el["Release Date"] ? new Date(el["Release Date"]) : undefined; - if (year) { - l.year = String(year.getFullYear()); - } - if (el.Type === "movie" || el.Type === "tv") { - l.type = el.Type; - } - if (el["TMDb ID"]) { - l.tmdbId = Number(el["TMDb ID"]); - } - if (el["Your Rating"]) { - l.rating = Math.floor(Number(el["Your Rating"])); - } - if (el["Date Rated"]) { - l.ratingCustomDate = new Date(el["Date Rated"]); - } - rList.push(l); - } - } catch (err) { - console.error("Failed to process an item!", err); - notify({ - type: "error", - text: "Failed to process an item!" - }); - } - } - } else if (list?.type === "imdb") { - // There are different types of imdb exports (ratings & watchlist/list), - // there are common keys between these types that we use below so should - // be okay with importing either. - importText = "IMDb"; - const s = papa.parse<any>(list.data.trim(), { header: true }); - console.debug("parsed csv", s); - let anySkipped = false; - // Sort so that episodes comes last, so they are imported last. - s.data?.sort((a, b) => { - const aType = a["Title Type"]?.toLowerCase(); - if (aType === "tv episode") { - return 1; - } - const bType = b["Title Type"]?.toLowerCase(); - if (bType === "tv episode") { - return -1; - } - return 0; - }); - for (let i = 0; i < s.data.length; i++) { - try { - const el = s.data[i] as any; - if (el) { - const imdbId = el["Const"]; - const type = el["Title Type"]?.toLowerCase(); - // Skip if no name or tmdb id - if (!el.Title && !imdbId) { - console.warn("Skipping item with no title or imdb id", el); - anySkipped = true; - continue; - } - if (!type) { - console.warn("Skipping item with no type", el); - anySkipped = true; - continue; - } - const l: ImportedList = { name: el.Title }; - const year = el["Release Date"] ? new Date(el["Release Date"]) : undefined; - if (year) { - l.year = String(year.getFullYear()); - } - if (type === "movie") { - l.type = "movie"; - } else if (type === "tv series") { - l.type = "tv"; - } else if (type === "tv episode") { - l.type = "tv_episode"; - } else { - console.warn("Skipping item with invalid type", `(${type})`, el); - anySkipped = true; - continue; - } - if (imdbId) { - l.imdbId = imdbId; - } - if (el["Your Rating"]) { - l.rating = Math.floor(Number(el["Your Rating"])); - } - if (el["Date Rated"]) { - l.ratingCustomDate = new Date(el["Date Rated"]); - } - rList.push(l); - } - } catch (err) { - console.error("Failed to process an item!", err); - notify({ - type: "error", - text: "Failed to process an item!" - }); - } - } - notify({ - text: "Any tv episodes will be added to the bottom of the table, don't change the Type on these!", - time: 20000 - }); - if (anySkipped) { - notify({ - type: "error", - text: "Some items with invalid data may have been skipped (check source data for missing ids/titles or look in console for more details)." - }); - } - } else if (list?.type === "movary") { - importText = "Movary"; - try { - const s = JSON.parse(list.data); - // Builds imported list in previous step for ease. - rList = s; - } catch (err) { - console.error("Movary import processing failed!", err); - notify({ - type: "error", - text: "Processing failed!. Please report this issue if it persists." - }); - } - } else if (list?.type === "watcharr") { - importText = "Watcharr"; - try { - const s = JSON.parse(list.data); - // Builds imported list in previous step for ease. - rList = s; - } catch (err) { - console.error("Watcharr import processing failed!", err); - notify({ - type: "error", - text: "Processing failed!. Please report this issue if it persists." - }); - } - } else if (list?.type === "myanimelist") { - importText = "MyAnimeList"; - try { - const parser = new DOMParser(); - const doc = parser.parseFromString(list.data.trim(), "application/xml"); - const errorNode = doc.querySelector("parsererror"); - if (errorNode) { - console.error("MyAnimeList parse error:", errorNode); - notify({ - type: "error", - text: "An error occurred while parsing your MyAnimeList export!" - }); - return; - } - console.log(doc.documentElement.querySelectorAll("anime")); - const animeNodes = doc.documentElement.querySelectorAll("anime"); - if (animeNodes?.length <= 0) { - console.error("MyAnimeList: Found no anime nodes:", animeNodes); - notify({ - type: "error", - text: "We found no Anime entries in your export file!" - }); - return; - } - for (let i = 0; i < animeNodes.length; i++) { - const animeNode = animeNodes[i]; - const titleNode = animeNode.querySelector("series_title"); - console.debug("Processing anime:", titleNode?.textContent); - if (!titleNode?.textContent) { - console.error("No title found for an anime!", animeNode, titleNode); - notify({ - type: "error", - text: "An anime failed to import, a title was not found! Check console for more details." - }); - continue; - } - const l: ImportedList = { name: titleNode.textContent }; - const scoreNode = animeNode.querySelector("my_score"); - if (scoreNode?.textContent) { - l.rating = Number(scoreNode.textContent); - } - const statusNode = animeNode.querySelector("my_status"); - if (statusNode?.textContent) { - let malStatus = statusNode.textContent?.toLowerCase(); - if (malStatus === "on-hold") { - l.status = "HOLD"; - } else if (malStatus === "dropped") { - l.status = "DROPPED"; - } else if (malStatus === "plan to watch") { - l.status = "PLANNED"; - } else if (malStatus === "watching") { - l.status = "WATCHING"; - } else if (malStatus === "completed") { - l.status = "FINISHED"; - } else { - console.warn( - "Anime has no status or an unrecognized status:", - malStatus, - "anime_title:", - titleNode.textContent - ); - } - } - const typeNode = animeNode.querySelector("series_type"); - if (typeNode?.textContent) { - const malSeriesType = typeNode.textContent?.toLowerCase(); - if (malSeriesType === "tv" || malSeriesType === "movie") { - l.type = malSeriesType; - } else { - console.warn( - "Anime has no type or an unrecognized type:", - malSeriesType, - "anime_title:", - titleNode.textContent - ); - } - } - try { - const startDateNode = animeNode.querySelector("my_start_date"); - const finishDateNode = animeNode.querySelector("my_finish_date"); - if (startDateNode?.textContent) { - // For start date, we can simply add the activity manually. - l.activity = [ - // We don't need all the data when importing activity. - // customDate must be a date object. - { - type: "STATUS_CHANGED", - data: "WATCHING", - customDate: new Date(startDateNode.textContent) - } - ] as any[]; - } - if (finishDateNode?.textContent) { - l.datesWatched = [new Date(finishDateNode.textContent)]; - } - } catch (err) { - console.error("Processing start/finish times for anime failed!", err); - notify({ - type: "error", - text: "Failed to process start/finish times for an anime! Check console for more details." - }); - } - rList.push(l); - } - } catch (err) { - console.error("MyAnimeList import failed!", err); - notify({ - type: "error", - text: "Failed to process import data!" - }); - } - } else if (list?.type === "ryot") { - importText = "Ryot"; - try { - const s = JSON.parse(list.data); - // Builds imported list in previous step for ease. - rList = s; - } catch (err) { - console.error("Ryot import processing failed!", err); - notify({ - type: "error", - text: "Processing failed!. Please report this issue if it persists." - }); - } - } else if (list?.type === "todomovies") { - importText = "TodoMovies"; - try { - const s = JSON.parse(list.data); - // Builds imported list in previous step for ease. - rList = s; - } catch (err) { - console.error("TodoMovies import processing failed!", err); - notify({ - type: "error", - text: "Processing failed!. Please report this issue if it persists." - }); - } - } - // TODO: remove duplicate names in list - return list; - } + function addRow( + ev: FocusEvent & { currentTarget: EventTarget & HTMLInputElement }, + ) { + if (!ev.currentTarget.value) { + return; + } + const lo = { name: ev.currentTarget.value } as ImportedList; + const yearEl = document.getElementById("addYear") as HTMLInputElement; + if (yearEl?.value) { + lo.year = yearEl.value; + } + rList.push(lo); + rList = rList; + ev.currentTarget.value = ""; + yearEl.value = ""; + } - function addRow(ev: FocusEvent & { currentTarget: EventTarget & HTMLInputElement }) { - if (!ev.currentTarget.value) { - return; - } - const lo = { name: ev.currentTarget.value } as ImportedList; - const yearEl = document.getElementById("addYear") as HTMLInputElement; - if (yearEl?.value) { - lo.year = yearEl.value; - } - rList.push(lo); - rList = rList; - ev.currentTarget.value = ""; - yearEl.value = ""; - } + function removeRow(l: ImportedList) { + rList = rList.filter((r) => r.name !== l.name); + rList = rList; + } - function removeRow(l: ImportedList) { - rList = rList.filter((r) => r.name !== l.name); - rList = rList; - } + async function startImport() { + console.log(rList); + isImporting = true; + window.scrollTo(0, 0); + for (let i = 0; i < rList.length; i++) { + if (cancelled) { + notify({ type: "error", text: "Importing Cancelled" }); + return; + } + const li = rList[i]; + try { + console.log("Importing", li); + await doImport(li); + } catch (err) { + console.error("Failed to import item:", li, "reason:", err); + notify({ + type: "error", + text: "Failed to import an item! Check console for more info.", + time: Infinity, + }); + } + await sleep(1500); + } + store.importedList = undefined; + if ( + rList.some( + (i) => + i.state == ImportResponseType.IMPORT_FAILED || + i.state == ImportResponseType.IMPORT_NOTFOUND, + ) + ) { + // Some items failed.. go to some-failed + store.parsedImportedList = rList; + goto("/import/some-failed"); + } else { + notify({ + type: "success", + text: "All content successfully imported! Try refreshing if you are missing data.", + time: 15000, + }); + goto("/"); + } + } - async function startImport() { - console.log(rList); - isImporting = true; - window.scrollTo(0, 0); - for (let i = 0; i < rList.length; i++) { - if (cancelled) { - notify({ type: "error", text: "Importing Cancelled" }); - return; - } - const li = rList[i]; - try { - console.log("Importing", li); - await doImport(li); - } catch (err) { - console.error("Failed to import item:", li, "reason:", err); - notify({ - type: "error", - text: "Failed to import an item! Check console for more info.", - time: Infinity - }); - } - await sleep(1500); - } - importedList.set(undefined); - if ( - rList.some( - (i) => - i.state == ImportResponseType.IMPORT_FAILED || - i.state == ImportResponseType.IMPORT_NOTFOUND - ) - ) { - // Some items failed.. go to some-failed - parsedImportedList.set(rList); - goto("/import/some-failed"); - } else { - notify({ - type: "success", - text: "All content successfully imported! Try refreshing if you are missing data.", - time: 15000 - }); - goto("/"); - } - } + async function doImport(item: ImportedList) { + if (!item.name?.trim()) { + item.state = ImportResponseType.IMPORT_NOTFOUND; + rList = rList; + return; + } + const resp = await axios.post<ImportResponse>("/import", item); + return new Promise((res, rej) => { + if (resp.data.type === ImportResponseType.IMPORT_MULTI) { + console.log("Import found multiple responses for content", resp.data); + let results = resp.data.results; + if (item.year) { + results = results.sort((a, b) => { + try { + const ar = + a.media_type === "movie" ? a.release_date : a.first_air_date; + const ay = ar + ? new Date(Date.parse(ar)).getFullYear() + : undefined; + const br = + b.media_type === "movie" ? b.release_date : b.first_air_date; + const by = br + ? new Date(Date.parse(br)).getFullYear() + : undefined; + if (ay == item.year) return -1; + else if (by == item.year) return 1; + } catch (err) { + console.error("doImport: results sort failed", err); + } + return 0; + }); + } + importMultiItem = { + original: item, + results: resp.data.results, + callback: (err) => { + if (err) { + item.state = ImportResponseType.IMPORT_NOTFOUND; + rList = rList; + rej(err); + } else { + res(0); + } + }, + }; + } else if (resp.data.type === ImportResponseType.IMPORT_SUCCESS) { + item.state = ImportResponseType.IMPORT_SUCCESS; + const w = resp.data.watchedEntry; + if (w) { + const release = + w.content?.type === "movie" + ? w.content?.release_date + : w.content?.first_air_date; + if (release) + item.year = String(new Date(Date.parse(release)).getFullYear()); + item.type = w.content?.type; + store.watchedList.push(w); + // watchedList.update(() => wList); + } + rList = rList; + res(0); + } else { + item.state = resp.data.type; + rList = rList; + res(0); + } + }); + } - async function doImport(item: ImportedList) { - if (!item.name?.trim()) { - item.state = ImportResponseType.IMPORT_NOTFOUND; - rList = rList; - return; - } - const resp = await axios.post<ImportResponse>("/import", item); - return new Promise((res, rej) => { - if (resp.data.type === ImportResponseType.IMPORT_MULTI) { - console.log("Import found multiple responses for content", resp.data); - let results = resp.data.results; - if (item.year) { - results = results.sort((a, b) => { - try { - const ar = a.media_type === "movie" ? a.release_date : a.first_air_date; - const ay = ar ? new Date(Date.parse(ar)).getFullYear() : undefined; - const br = b.media_type === "movie" ? b.release_date : b.first_air_date; - const by = br ? new Date(Date.parse(br)).getFullYear() : undefined; - if (ay == item.year) return -1; - else if (by == item.year) return 1; - } catch (err) { - console.error("doImport: results sort failed", err); - } - return 0; - }); - } - importMultiItem = { - original: item, - results: resp.data.results, - callback: (err) => { - if (err) { - item.state = ImportResponseType.IMPORT_NOTFOUND; - rList = rList; - rej(err); - } else { - res(0); - } - } - }; - } else if (resp.data.type === ImportResponseType.IMPORT_SUCCESS) { - item.state = ImportResponseType.IMPORT_SUCCESS; - const w = resp.data.watchedEntry; - if (w) { - const release = - w.content?.type === "movie" ? w.content?.release_date : w.content?.first_air_date; - if (release) item.year = String(new Date(Date.parse(release)).getFullYear()); - item.type = w.content?.type; - wList.push(w); - watchedList.update(() => wList); - } - rList = rList; - res(0); - } else { - item.state = resp.data.type; - rList = rList; - res(0); - } - }); - } - - /** - * Helper to allow user to quickly update - * all statuses to a new one. - */ - function changeAllStatuses() { - changeAllStatusesModalCb = (newStatus) => { - try { - console.debug("changeAllStatusesModalCb: newStatus:", newStatus); - if (!newStatus) { - // User cancelled flow - changeAllStatusesModalCb = undefined; - return; - } - if (!rList) { - console.error("changeAllStatusesModalCb: No list to modify!"); - changeAllStatusesModalCb = undefined; - return; - } - for (let i = 0; i < rList.length; i++) { - const r = rList[i]; - r.status = newStatus; - } - rList = rList; - } catch (err) { - console.error("changeAllStatusesModalCb: Failed!", err); - notify({ - type: "error", - text: "Failed when updating all statuses. Please try again!" - }); - } - changeAllStatusesModalCb = undefined; - }; - } + /** + * Helper to allow user to quickly update + * all statuses to a new one. + */ + function changeAllStatuses() { + changeAllStatusesModalCb = (newStatus) => { + try { + console.debug("changeAllStatusesModalCb: newStatus:", newStatus); + if (!newStatus) { + // User cancelled flow + changeAllStatusesModalCb = undefined; + return; + } + if (!rList) { + console.error("changeAllStatusesModalCb: No list to modify!"); + changeAllStatusesModalCb = undefined; + return; + } + for (let i = 0; i < rList.length; i++) { + const r = rList[i]; + r.status = newStatus; + } + rList = rList; + } catch (err) { + console.error("changeAllStatusesModalCb: Failed!", err); + notify({ + type: "error", + text: "Failed when updating all statuses. Please try again!", + }); + } + changeAllStatusesModalCb = undefined; + }; + } </script> {#await getList()} - <Spinner /> + <Spinner /> {:then list} - <div class="content"> - <div class="inner"> - {#if rList} - <h2>Importing {importText ? `From ${importText}` : ""}</h2> - <h5 class="norm"> - {#if !isImporting} - Review your imported list and fix any problems. - {:else} - You can fix any failed imports when the process completes. - {/if} - </h5> - <table class={isImporting ? "is-importing" : ""}> - <tr> - {#if isImporting} - <th class="loading-col"></th> - {/if} - <th>Name</th> - <th>Year</th> - <th>Type</th> - <th>Status</th> - {#if !isImporting} - <th></th> - {/if} - </tr> - {#each rList as l} - <tr> - {#if isImporting} - <td class="icon-cell"> - <div> - {#if !l.state} - <SpinnerTiny style="width: 13px;" /> - {:else if l.state === ImportResponseType.IMPORT_SUCCESS} - <Icon i="check" wh={22} /> - {:else if l.state === ImportResponseType.IMPORT_NOTFOUND} - <Icon i="close" wh={22} /> - {:else if l.state === ImportResponseType.IMPORT_FAILED} - <Icon i="close" wh={22} /> - {:else if l.state === ImportResponseType.IMPORT_EXISTS} - <Icon i="check" wh={22} /> - {/if} - </div> - </td> - {/if} - <td><input class="plain" bind:value={l.name} disabled={isImporting} /></td> - <td class="year"> - <input - class="plain" - bind:value={l.year} - placeholder="YYYY" - type="number" - disabled={isImporting} - /> - </td> - <td class="type"> - <DropDown - options={["movie", "tv"]} - bind:active={l.type} - placeholder="Type" - blendIn={true} - disabled={isImporting} - /> - </td> - <td class="type"> - <DropDown - options={["FINISHED", "PLANNED", "WATCHING", "HOLD", "DROPPED"]} - bind:active={l.status} - placeholder="Status" - blendIn={true} - disabled={isImporting} - /> - </td> - {#if !isImporting} - <td> - <button - class="plain delete" - on:click={() => { - removeRow(l); - }} - > - <Icon i="close" wh="25" /> - </button> - </td> - {/if} - </tr> - {/each} - {#if !isImporting} - <tr> - <td><input class="plain" placeholder="Name" on:blur={addRow} /></td> - <td class="year"> - <input class="plain" id="addYear" placeholder="YYYY" type="number" /> - </td> - <td class="type"></td> - <td class="status"></td> - <td></td> - </tr> - {/if} - </table> - <div class="btns"> - <button on:click={() => goto("/import")}><Icon i="arrow" />Back</button> - <button on:click={() => changeAllStatuses()} disabled={isImporting}> - Change Statuses - </button> - <button on:click={startImport} disabled={isImporting}>Start Importing</button> - </div> - {#if typeof changeAllStatusesModalCb === "function"} - <Modal - title="Select a New Status" - desc="Override the status for all content in the table" - maxWidth="600px" - onClose={() => - typeof changeAllStatusesModalCb === "function" - ? changeAllStatusesModalCb() - : undefined} - > - <Status status={undefined} onChange={changeAllStatusesModalCb} /> - </Modal> - {/if} - {:else} - <h2>No list</h2> - {/if} - </div> - </div> + <div class="content"> + <div class="inner"> + {#if rList} + <h2>Importing {importText ? `From ${importText}` : ""}</h2> + <h5 class="norm"> + {#if !isImporting} + Review your imported list and fix any problems. + {:else} + You can fix any failed imports when the process completes. + {/if} + </h5> + <table class={isImporting ? "is-importing" : ""}> + <thead> + <tr> + {#if isImporting} + <th class="loading-col"></th> + {/if} + <th>Name</th> + <th>Year</th> + <th>Type</th> + <th>Status</th> + {#if !isImporting} + <th></th> + {/if} + </tr> + </thead> + <tbody> + {#each rList as l} + <tr> + {#if isImporting} + <td class="icon-cell"> + <div> + {#if !l.state} + <SpinnerTiny style="width: 13px;" /> + {:else if l.state === ImportResponseType.IMPORT_SUCCESS} + <Icon i="check" wh={22} /> + {:else if l.state === ImportResponseType.IMPORT_NOTFOUND} + <Icon i="close" wh={22} /> + {:else if l.state === ImportResponseType.IMPORT_FAILED} + <Icon i="close" wh={22} /> + {:else if l.state === ImportResponseType.IMPORT_EXISTS} + <Icon i="check" wh={22} /> + {/if} + </div> + </td> + {/if} + <td + ><input + class="plain" + bind:value={l.name} + disabled={isImporting} + /></td + > + <td class="year"> + <input + class="plain" + bind:value={l.year} + placeholder="YYYY" + type="number" + disabled={isImporting} + /> + </td> + <td class="type"> + <DropDown + options={["movie", "tv"]} + bind:active={l.type} + placeholder="Type" + blendIn={true} + disabled={isImporting} + /> + </td> + <td class="type"> + <DropDown + options={[ + "FINISHED", + "PLANNED", + "WATCHING", + "HOLD", + "DROPPED", + ]} + bind:active={l.status} + placeholder="Status" + blendIn={true} + disabled={isImporting} + /> + </td> + {#if !isImporting} + <td> + <button + class="plain delete" + on:click={() => { + removeRow(l); + }} + > + <Icon i="close" wh="25" /> + </button> + </td> + {/if} + </tr> + {/each} + {#if !isImporting} + <tr> + <td + ><input + class="plain" + placeholder="Name" + on:blur={addRow} + /></td + > + <td class="year"> + <input + class="plain" + id="addYear" + placeholder="YYYY" + type="number" + /> + </td> + <td class="type"></td> + <td class="status"></td> + <td></td> + </tr> + {/if} + </tbody> + </table> + <div class="btns"> + <button on:click={() => goto("/import")} + ><Icon i="arrow" />Back</button + > + <button on:click={() => changeAllStatuses()} disabled={isImporting}> + Change Statuses + </button> + <button on:click={startImport} disabled={isImporting} + >Start Importing</button + > + </div> + {#if typeof changeAllStatusesModalCb === "function"} + <Modal + title="Select a New Status" + desc="Override the status for all content in the table" + maxWidth="600px" + onClose={() => + typeof changeAllStatusesModalCb === "function" + ? changeAllStatusesModalCb() + : undefined} + > + <Status status={undefined} onChange={changeAllStatusesModalCb} /> + </Modal> + {/if} + {:else} + <h2>No list</h2> + {/if} + </div> + </div> - <!-- Multiple results found modal --> - {#if importMultiItem} - <Modal - title="Multiple Results Found" - desc="Select the correct item for {importMultiItem.original.name}" - onClose={() => { - importMultiItem?.callback("closed results modal"); - importMultiItem = undefined; - }} - > - <PosterList type="vertical"> - {#each importMultiItem.results as r} - <Poster - media={r} - small={true} - disableInteraction={true} - hideButtons={true} - onClick={async () => { - const item = rList.find((i) => i.name === importMultiItem?.original.name); - if (item) { - item.tmdbId = r.id; - item.type = r.media_type; - try { - await doImport(item); - importMultiItem?.callback(undefined); - } catch (err) { - importMultiItem?.callback(String(err)); - } - importMultiItem = undefined; - } else { - // TODO: show error notif and update state with error icon - } - console.log("multi: Poster clicked", r); - }} - /> - {/each} - </PosterList> - </Modal> - {/if} + <!-- Multiple results found modal --> + {#if importMultiItem} + <Modal + title="Multiple Results Found" + desc="Select the correct item for {importMultiItem.original.name}" + onClose={() => { + importMultiItem?.callback("closed results modal"); + importMultiItem = undefined; + }} + > + <PosterList type="vertical"> + {#each importMultiItem.results as r} + <Poster + media={r} + small={true} + disableInteraction={true} + hideButtons={true} + onClick={async () => { + const item = rList.find( + (i) => i.name === importMultiItem?.original.name, + ); + if (item) { + item.tmdbId = r.id; + item.type = r.media_type; + try { + await doImport(item); + importMultiItem?.callback(undefined); + } catch (err) { + importMultiItem?.callback(String(err)); + } + importMultiItem = undefined; + } else { + // TODO: show error notif and update state with error icon + } + console.log("multi: Poster clicked", r); + }} + /> + {/each} + </PosterList> + </Modal> + {/if} {:catch err} - <Error error={err} pretty="Failed to process list!" /> + <Error error={err} pretty="Failed to process list!" /> {/await} <style lang="scss"> - .content { - display: flex; - width: 100%; - justify-content: center; - padding: 0 30px 30px 30px; + .content { + display: flex; + width: 100%; + justify-content: center; + padding: 0 30px 30px 30px; - .inner { - display: flex; - flex-flow: column; - min-width: 400px; - max-width: 600px; - overflow: hidden; + .inner { + display: flex; + flex-flow: column; + min-width: 400px; + max-width: 600px; + overflow: hidden; - @media screen and (max-width: 410px) { - min-width: 100%; - } - } - } + @media screen and (max-width: 410px) { + min-width: 100%; + } + } + } - table { - td { - &.year { - width: 70px; - } + table { + td { + &.year { + width: 70px; + } - &.type { - width: 120px; - } - } - } + &.type { + width: 120px; + } + } + } - table.is-importing { - th { - padding-left: 3px; - } + table.is-importing { + th { + padding-left: 3px; + } - td { - padding-left: 3px; + td { + padding-left: 3px; - input { - padding: 7px 0; + input { + padding: 7px 0; - &:focus { - padding: 7px 5px; - padding-left: 3px; - } - } - } - } + &:focus { + padding: 7px 5px; + padding-left: 3px; + } + } + } + } - .btns { - display: flex; - flex-flow: row; - margin-top: 20px; - gap: 5px; + .btns { + display: flex; + flex-flow: row; + margin-top: 20px; + gap: 5px; - button { - width: max-content; - gap: 3px; + button { + width: max-content; + gap: 3px; - &:last-of-type { - margin-left: auto; - } - } - } + &:last-of-type { + margin-left: auto; + } + } + } </style> diff --git a/src/routes/(app)/import/some-failed/+page.svelte b/src/routes/(app)/import/some-failed/+page.svelte index 546fa203..d1102af8 100644 --- a/src/routes/(app)/import/some-failed/+page.svelte +++ b/src/routes/(app)/import/some-failed/+page.svelte @@ -11,104 +11,105 @@ --> <script lang="ts"> - import { goto } from "$app/navigation"; - import { parsedImportedList } from "@/store"; - import { ImportResponseType, type ImportedList } from "@/types"; - import { onMount } from "svelte"; - import { get } from "svelte/store"; + import { goto } from "$app/navigation"; + import { store } from "@/store.svelte"; + import { ImportResponseType, type ImportedList } from "@/types"; + import { onMount } from "svelte"; + import { get } from "svelte/store"; - let failed: ImportedList[] = []; - let successCount = 0; + let failed: ImportedList[] = $state([]); + let successCount = $state(0); - onMount(() => { - let list = get(parsedImportedList); - if (list) { - for (let i = 0; i < list.length; i++) { - const item = list[i]; - console.log(item); - if ( - item.state === ImportResponseType.IMPORT_FAILED || - item.state === ImportResponseType.IMPORT_NOTFOUND - ) { - failed.push(item); - failed = failed; - } else { - successCount++; - } - } - console.log("failedlen", failed.length); - } else { - goto("/import"); - } - }); + onMount(() => { + if (store.parsedImportedList) { + for (let i = 0; i < store.parsedImportedList.length; i++) { + const item = store.parsedImportedList[i]; + console.log(item); + if ( + item.state === ImportResponseType.IMPORT_FAILED || + item.state === ImportResponseType.IMPORT_NOTFOUND + ) { + failed.push(item); + failed = failed; + } else { + successCount++; + } + } + console.log("failedlen", failed.length); + } else { + goto("/import"); + } + }); </script> <div class="content"> - <div class="inner"> - <h2>Some Content Failed To Import</h2> - <h5 class="norm">You can search for the failed imports and manually add them.</h5> - <h4 class="norm">{successCount} succeeded and {failed.length} failed.</h4> + <div class="inner"> + <h2>Some Content Failed To Import</h2> + <h5 class="norm"> + You can search for the failed imports and manually add them. + </h5> + <h4 class="norm">{successCount} succeeded and {failed.length} failed.</h4> - {#if failed} - <ul> - {#each failed as l} - <li> - <span>{l.name}</span> - </li> - {/each} - </ul> - {:else} - No List - {/if} - </div> + {#if failed} + <ul> + {#each failed as l} + <li> + <span>{l.name}</span> + </li> + {/each} + </ul> + {:else} + No List + {/if} + </div> </div> <style lang="scss"> - .content { - display: flex; - width: 100%; - justify-content: center; - padding: 0 30px 30px 30px; + .content { + display: flex; + width: 100%; + justify-content: center; + padding: 0 30px 30px 30px; - .inner { - display: flex; - flex-flow: column; - min-width: 400px; - max-width: 600px; - overflow: hidden; + .inner { + display: flex; + flex-flow: column; + min-width: 400px; + max-width: 600px; + overflow: hidden; - @media screen and (max-width: 420px) { - min-width: 100%; - } - } - } + @media screen and (max-width: 420px) { + min-width: 100%; + } + } + } - h4 { - margin-top: 15px; - } + h4 { + margin-top: 15px; + } - ul { - display: flex; - flex-flow: column; - gap: 5px; - margin: 10px; - list-style: none; + ul { + display: flex; + flex-flow: column; + gap: 5px; + margin: 10px; + list-style: none; - li { - display: flex; - flex-flow: row; - align-items: center; - padding: 10px; - background-color: $accent-color; - border-radius: 5px; + li { + display: flex; + flex-flow: row; + align-items: center; + padding: 10px; + background-color: $accent-color; + border-radius: 5px; - a { - margin-left: auto; + a { + margin-left: auto; - button { - width: max-content; - } - } - } - } + button { + width: max-content; + } + } + } + } </style> diff --git a/src/routes/(app)/import/trakt/+page.svelte b/src/routes/(app)/import/trakt/+page.svelte index 4d66f5fb..d8306a8f 100644 --- a/src/routes/(app)/import/trakt/+page.svelte +++ b/src/routes/(app)/import/trakt/+page.svelte @@ -4,103 +4,104 @@ --> <script lang="ts"> - import JobWatcherModal from "@/lib/JobWatcherModal.svelte"; - import { notify } from "@/lib/util/notify"; - import { userInfo } from "@/store"; - import type { JobCreatedResponse } from "@/types"; - import axios from "axios"; + import JobWatcherModal from "@/lib/JobWatcherModal.svelte"; + import { notify } from "@/lib/util/notify"; + import { store } from "@/store.svelte"; + import type { JobCreatedResponse } from "@/types"; + import axios from "axios"; - $: user = $userInfo; + let modalOpen = $state(false); + let traktUsername = $state(""); - let modalOpen = false; - let traktUsername = ""; - - async function startJob(): Promise<{ jobId: string } | undefined> { - const r = await axios.post<JobCreatedResponse>("/import/trakt", { username: traktUsername }); - console.log("startSync: Response:", r.data); - if (!r.data.jobId) { - notify({ - type: "error", - text: "No job id was returned! Cannot watch job, if it even started." - }); - return; - } - return { jobId: r.data.jobId }; - } + async function startJob(): Promise<{ jobId: string } | undefined> { + const r = await axios.post<JobCreatedResponse>("/import/trakt", { + username: traktUsername, + }); + console.log("startSync: Response:", r.data); + if (!r.data.jobId) { + notify({ + type: "error", + text: "No job id was returned! Cannot watch job, if it even started.", + }); + return; + } + return { jobId: r.data.jobId }; + } </script> <div class="content"> - <div class="inner"> - <h2>Trakt Import</h2> - <h5 class="norm"> - Provide the username to your <b>public</b> Trakt profile to start the import job. - </h5> + <div class="inner"> + <h2>Trakt Import</h2> + <h5 class="norm"> + Provide the username to your <b>public</b> Trakt profile to start the import + job. + </h5> - <input - type="text" - placeholder={user?.username ?? "Trakt Username"} - bind:value={traktUsername} - /> - <button on:click={() => (modalOpen = true)}>Start Import</button> - </div> + <input + type="text" + placeholder={store.userInfo?.username ?? "Trakt Username"} + bind:value={traktUsername} + /> + <button onclick={() => (modalOpen = true)}>Start Import</button> + </div> - {#if modalOpen} - <JobWatcherModal - modalTitle="Trakt Import" - messages={{ starting: "Trakt import job is starting" }} - getJobId={startJob} - onClose={() => (modalOpen = false)} - /> - {/if} + {#if modalOpen} + <JobWatcherModal + modalTitle="Trakt Import" + messages={{ starting: "Trakt import job is starting" }} + getJobId={startJob} + onClose={() => (modalOpen = false)} + /> + {/if} </div> <style lang="scss"> - .content { - display: flex; - width: 100%; - justify-content: center; - padding: 0 30px 30px 30px; + .content { + display: flex; + width: 100%; + justify-content: center; + padding: 0 30px 30px 30px; - .inner { - display: flex; - flex-flow: column; - min-width: 400px; - max-width: 400px; - overflow: hidden; + .inner { + display: flex; + flex-flow: column; + min-width: 400px; + max-width: 400px; + overflow: hidden; - @media screen and (max-width: 420px) { - min-width: 100%; - } - } - } + @media screen and (max-width: 420px) { + min-width: 100%; + } + } + } - input, - button { - margin-top: 15px; - } + input, + button { + margin-top: 15px; + } - ul { - display: flex; - flex-flow: column; - gap: 5px; - margin: 10px; - list-style: none; + ul { + display: flex; + flex-flow: column; + gap: 5px; + margin: 10px; + list-style: none; - li { - display: flex; - flex-flow: row; - align-items: center; - padding: 10px; - background-color: $accent-color; - border-radius: 5px; + li { + display: flex; + flex-flow: row; + align-items: center; + padding: 10px; + background-color: $accent-color; + border-radius: 5px; - a { - margin-left: auto; + a { + margin-left: auto; - button { - width: max-content; - } - } - } - } + button { + width: max-content; + } + } + } + } </style> diff --git a/src/routes/(app)/lists/[id]/[username]/+page.svelte b/src/routes/(app)/lists/[id]/[username]/+page.svelte index 49fb14e4..53282218 100644 --- a/src/routes/(app)/lists/[id]/[username]/+page.svelte +++ b/src/routes/(app)/lists/[id]/[username]/+page.svelte @@ -1,154 +1,163 @@ <script lang="ts"> - import Icon from "@/lib/Icon.svelte"; - import PageError from "@/lib/PageError.svelte"; - import Spinner from "@/lib/Spinner.svelte"; - import WatchedList from "@/lib/WatchedList.svelte"; - import tooltip from "@/lib/actions/tooltip.js"; - import UserAvatar from "@/lib/img/UserAvatar.svelte"; - import { followUser, unfollowUser } from "@/lib/util/api.js"; - import { notify } from "@/lib/util/notify.js"; - import { follows } from "@/store.js"; - import type { PublicUser, Watched } from "@/types.js"; - import axios from "axios"; - import { onDestroy, onMount } from "svelte"; - - export let data; - - let followBtnDisabled = false; - let user: PublicUser | undefined; - - $: isFollowing = !!$follows?.find((f) => f.followedUser.id === Number(data.id)); - - async function getPublicWatchedList(id?: number, username?: string) { - if (!id || !username) { - console.error("getPublicWatchedList requires and id and username", id, username); - notify({ type: "error", text: "Couldn't fetch list" }); - } - return (await axios.get(`/watched/${id}/${username}`)).data as Watched[]; - } - - async function getPublicUser() { - return (await axios.get(`/user/public/${data.id}/${data.username}`)).data as PublicUser; - } - - async function follow() { - followBtnDisabled = true; - console.log(isFollowing); - if (isFollowing) { - await unfollowUser(Number(data.id)); - } else { - await followUser(Number(data.id)); - } - followBtnDisabled = false; - } - - $: { - user = undefined; - if (data?.id && data?.username) { - getPublicUser() - .then((u) => { - user = u; - }) - .catch((err) => { - console.error("getPublicUser failed!", err); - }); - } - } + import { run } from "svelte/legacy"; + + import Icon from "@/lib/Icon.svelte"; + import PageError from "@/lib/PageError.svelte"; + import Spinner from "@/lib/Spinner.svelte"; + import WatchedList from "@/lib/WatchedList.svelte"; + import tooltip from "@/lib/actions/tooltip.js"; + import UserAvatar from "@/lib/img/UserAvatar.svelte"; + import { followUser, unfollowUser } from "@/lib/util/api.js"; + import { notify } from "@/lib/util/notify.js"; + import { store } from "@/store.svelte.js"; + import type { PublicUser, Watched } from "@/types.js"; + import axios from "axios"; + import { onDestroy, onMount } from "svelte"; + + let { data } = $props(); + + let followBtnDisabled = $state(false); + let user: PublicUser | undefined = $state(); + + let isFollowing = $derived( + !!store.follows?.find((f) => f.followedUser.id === Number(data.id)), + ); + + async function getPublicWatchedList(id?: number, username?: string) { + if (!id || !username) { + console.error( + "getPublicWatchedList requires and id and username", + id, + username, + ); + notify({ type: "error", text: "Couldn't fetch list" }); + } + return (await axios.get(`/watched/${id}/${username}`)).data as Watched[]; + } + + async function getPublicUser() { + return (await axios.get(`/user/public/${data.id}/${data.username}`)) + .data as PublicUser; + } + + async function follow() { + followBtnDisabled = true; + console.log(isFollowing); + if (isFollowing) { + await unfollowUser(Number(data.id)); + } else { + await followUser(Number(data.id)); + } + followBtnDisabled = false; + } + + run(() => { + user = undefined; + if (data?.id && data?.username) { + getPublicUser() + .then((u) => { + user = u; + }) + .catch((err) => { + console.error("getPublicUser failed!", err); + }); + } + }); </script> <svelte:head> - <title>{data.username}'s Watched List + {data.username}'s Watched List
    -
    - -
    -
    -

    - {data.username} -

    - -
    - {#if user?.bio} - {user?.bio} - {/if} -
    -
    +
    + +
    +
    +

    + {data.username} +

    + +
    + {#if user?.bio} + {user?.bio} + {/if} +
    +
    {#await getPublicWatchedList(Number(data.id), data.username)} - + {:then watched} - + {:catch err} - + {/await} diff --git a/src/routes/(app)/lists/[id]/[username]/+page.ts b/src/routes/(app)/lists/[id]/[username]/+page.ts index 3a5e6368..c6f82bfe 100644 --- a/src/routes/(app)/lists/[id]/[username]/+page.ts +++ b/src/routes/(app)/lists/[id]/[username]/+page.ts @@ -1,15 +1,15 @@ import { error } from "@sveltejs/kit"; export async function load({ params }) { - const { id, username } = params; + const { id, username } = params; - if (!id || !username) { - error(400); - return; - } + if (!id || !username) { + error(400); + return; + } - return { - id, - username - }; + return { + id, + username, + }; } diff --git a/src/routes/(app)/manage_users/+page.svelte b/src/routes/(app)/manage_users/+page.svelte index c5fa1b54..7d11e5ca 100644 --- a/src/routes/(app)/manage_users/+page.svelte +++ b/src/routes/(app)/manage_users/+page.svelte @@ -1,155 +1,165 @@
    -
    -

    User Management

    -
    Take control and manage all the users using your server.
    - - {#await getUsers()} - - {:then} - - - - - - - - {#each allUsers as u} - {@const joinDate = new Date(u.createdAt)} - - - - - - - {/each} -
    NamePrivateJoined
    -
    - - {u.username} - {#if userHasPermission(u.permissions, UserPermission.PERM_ADMIN)} - Admin - {/if} -
    -
    {u.private === true ? "Yes" : "No"} - {joinDate.getDate()}{getOrdinalSuffix(joinDate.getDate())} - {monthsShort[joinDate.getMonth()]} - {joinDate.getFullYear() === currentYear - ? "" - : `'${String(joinDate.getFullYear()).substring(2, 4)}`} - -
    - - {#if editingUser} - { - editingUser = undefined; - getUsers(); // lazyness, but also scientifically doesn't matter - }} - /> - {/if} - {:catch err} - - {/await} -
    +
    +

    User Management

    +
    + Take control and manage all the users using your server. +
    + + {#await getUsers()} + + {:then} + + + + + + + + + + + {#each allUsers as u} + {@const joinDate = new Date(u.createdAt)} + + + + + + + {/each} + +
    NamePrivateJoined
    +
    + + {u.username} + {#if userHasPermission(u.permissions, UserPermission.PERM_ADMIN)} + Admin + {/if} +
    +
    {u.private === true ? "Yes" : "No"} + {joinDate.getDate()}{getOrdinalSuffix(joinDate.getDate())} + {monthsShort[joinDate.getMonth()]} + {joinDate.getFullYear() === currentYear + ? "" + : `'${String(joinDate.getFullYear()).substring(2, 4)}`} + +
    + + {#if editingUser} + { + editingUser = undefined; + getUsers(); // lazyness, but also scientifically doesn't matter + }} + /> + {/if} + {:catch err} + + {/await} +
    diff --git a/src/routes/(app)/manage_users/modals/EditUserModal.svelte b/src/routes/(app)/manage_users/modals/EditUserModal.svelte index 86ff5194..afa705a1 100644 --- a/src/routes/(app)/manage_users/modals/EditUserModal.svelte +++ b/src/routes/(app)/manage_users/modals/EditUserModal.svelte @@ -1,178 +1,204 @@ - - {#if error} - {error}! - {/if} - - -

    Permissions

    - - - { - userTogglePermission(UserPermission.PERM_ADMIN); - }} - /> - - - - { - userTogglePermission(UserPermission.PERM_REQUEST_CONTENT); - }} - /> - - - - { - userTogglePermission(UserPermission.PERM_REQUEST_CONTENT_AUTO_APPROVE); - }} - /> - - -

    Other

    - - - {#if !user.type || user.type === UserType.Proxy} - - {:else} -

    This option is not supported for this user type yet.

    - {/if} -
    - -
    - -
    -
    + + {#if error} + {error}! + {/if} + + +

    Permissions

    + + + { + userTogglePermission(UserPermission.PERM_ADMIN); + }} + /> + + + + { + userTogglePermission(UserPermission.PERM_REQUEST_CONTENT); + }} + /> + + + + { + userTogglePermission( + UserPermission.PERM_REQUEST_CONTENT_AUTO_APPROVE, + ); + }} + /> + + +

    Other

    + + + {#if !user.type || user.type === UserType.Proxy} + + {:else} +

    This option is not supported for this user type yet.

    + {/if} +
    + +
    + +
    +
    diff --git a/src/routes/(app)/movie/[id]/+page.svelte b/src/routes/(app)/movie/[id]/+page.svelte index 99a73a10..a39e573e 100644 --- a/src/routes/(app)/movie/[id]/+page.svelte +++ b/src/routes/(app)/movie/[id]/+page.svelte @@ -1,462 +1,475 @@ - {movie?.title ? `${movie.title} - ` : ""}Movie + {movie?.title ? `${movie.title} - ` : ""}Movie {#if pageError} - + {:else if !movie} - + {:else if Object.keys(movie).length > 0} -
    -
    - {#if movie?.backdrop_path} - - {/if} -
    - -
    - - -
    - - - <span class="quick-info"> - <span>{movie.runtime} min</span> - - <div> - {#each movie.genres as g, i} - <span>{g.name}{i !== movie.genres.length - 1 ? ", " : ""}</span> - {/each} - </div> - </span> - - <!-- <span>{movie.tagline}</span> --> - - <!-- {movie.status} --> - - <span style="font-weight: bold; font-size: 14px;">Overview</span> - <p>{movie.overview}</p> - - <div class="btns"> - {#if trailer} - <button on:click={() => (trailerShown = !trailerShown)}>View Trailer</button> - {#if trailerShown} - <VideoEmbedModal embed={trailer} closed={() => (trailerShown = false)} /> - {/if} - {/if} - {#if jellyfinUrl} - <a class="btn" href={jellyfinUrl} target="_blank"> - <Icon i="jellyfin" wh={14} />Play On Jellyfin - </a> - {/if} - {#if $serverFeatures.radarr && data.movieId} - <ArrRequestButton - type="movie" - tmdbId={data.movieId} - openRequestModal={() => (requestModalShown = !requestModalShown)} - bind:this={arrRequestButtonComp} - /> - {/if} - {#if wListItem} - <div class="other-side"> - <AddToTagButton watchedItem={wListItem} /> - <button - on:click={() => { - if (wListItem?.pinned) { - contentChanged(undefined, undefined, undefined, false); - } else { - contentChanged(undefined, undefined, undefined, true); - } - }} - use:tooltip={{ - text: `${wListItem?.pinned ? "Unpin from" : "Pin to"} top of list`, - pos: "bot" - }} - > - <Icon i={wListItem?.pinned ? "unpin" : "pin"} wh={19} /> - </button> - <button - class="delete-btn" - on:click={() => - wListItem - ? removeWatched(wListItem.id) - : console.error("no wlistItem.. can't delete")} - use:tooltip={{ text: "Delete", pos: "bot" }} - > - <Icon i="trash" wh={19} /> - </button> - </div> - {/if} - </div> - - <ProvidersList providers={movie["watch/providers"]} /> - </div> - </div> - </div> - - {#if requestModalShown} - <RequestMovie - content={movie} - onClose={(reqResp) => { - requestModalShown = false; - if (reqResp) { - arrRequestButtonComp.setExistingRequest(reqResp); - } - }} - /> - {/if} - - <div class="page"> - <div class="review"> - <!-- <span>What did you think?</span> --> - <Rating rating={wListItem?.rating} onChange={(n) => contentChanged(undefined, n)} /> - <Status status={wListItem?.status} onChange={(n) => contentChanged(n)} /> - {#if wListItem} - <MyThoughts - contentTitle={movie.title} - thoughts={wListItem?.thoughts} - onChange={(newThoughts) => { - return contentChanged(undefined, undefined, newThoughts); - }} - /> - {/if} - </div> - - {#if movieId} - <FollowedThoughts mediaType="movie" mediaId={movieId} /> - {/if} - - {#await getMovieCredits()} - <Spinner /> - {:then credits} - {#if credits.topCrew?.length > 0} - <div class="creators"> - {#each credits.topCrew as crew} - <div> - <span>{crew.name}</span> - <span>{crew.job}</span> - </div> - {/each} - </div> - {/if} - - {#if credits.cast?.length > 0} - <HorizontalList title="Cast"> - {#each credits.cast?.slice(0, 50) as cast} - <PersonPoster - id={cast.id} - name={cast.name} - path={cast.profile_path} - role={cast.character} - zoomOnHover={false} - /> - {/each} - </HorizontalList> - {/if} - {:catch err} - <Error error={err} pretty="Failed to load cast!" /> - {/await} - - <SimilarContent type="movie" similar={movie.similar} /> - - {#if wListItem} - <Activity wListId={wListItem.id} activity={wListItem.activity} /> - {/if} - </div> - </div> + <div> + <div class="content"> + {#if movie?.backdrop_path} + <img + class="backdrop" + src={"https://www.themoviedb.org/t/p/w1920_and_h800_multi_faces" + + movie.backdrop_path} + alt="" + /> + {/if} + <div class="vignette"></div> + + <div class="details-container"> + <img + class="poster" + src={"https://image.tmdb.org/t/p/w500" + movie.poster_path} + alt="" + /> + + <div class="details"> + <Title + title={movie.title} + homepage={movie.homepage} + releaseYear={new Date(Date.parse(movie.release_date)).getFullYear()} + voteAverage={movie.vote_average} + voteCount={movie.vote_count} + /> + + <span class="quick-info"> + <span>{movie.runtime} min</span> + + <div> + {#each movie.genres as g, i} + <span>{g.name}{i !== movie.genres.length - 1 ? ", " : ""}</span> + {/each} + </div> + </span> + + <!-- <span>{movie.tagline}</span> --> + + <!-- {movie.status} --> + + <span style="font-weight: bold; font-size: 14px;">Overview</span> + <p>{movie.overview}</p> + + <div class="btns"> + {#if trailer} + <button onclick={() => (trailerShown = !trailerShown)} + >View Trailer</button + > + {#if trailerShown} + <VideoEmbedModal + embed={trailer} + closed={() => (trailerShown = false)} + /> + {/if} + {/if} + {#if jellyfinUrl} + <a class="btn" href={jellyfinUrl} target="_blank"> + <Icon i="jellyfin" wh={14} />Play On Jellyfin + </a> + {/if} + {#if store.serverFeatures?.radarr && data.movieId} + <ArrRequestButton + type="movie" + tmdbId={data.movieId} + openRequestModal={() => + (requestModalShown = !requestModalShown)} + bind:this={arrRequestButtonComp} + /> + {/if} + {#if wListItem} + <div class="other-side"> + <AddToTagButton watchedItem={wListItem} /> + <button + onclick={() => { + if (wListItem?.pinned) { + contentChanged(undefined, undefined, undefined, false); + } else { + contentChanged(undefined, undefined, undefined, true); + } + }} + use:tooltip={{ + text: `${wListItem?.pinned ? "Unpin from" : "Pin to"} top of list`, + pos: "bot", + }} + > + <Icon i={wListItem?.pinned ? "unpin" : "pin"} wh={19} /> + </button> + <button + class="delete-btn" + onclick={() => + wListItem + ? removeWatched(wListItem.id) + : console.error("no wlistItem.. can't delete")} + use:tooltip={{ text: "Delete", pos: "bot" }} + > + <Icon i="trash" wh={19} /> + </button> + </div> + {/if} + </div> + + <ProvidersList providers={movie["watch/providers"]} /> + </div> + </div> + </div> + + {#if requestModalShown} + <RequestMovie + content={movie} + onClose={(reqResp) => { + requestModalShown = false; + if (reqResp) { + arrRequestButtonComp?.setExistingRequest(reqResp); + } + }} + /> + {/if} + + <div class="page"> + <div class="review"> + <!-- <span>What did you think?</span> --> + <Rating + rating={wListItem?.rating} + onChange={(n) => contentChanged(undefined, n)} + /> + <Status + status={wListItem?.status} + onChange={(n) => contentChanged(n)} + /> + {#if wListItem} + <MyThoughts + contentTitle={movie.title} + thoughts={wListItem?.thoughts} + onChange={(newThoughts) => { + return contentChanged(undefined, undefined, newThoughts); + }} + /> + {/if} + </div> + + {#if data.movieId} + <FollowedThoughts mediaType="movie" mediaId={data.movieId} /> + {/if} + + {#await getMovieCredits()} + <Spinner /> + {:then credits} + {#if credits.topCrew?.length > 0} + <div class="creators"> + {#each credits.topCrew as crew} + <div> + <span>{crew.name}</span> + <span>{crew.job}</span> + </div> + {/each} + </div> + {/if} + + {#if credits.cast?.length > 0} + <HorizontalList title="Cast"> + {#each credits.cast?.slice(0, 50) as cast} + <PersonPoster + id={cast.id} + name={cast.name} + path={cast.profile_path} + role={cast.character} + zoomOnHover={false} + /> + {/each} + </HorizontalList> + {/if} + {:catch err} + <Error error={err} pretty="Failed to load cast!" /> + {/await} + + <SimilarContent type="movie" similar={movie.similar} /> + + {#if wListItem} + <Activity wListId={wListItem.id} activity={wListItem.activity} /> + {/if} + </div> + </div> {:else} - Movie not found + Movie not found {/if} <style lang="scss"> - .content { - position: relative; - color: white; - - img.backdrop { - position: absolute; - left: 0; - top: 0; - z-index: -2; - width: 100%; - height: 100%; - object-fit: cover; - filter: $backdrop-filter; - mix-blend-mode: $backdrop-mix-blend-mode; - mask-image: $backdrop-mask-image; - } - - .vignette { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba($color: #000000, $alpha: 0.7); - z-index: -1; - mask-image: $backdrop-mask-image; - } - - .details-container { - display: flex; - flex-flow: row; - gap: 35px; - max-width: 1100px; - padding: 40px 80px; - margin-left: auto; - margin-right: auto; - - img.poster { - width: 235px; - height: 100%; - box-shadow: 0px 0px 14px -4px #9c8080; - border-radius: 12px; - } - - .details { - display: flex; - flex-flow: column; - gap: 5px; - - .quick-info { - display: flex; - gap: 10px; - margin-bottom: 8px; - } - - p { - font-size: 14px; - margin-bottom: 18px; - } - - .btns { - display: flex; - flex-flow: row; - flex-wrap: wrap; - gap: 8px; - margin-top: auto; - - a.btn, - button { - max-width: fit-content; - overflow: hidden; - animation: 50ms cubic-bezier(0.86, 0, 0.07, 1) forwards otherbtn; - white-space: nowrap; - gap: 6px; - justify-content: flex-start; - font-size: 14px; - - @keyframes otherbtn { - from { - width: 0px; - } - to { - width: 100%; - } - } - } - - .other-side { - display: flex; - flex-flow: row; - gap: 8px; - - @media screen and (min-width: 900px) { - margin-left: auto; - } - } - - .delete-btn { - &:hover { - color: $error; - } - } - } - } - - @media screen and (max-width: 700px) { - padding: 40px; - } - - @media screen and (max-width: 590px) { - flex-flow: column; - align-items: center; - } - } - } - - .page { - display: flex; - flex-flow: column; - align-items: center; - margin-left: auto; - margin-right: auto; - gap: 30px; - padding: 20px 50px; - max-width: 1200px; - - @media screen and (max-width: 500px) { - padding: 20px; - } - } - - .review { - display: flex; - flex-flow: column; - gap: 10px; - width: 100%; - max-width: 380px; - - @media screen and (max-width: 420px) { - max-width: 340px; - } - } - - .creators { - display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 35px; - margin: 10px 60px; - - div { - display: flex; - flex-flow: column; - min-width: 150px; - - span:first-child { - font-weight: bold; - } - } - } + .content { + position: relative; + color: white; + + img.backdrop { + position: absolute; + left: 0; + top: 0; + z-index: -2; + width: 100%; + height: 100%; + object-fit: cover; + filter: $backdrop-filter; + mix-blend-mode: $backdrop-mix-blend-mode; + mask-image: $backdrop-mask-image; + } + + .vignette { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba($color: #000000, $alpha: 0.7); + z-index: -1; + mask-image: $backdrop-mask-image; + } + + .details-container { + display: flex; + flex-flow: row; + gap: 35px; + max-width: 1100px; + padding: 40px 80px; + margin-left: auto; + margin-right: auto; + + img.poster { + width: 235px; + height: 100%; + box-shadow: 0px 0px 14px -4px #9c8080; + border-radius: 12px; + } + + .details { + display: flex; + flex-flow: column; + gap: 5px; + + .quick-info { + display: flex; + gap: 10px; + margin-bottom: 8px; + } + + p { + font-size: 14px; + margin-bottom: 18px; + } + + .btns { + display: flex; + flex-flow: row; + flex-wrap: wrap; + gap: 8px; + margin-top: auto; + + a.btn, + button { + max-width: fit-content; + overflow: hidden; + animation: 50ms cubic-bezier(0.86, 0, 0.07, 1) forwards otherbtn; + white-space: nowrap; + gap: 6px; + justify-content: flex-start; + font-size: 14px; + + @keyframes otherbtn { + from { + width: 0px; + } + to { + width: 100%; + } + } + } + + .other-side { + display: flex; + flex-flow: row; + gap: 8px; + + @media screen and (min-width: 900px) { + margin-left: auto; + } + } + + .delete-btn { + &:hover { + color: $error; + } + } + } + } + + @media screen and (max-width: 700px) { + padding: 40px; + } + + @media screen and (max-width: 590px) { + flex-flow: column; + align-items: center; + } + } + } + + .page { + display: flex; + flex-flow: column; + align-items: center; + margin-left: auto; + margin-right: auto; + gap: 30px; + padding: 20px 50px; + max-width: 1200px; + + @media screen and (max-width: 500px) { + padding: 20px; + } + } + + .review { + display: flex; + flex-flow: column; + gap: 10px; + width: 100%; + max-width: 380px; + + @media screen and (max-width: 420px) { + max-width: 340px; + } + } + + .creators { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 35px; + margin: 10px 60px; + + div { + display: flex; + flex-flow: column; + min-width: 150px; + + span:first-child { + font-weight: bold; + } + } + } </style> diff --git a/src/routes/(app)/movie/[id]/+page.ts b/src/routes/(app)/movie/[id]/+page.ts index c46847e6..12acb2f7 100644 --- a/src/routes/(app)/movie/[id]/+page.ts +++ b/src/routes/(app)/movie/[id]/+page.ts @@ -2,14 +2,14 @@ import { error } from "@sveltejs/kit"; import type { PageLoad } from "./$types"; export const load = (async ({ params }) => { - const { id } = params; + const { id } = params; - if (!id) { - error(400); - return; - } + if (!id) { + error(400); + return; + } - return { - movieId: Number(id) - }; + return { + movieId: Number(id), + }; }) satisfies PageLoad; diff --git a/src/routes/(app)/person/[id]/+page.svelte b/src/routes/(app)/person/[id]/+page.svelte index c9f27c65..3a166ecc 100644 --- a/src/routes/(app)/person/[id]/+page.svelte +++ b/src/routes/(app)/person/[id]/+page.svelte @@ -1,363 +1,385 @@ <script lang="ts"> - import { page } from "$app/stores"; - import Error from "@/lib/Error.svelte"; - import PageError from "@/lib/PageError.svelte"; - import Poster from "@/lib/poster/Poster.svelte"; - import PosterList from "@/lib/poster/PosterList.svelte"; - import Spinner from "@/lib/Spinner.svelte"; - import DropDown from "@/lib/DropDown.svelte"; - import { getWatchedDependedProps } from "@/lib/util/helpers"; - import { watchedList } from "@/store"; - import type { TMDBPersonCombinedCredits, TMDBPersonDetails } from "@/types"; - import axios from "axios"; - import { onMount } from "svelte"; - import Checkbox from "@/lib/Checkbox.svelte"; - import Icon from "@/lib/Icon.svelte"; - - export let data; - - $: wList = $watchedList; - - let personId: number | undefined; - let person: TMDBPersonDetails | undefined; - let pageError: Error | undefined; - let sortOption = "Vote count"; - let credits: TMDBPersonCombinedCredits | undefined; - let onMyListFilter = false; - - onMount(() => { - const unsubscribe = page.subscribe((value) => { - const params = value.params; - if (params && params.id) { - personId = Number(params.id); - } - }); - - return unsubscribe; - }); - - $: if (personId) { - fetchPersonData(); - } - - $: if (sortOption && credits) { - sortCredits(sortOption); - } - - async function fetchPersonData() { - try { - person = undefined; - pageError = undefined; - if (!personId) { - return; - } - person = await getPerson(personId); - await updatePersonCredits(); - sortCredits(sortOption); - } catch (err: any) { - person = undefined; - pageError = err; - } - } - - async function getPerson(id: number) { - return (await axios.get(`/content/person/${id}`)).data as TMDBPersonDetails; - } - - async function updatePersonCredits() { - credits = (await axios.get(`/content/person/${data.personId}/credits`)) - .data as TMDBPersonCombinedCredits; - credits.cast = credits.cast.filter((v, i, a) => a.findIndex((t) => t.id === v.id) === i); // remove duplicate entries. If an actor has multiple roles in a single movie, it would otherwise show up multiple times - } - - function sortCredits(sortOption: string) { - if (!credits || !credits.cast) return; - switch (sortOption) { - case "Vote count": - credits.cast.sort((a, b) => b.vote_count - a.vote_count); - break; - case "Newest": - credits.cast.sort((a, b) => { - const dateA = new Date(a.release_date || a.first_air_date).valueOf(); - const dateB = new Date(b.release_date || b.first_air_date).valueOf(); - - // if a date is missing it should be sorted first since it's probably a future release - if (!a.release_date && !a.first_air_date) return -1; - if (!b.release_date && !b.first_air_date) return 1; - - return dateB - dateA; - }); - break; - case "Oldest": - credits.cast.sort((a, b) => { - const dateA = new Date(a.release_date || a.first_air_date).valueOf(); - const dateB = new Date(b.release_date || b.first_air_date).valueOf(); - - // if a date is missing it should be sorted last since it's probably a future release - if (!a.release_date && !a.first_air_date) return 1; - if (!b.release_date && !b.first_air_date) return -1; - - return dateA - dateB; - }); - break; - } - credits.cast = credits.cast; - } + import Error from "@/lib/Error.svelte"; + import PageError from "@/lib/PageError.svelte"; + import Poster from "@/lib/poster/Poster.svelte"; + import PosterList from "@/lib/poster/PosterList.svelte"; + import Spinner from "@/lib/Spinner.svelte"; + import DropDown from "@/lib/DropDown.svelte"; + import { getWatchedDependedProps } from "@/lib/util/helpers"; + import { store } from "@/store.svelte.js"; + import type { + TMDBPersonCombinedCredits, + TMDBPersonCombinedCreditsCast, + TMDBPersonDetails, + } from "@/types"; + import axios from "axios"; + import Checkbox from "@/lib/Checkbox.svelte"; + import Icon from "@/lib/Icon.svelte"; + + let { data } = $props(); + + let person: TMDBPersonDetails | undefined = $state(); + let pageError: Error | undefined = $state(); + let sortOption = $state("Vote count"); + let credits: TMDBPersonCombinedCredits | undefined = $state(); + let onMyListFilter = $state(false); + + $effect(() => { + if (data.personId) { + fetchPersonData(); + } + }); + + $effect(() => { + if (sortOption && credits) { + sortCredits(sortOption); + } + }); + + async function fetchPersonData() { + try { + person = undefined; + pageError = undefined; + if (!data.personId) { + return; + } + person = await getPerson(data.personId); + await updatePersonCredits(); + sortCredits(sortOption); + } catch (err: any) { + person = undefined; + pageError = err; + } + } + + async function getPerson(id: number) { + return (await axios.get(`/content/person/${id}`)).data as TMDBPersonDetails; + } + + async function updatePersonCredits() { + credits = (await axios.get(`/content/person/${data.personId}/credits`)) + .data as TMDBPersonCombinedCredits; + credits.cast = credits.cast.filter( + (v, i, a) => a.findIndex((t) => t.id === v.id) === i, + ); // remove duplicate entries. If an actor has multiple roles in a single movie, it would otherwise show up multiple times + } + + function newestOldestSort( + a: TMDBPersonCombinedCreditsCast, + b: TMDBPersonCombinedCreditsCast, + /** + * 0 = Newest, + * 1 = Oldest + */ + n: 0 | 1, + ) { + const dateA = new Date(a.release_date || a.first_air_date).valueOf(); + const dateB = new Date(b.release_date || b.first_air_date).valueOf(); + + // Assume missing release date means future release (TBD) + if ( + !a.release_date && + !a.first_air_date && + !b.release_date && + !b.first_air_date + ) { + // Both releases have no date, return as equals + // here to avoid an infinite loop. + return 0; + } + if (!a.release_date && !a.first_air_date) return n === 0 ? -1 : 1; + if (!b.release_date && !b.first_air_date) return n === 0 ? 1 : -1; + + if (n === 0) { + return dateB - dateA; + } else { + return dateA - dateB; + } + } + + function sortCredits(sortOption: string) { + if (!credits || !credits.cast) return; + switch (sortOption) { + case "Vote count": + credits.cast.sort((a, b) => b.vote_count - a.vote_count); + break; + case "Newest": + credits.cast.sort((a, b) => newestOldestSort(a, b, 0)); + break; + case "Oldest": + credits.cast.sort((a, b) => newestOldestSort(a, b, 1)); + break; + } + credits.cast = credits.cast; + } </script> <svelte:head> - <title>{person?.name ? `${person.name} - ` : ""}Person + {person?.name ? `${person.name} - ` : ""}Person
    - {#if pageError} - - {:else if !person} - - {:else if Object.keys(person).length > 0} - {#if Object.keys(person).length > 0} -
    - -
    - -
    - - -
    - - {person.name} - - - - {#if person.biography} - Biography - -

    {person.biography?.split("\n")[0]}

    - {/if} - -
    - {#if person.known_for_department} -
    - Department - {person.known_for_department} -
    - {/if} - {#if person.place_of_birth} -
    - Born In - {person.place_of_birth} -
    - {/if} - {#if person.birthday} -
    - Born On - {new Date(Date.parse(person.birthday)).toLocaleDateString()} -
    - {/if} - {#if person.deathday} -
    - Died On - {new Date(Date.parse(person.deathday)).toLocaleDateString()} -
    - {/if} -
    -
    -
    -
    - {#if credits} - {#if credits?.cast?.length > 0} -
    -
    - On my list - -
    - -
    -
    - - {#each credits.cast as c (c.id)} - - {/each} - -
    - {:else} -
    - -

    We found no credits!

    -

    It seems that this person has no credits.

    -
    - {/if} - {:else} - - {/if} - {:else} - person not found - {/if} - {:else} - - {/if} + {#if pageError} + + {:else if !person} + + {:else if Object.keys(person).length > 0} + {#if Object.keys(person).length > 0} +
    + +
    + +
    + + +
    + + {person.name} + + + + {#if person.biography} + Biography + +

    {person.biography?.split("\n")[0]}

    + {/if} + +
    + {#if person.known_for_department} +
    + Department + {person.known_for_department} +
    + {/if} + {#if person.place_of_birth} +
    + Born In + {person.place_of_birth} +
    + {/if} + {#if person.birthday} +
    + Born On + {new Date( + Date.parse(person.birthday), + ).toLocaleDateString()} +
    + {/if} + {#if person.deathday} +
    + Died On + {new Date( + Date.parse(person.deathday), + ).toLocaleDateString()} +
    + {/if} +
    +
    +
    +
    + {#if credits} + {#if credits?.cast?.length > 0} +
    +
    + On my list + +
    + +
    +
    + + {#each credits.cast as c (c.id)} + + {/each} + +
    + {:else} +
    + +

    We found no credits!

    +

    It seems that this person has no credits.

    +
    + {/if} + {:else} + + {/if} + {:else} + person not found + {/if} + {:else} + + {/if}
    diff --git a/src/routes/(app)/person/[id]/+page.ts b/src/routes/(app)/person/[id]/+page.ts index 41f60d23..358951c5 100644 --- a/src/routes/(app)/person/[id]/+page.ts +++ b/src/routes/(app)/person/[id]/+page.ts @@ -2,14 +2,14 @@ import { error } from "@sveltejs/kit"; import type { PageLoad } from "./$types"; export const load = (async ({ params }) => { - const { id } = params; + const { id } = params; - if (!id) { - error(400); - return; - } + if (!id) { + error(400); + return; + } - return { - personId: Number(id) - }; + return { + personId: Number(id), + }; }) satisfies PageLoad; diff --git a/src/routes/(app)/profile/+page.svelte b/src/routes/(app)/profile/+page.svelte index 0843b5c1..18d46bef 100644 --- a/src/routes/(app)/profile/+page.svelte +++ b/src/routes/(app)/profile/+page.svelte @@ -1,484 +1,513 @@ - My Profile + My Profile
    -
    -
    - -
    -

    - Hey - {user?.username} -

    - +
    +
    + + + {#await getProfilePromise} + + {:then profile} + + + + + + {:catch err} + + {/await} + + +
    +

    Settings

    + +
    +

    Theme

    +
    + + +
    +
    + + + { + countryDisabled = true; + updateUserSetting("country", c, () => { + countryDisabled = false; + }); + }} + /> + + + + { + privateDisabled = true; + updateUserSetting("private", on, () => { + privateDisabled = false; + }); + }} + /> + + + {#if !settings?.private} + + { + privateThoughtsDisabled = true; + updateUserSetting("privateThoughts", on, () => { + privateThoughtsDisabled = false; + }); + }} + /> + + {/if} + + + { + hideSpoilersDisabled = true; + updateUserSetting("hideSpoilers", on, () => { + hideSpoilersDisabled = false; + }); + }} + /> + + + + { + automateShowStatusesDisabled = true; + updateUserSetting("automateShowStatuses", on, () => { + automateShowStatusesDisabled = false; + }); + }} + /> + + + + { + includePreviouslyWatchedDisabled = true; + updateUserSetting("includePreviouslyWatched", on, () => { + includePreviouslyWatchedDisabled = false; + // Get profile stats again + getProfilePromise = getProfile(); + }); + }} + /> + + + + +
    + + + {#if user?.type !== UserType.Plex && user?.type !== UserType.Jellyfin} + + {/if} + {#if user?.type === UserType?.Jellyfin} + + {/if} + {#if user?.type === UserType?.Plex} + + {/if} +
    + {#if pwChangeModalOpen} + { + pwChangeModalOpen = false; + }} + > + {/if} + {#if jellyfinSyncModalOpen} + (jellyfinSyncModalOpen = false)} /> + {/if} + {#if plexSyncModalOpen} + (plexSyncModalOpen = false)} /> + {/if} +
    +
    diff --git a/src/routes/(app)/profile/modals/PwChangeModal.svelte b/src/routes/(app)/profile/modals/PwChangeModal.svelte index 1717c1cd..58e51523 100644 --- a/src/routes/(app)/profile/modals/PwChangeModal.svelte +++ b/src/routes/(app)/profile/modals/PwChangeModal.svelte @@ -1,163 +1,183 @@ - {#if error} - {error}! - {/if} -
    -
    -
    - - - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - -
    -
    + {#if error} + {error}! + {/if} +
    +
    +
    + + + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    diff --git a/src/routes/(app)/profile/modals/SyncModal.svelte b/src/routes/(app)/profile/modals/SyncModal.svelte index a82c2805..050a5bcd 100644 --- a/src/routes/(app)/profile/modals/SyncModal.svelte +++ b/src/routes/(app)/profile/modals/SyncModal.svelte @@ -1,207 +1,237 @@ -
    - {#if step === "done"} - - {:else if step === "errored"} - - {:else} - - {/if} -
    - {#if step === "starting"} -

    Starting

    - We are requesting a full sync - {:else if step === "job-running"} -

    Syncing

    - {#if currentTask} - {currentTask} - {/if} - {:else if step === "done"} - {#if !latestJobStatus?.errors || latestJobStatus?.errors?.length <= 0} -

    Finished

    - We have finished syncing. Looks like there were no errors! - {:else} -

    - Finished With {latestJobStatus?.errors?.length} Error{latestJobStatus?.errors - ?.length === 1 - ? "" - : "s"} -

    - Syncing has finished, but with errors: -
      - {#each latestJobStatus?.errors as e} -
    • {e}
    • - {/each} -
    - {/if} - {:else if step === "errored"} -

    We Errored!

    - We errored before starting sync or the sync job was cancelled. - {:else} -

    Unknown State!

    - We're not sure of the current sync status. - {/if} -
    -
    +
    + {#if step === "done"} + + {:else if step === "errored"} + + {:else} + + {/if} +
    + {#if step === "starting"} +

    Starting

    + We are requesting a full sync + {:else if step === "job-running"} +

    Syncing

    + {#if currentTask} + {currentTask} + {/if} + {:else if step === "done"} + {#if !latestJobStatus?.errors || latestJobStatus?.errors?.length <= 0} +

    Finished

    + We have finished syncing. Looks like there were no errors! + {:else} +

    + Finished With {latestJobStatus?.errors?.length} Error{latestJobStatus + ?.errors?.length === 1 + ? "" + : "s"} +

    + Syncing has finished, but with errors: +
      + {#each latestJobStatus?.errors as e} +
    • {e}
    • + {/each} +
    + {/if} + {:else if step === "errored"} +

    We Errored!

    + We errored before starting sync or the sync job was cancelled. + {:else} +

    Unknown State!

    + We're not sure of the current sync status. + {/if} +
    +
    diff --git a/src/routes/(app)/request_admin/+page.svelte b/src/routes/(app)/request_admin/+page.svelte index 81cea1fa..8da4c591 100644 --- a/src/routes/(app)/request_admin/+page.svelte +++ b/src/routes/(app)/request_admin/+page.svelte @@ -1,77 +1,80 @@
    -
    -

    Request Admin

    +
    +

    Request Admin

    - {#if page == 0} - - {:else if page == 1} -

    Check your sever log to retrieve your token. Once you have it type it down below.

    - - - {/if} -
    + {#if page == 0} + + {:else if page == 1} +

    + Check your sever log to retrieve your token. Once you have it type it + down below. +

    + + + {/if} +
    diff --git a/src/routes/(app)/search/+page.svelte b/src/routes/(app)/search/+page.svelte index e11d932c..e94f4c0e 100644 --- a/src/routes/(app)/search/+page.svelte +++ b/src/routes/(app)/search/+page.svelte @@ -1,605 +1,654 @@ - Search Results{query ? ` for '${query}'` : ""} + Search Results{store.searchQuery + ? ` for '${store.searchQuery}'` + : ""}
    -
    - {#if query} - {#await searchUsers(query) then results} - {#if results?.length > 0} - - {/if} - {:catch err} - - {/await} - -
    -

    Results

    -
    - - - {#if $serverFeatures.games} - - {/if} - -
    -
    - - {#if searchResults?.length > 0} - {#each searchResults as w, i (`${i}-${w.media_type}-${w.id}`)} - {#if w.media_type === "person"} - - {:else if w.media_type === "game"} - - {:else if w.media_type === "movie" || w.media_type === "tv"} - - {/if} - {/each} - {:else if !searchRunning && !contentSearchErr} - - No Search Results! - {/if} - - - {#if searchRunning} -
    - -
    - {/if} - - {#if contentSearchErr} -
    - { - contentSearchErr = undefined; - search(query); - }} - /> -
    - {/if} - {:else} -

    No Search Query!

    - {/if} -
    +
    + {#if store.searchQuery} + {#await searchUsers(store.searchQuery) then results} + {#if results?.length > 0} + + {/if} + {:catch err} + + {/await} + +
    +

    Results

    +
    + + + {#if store.serverFeatures?.games} + + {/if} + +
    +
    + + {#if searchResults?.length > 0} + {#each searchResults as w, i (`${i}-${w.media_type}-${w.id}`)} + {#if w.media_type === "person"} + + {:else if w.media_type === "game"} + + {:else if w.media_type === "movie" || w.media_type === "tv"} + + {/if} + {/each} + {:else if !searchRunning && !contentSearchErr} + + No Search Results! + {/if} + + + {#if searchRunning} +
    + +
    + {/if} + + {#if contentSearchErr} +
    + { + contentSearchErr = undefined; + search(store.searchQuery); + }} + /> +
    + {/if} + {:else} +

    No Search Query!

    + {/if} +
    diff --git a/src/routes/(app)/search/+page.ts b/src/routes/(app)/search/+page.ts index 0a0071e0..713e4886 100644 --- a/src/routes/(app)/search/+page.ts +++ b/src/routes/(app)/search/+page.ts @@ -1,5 +1,5 @@ export async function load({ url }) { - return { - query: url.searchParams.get("q") - }; + return { + query: url.searchParams.get("q"), + }; } diff --git a/src/routes/(app)/server/+page.svelte b/src/routes/(app)/server/+page.svelte index 48e76723..682946e9 100644 --- a/src/routes/(app)/server/+page.svelte +++ b/src/routes/(app)/server/+page.svelte @@ -1,447 +1,463 @@
    -
    - -

    Server Settings

    +
    + +

    Server Settings

    - - {#await getServerStats()} - - {:then stats} - - - - - - - {#if stats.mostWatchedMovie?.title} - - {/if} - {#if stats.mostWatchedShow?.title} - - {/if} - {:catch err} - - {/await} - + + {#await getServerStats()} + + {:then stats} + + + + + + + {#if stats.mostWatchedMovie?.title} + + {/if} + {#if stats.mostWatchedShow?.title} + + {/if} + {:catch err} + + {/await} + - {#await getServerConfig()} - - {:then} -

    General

    - - { - countryDisabled = true; - updateServerConfig("DEFAULT_COUNTRY", c, () => { - countryDisabled = false; - }); - }} - /> - - + { + countryDisabled = true; + updateServerConfig("DEFAULT_COUNTRY", c, () => { + countryDisabled = false; + }); + }} + /> + + - { - jfDisabled = true; - updateServerConfig("JELLYFIN_HOST", serverConfig.JELLYFIN_HOST, () => { - jfDisabled = false; - }); - }} - disabled={jfDisabled} - /> - - - { - useEmbyDisabled = true; - updateServerConfig("USE_EMBY", on, () => { - useEmbyDisabled = false; - }); - }} - /> - - { + jfDisabled = true; + updateServerConfig( + "JELLYFIN_HOST", + serverConfig!.JELLYFIN_HOST, + () => { + jfDisabled = false; + }, + ); + }} + disabled={jfDisabled} + /> + + + { + useEmbyDisabled = true; + updateServerConfig("USE_EMBY", on, () => { + useEmbyDisabled = false; + }); + }} + /> + + - { - plexHostDisabled = true; - updateServerConfig("PLEX_HOST", serverConfig.PLEX_HOST, (rData) => { - plexHostDisabled = false; - serverConfig.PLEX_MACHINE_ID = rData?.PLEX_MACHINE_ID; - }); - }} - disabled={plexHostDisabled} - /> - {#if serverConfig.PLEX_MACHINE_ID} - Machine Id: {serverConfig.PLEX_MACHINE_ID} - {/if} - - - { - tmdbkDisabled = true; - updateServerConfig("TMDB_KEY", serverConfig.TMDB_KEY, () => { - tmdbkDisabled = false; - }); - }} - disabled={tmdbkDisabled} - /> - - - { - signupDisabled = true; - updateServerConfig("SIGNUP_ENABLED", on, () => { - signupDisabled = false; - }); - }} - /> - - - { - debugDisabled = true; - updateServerConfig("DEBUG", on, () => { - debugDisabled = false; - }); - }} - /> - - - { - taskScheduleModalOpen = true; - }} - /> - - {#if taskScheduleModalOpen} - (taskScheduleModalOpen = false)}> - {/if} - - { - headerSSOModalOpen = true; - }} - /> - - {#if headerSSOModalOpen} - (headerSSOModalOpen = false)} - > - {/if} -
    -

    Services

    -
    - These integrations are not in their final stages. Consider them a preview/beta, if you - have any issues, - - please report them. - -
    -
    + > + { + plexHostDisabled = true; + updateServerConfig( + "PLEX_HOST", + serverConfig!.PLEX_HOST, + (rData) => { + plexHostDisabled = false; + serverConfig!.PLEX_MACHINE_ID = rData?.PLEX_MACHINE_ID; + }, + ); + }} + disabled={plexHostDisabled} + /> + {#if serverConfig.PLEX_MACHINE_ID} + Machine Id: {serverConfig.PLEX_MACHINE_ID} + {/if} + + + { + tmdbkDisabled = true; + updateServerConfig("TMDB_KEY", serverConfig!.TMDB_KEY, () => { + tmdbkDisabled = false; + }); + }} + disabled={tmdbkDisabled} + /> + + + { + signupDisabled = true; + updateServerConfig("SIGNUP_ENABLED", on, () => { + signupDisabled = false; + }); + }} + /> + + + { + debugDisabled = true; + updateServerConfig("DEBUG", on, () => { + debugDisabled = false; + }); + }} + /> + + + { + taskScheduleModalOpen = true; + }} + /> + + {#if taskScheduleModalOpen} + (taskScheduleModalOpen = false)} + > + {/if} + + { + headerSSOModalOpen = true; + }} + /> + + {#if headerSSOModalOpen} + (headerSSOModalOpen = false)} + > + {/if} +
    +

    Services

    +
    + These integrations are not in their final stages. Consider them a + preview/beta, if you have any issues, + + please report them. + +
    +
    - - 0 ? "arrow" : "add"} - onClick={() => { - twitchModalOpen = true; - }} - /> - + + 0 + ? "arrow" + : "add"} + onClick={() => { + twitchModalOpen = true; + }} + /> + - - {#if serverConfig.SONARR?.length > 0} - {#each serverConfig.SONARR as server} - { - sonarrServerEditing = server; - sonarrModalEditing = true; - sonarrModalOpen = true; - }} - /> - {/each} - {/if} - { - let name = "Sonarr"; - if (serverConfig.SONARR?.length > 0) { - // if this still exists ya on yur own - name = `Sonarr${serverConfig.SONARR.length + 1}`; - } - sonarrServerEditing = { name }; - sonarrModalEditing = false; - sonarrModalOpen = true; - }} - /> - + + {#if serverConfig.SONARR?.length > 0} + {#each serverConfig.SONARR as server} + { + sonarrServerEditing = server; + sonarrModalEditing = true; + sonarrModalOpen = true; + }} + /> + {/each} + {/if} + { + let name = "Sonarr"; + if (serverConfig!.SONARR?.length > 0) { + // if this still exists ya on yur own + name = `Sonarr${serverConfig!.SONARR.length + 1}`; + } + sonarrServerEditing = { name }; + sonarrModalEditing = false; + sonarrModalOpen = true; + }} + /> + - - {#if serverConfig.RADARR?.length > 0} - {#each serverConfig.RADARR as server} - { - radarrServerEditing = server; - radarrModalEditing = true; - radarrModalOpen = true; - }} - /> - {/each} - {/if} - { - let name = "Radarr"; - if (serverConfig.RADARR?.length > 0) { - // if this still exists ya on yur own - name = `Radarr${serverConfig.RADARR.length + 1}`; - } - radarrServerEditing = { name }; - radarrModalEditing = false; - radarrModalOpen = true; - }} - /> - + + {#if serverConfig.RADARR?.length > 0} + {#each serverConfig.RADARR as server} + { + radarrServerEditing = server; + radarrModalEditing = true; + radarrModalOpen = true; + }} + /> + {/each} + {/if} + { + let name = "Radarr"; + if (serverConfig!.RADARR?.length > 0) { + // if this still exists ya on yur own + name = `Radarr${serverConfig!.RADARR.length + 1}`; + } + radarrServerEditing = { name }; + radarrModalEditing = false; + radarrModalOpen = true; + }} + /> + - {#if twitchModalOpen} - { - // "temporary" solution to showing added servers - // and reloading data to revert modified but not saved changes. - getServerConfig(); - getServerFeatures(); - twitchModalOpen = false; - }} - /> - {/if} + {#if twitchModalOpen} + { + // "temporary" solution to showing added servers + // and reloading data to revert modified but not saved changes. + getServerConfig(); + getServerFeatures(); + twitchModalOpen = false; + }} + /> + {/if} - {#if sonarrModalOpen} - { - // "temporary" solution to showing added servers - // and reloading data to revert modified but not saved changes. - getServerConfig(); - getServerFeatures(); - sonarrModalOpen = false; - }} - /> - {/if} + {#if sonarrModalOpen && sonarrServerEditing} + { + // "temporary" solution to showing added servers + // and reloading data to revert modified but not saved changes. + getServerConfig(); + getServerFeatures(); + sonarrModalOpen = false; + sonarrServerEditing = undefined; + }} + /> + {/if} - {#if radarrModalOpen} - { - // "temporary" solution to showing added servers - // and reloading data to revert modified but not saved changes. - getServerConfig(); - getServerFeatures(); - radarrModalOpen = false; - }} - /> - {/if} - {:catch err} - - {/await} -
    -
    + {#if radarrModalOpen && radarrServerEditing} + { + // "temporary" solution to showing added servers + // and reloading data to revert modified but not saved changes. + getServerConfig(); + getServerFeatures(); + radarrModalOpen = false; + radarrServerEditing = undefined; + }} + /> + {/if} + {/if} + {:catch err} + + {/await} +
    +
    diff --git a/src/routes/(app)/server/modals/RadarrModal.svelte b/src/routes/(app)/server/modals/RadarrModal.svelte index 789e750a..836af541 100644 --- a/src/routes/(app)/server/modals/RadarrModal.svelte +++ b/src/routes/(app)/server/modals/RadarrModal.svelte @@ -1,229 +1,254 @@ - {#if error} - {error}! - {/if} - - {#if !isEditing} - - - - {/if} - - - - - - - - - - - - - - - -
    - {#if isEditing} - - {/if} - - -
    -
    + {#if error} + {error}! + {/if} + + {#if !isEditing} + + + + {/if} + + + + + + + + + + + + + + + +
    + {#if isEditing} + + {/if} + + +
    +
    diff --git a/src/routes/(app)/server/modals/SonarrModal.svelte b/src/routes/(app)/server/modals/SonarrModal.svelte index b65fe5ee..72c09b1e 100644 --- a/src/routes/(app)/server/modals/SonarrModal.svelte +++ b/src/routes/(app)/server/modals/SonarrModal.svelte @@ -1,247 +1,275 @@ - {#if error} - {error}! - {/if} - - {#if !isEditing} - - - - {/if} - - - - - - - - - - - - - - - - - - -
    - {#if isEditing} - - {/if} - - -
    -
    + {#if error} + {error}! + {/if} + + {#if !isEditing} + + + + {/if} + + + + + + + + + + + + + + + + + + +
    + {#if isEditing} + + {/if} + + +
    +
    diff --git a/src/routes/(app)/server/modals/TaskScheduleModal.svelte b/src/routes/(app)/server/modals/TaskScheduleModal.svelte index c5070048..2f447a77 100644 --- a/src/routes/(app)/server/modals/TaskScheduleModal.svelte +++ b/src/routes/(app)/server/modals/TaskScheduleModal.svelte @@ -1,112 +1,131 @@ - - {#if taskSchedule?.length <= 0} - - {:else} - {#each taskSchedule as task} - {@const nextRun = toRelativeTime((new Date(task.nextRun).getTime() - now) / 1000)} - - Runs every  - { - rescheduleTask(task.name, task.seconds); - }} - /> -  seconds. Next{nextRun === "now" ? "" : " in"} - {nextRun}. - - {/each} - {/if} - + + {#if taskSchedule?.length <= 0} + + {:else} + {#each taskSchedule as task} + {@const nextRun = toRelativeTime( + (new Date(task.nextRun).getTime() - now) / 1000, + )} + + Runs every  + { + rescheduleTask(task.name, task.seconds); + }} + /> +  seconds. Next{nextRun === "now" ? "" : " in"} + {nextRun}. + + {/each} + {/if} + diff --git a/src/routes/(app)/server/modals/TrustedHeaderAuthModal.svelte b/src/routes/(app)/server/modals/TrustedHeaderAuthModal.svelte index 94f7e6cc..4f692af0 100644 --- a/src/routes/(app)/server/modals/TrustedHeaderAuthModal.svelte +++ b/src/routes/(app)/server/modals/TrustedHeaderAuthModal.svelte @@ -1,155 +1,180 @@ - {#if error} - {error}! - {/if} - {#if loadingCfg} - - {:else} - - - - {}} - disabled={formDisabled} - bind:value={headerCfg.headerName} - /> - - - {}} - disabled={formDisabled} - bind:value={headerCfg.logoutUrl} - /> - - - - - - - -
    - -
    -
    - {/if} + {#if error} + {error}! + {/if} + {#if loadingCfg} + + {:else} + + + + {}} + disabled={formDisabled} + bind:value={headerCfg.headerName} + /> + + + {}} + disabled={formDisabled} + bind:value={headerCfg.logoutUrl} + /> + + + + + + + +
    + +
    +
    + {/if}
    diff --git a/src/routes/(app)/server/modals/TwitchModal.svelte b/src/routes/(app)/server/modals/TwitchModal.svelte index a9e93d6a..7bd4447c 100644 --- a/src/routes/(app)/server/modals/TwitchModal.svelte +++ b/src/routes/(app)/server/modals/TwitchModal.svelte @@ -1,128 +1,135 @@ - {#if error} - {error}! - {/if} + {#if error} + {error}! + {/if} - - - Learn how to configure this option at Watcharr Docs. - + + + Learn how to configure this option at Watcharr Docs. + - - - - - - -
    - -
    -
    + + + + + + +
    + +
    +
    diff --git a/src/routes/(app)/tag/[id]/+page.svelte b/src/routes/(app)/tag/[id]/+page.svelte index cf9e7168..0b390524 100644 --- a/src/routes/(app)/tag/[id]/+page.svelte +++ b/src/routes/(app)/tag/[id]/+page.svelte @@ -1,101 +1,104 @@ - {tag ? `${tag.name} - Tag` : "Tag"} + {tag ? `${tag.name} - Tag` : "Tag"} {#if tag && watcheds} -
    -
    -
    - - { - tagEditModalShown = !tagEditModalShown; - }} - /> -
    -
    -
    +
    +
    +
    + + { + tagEditModalShown = !tagEditModalShown; + }} + /> +
    +
    +
    - {#if watcheds?.length > 0} - - {:else} -
    -
    - -

    This tag is empty!

    -

    Add entries to this tag via it's page.

    -
    -
    - {/if} + {#if watcheds?.length > 0} + + {:else} +
    +
    + +

    This tag is empty!

    +

    Add entries to this tag via it's page.

    +
    +
    + {/if} {:else} -
    -
    - Tag does not exist! -
    -
    +
    +
    + Tag does not exist! +
    +
    {/if} {#if tagEditModalShown} - (tagEditModalShown = false)} /> + (tagEditModalShown = false)} + /> {/if} diff --git a/src/routes/(app)/tag/[id]/+page.ts b/src/routes/(app)/tag/[id]/+page.ts index 2d4a05a4..f3b9884b 100644 --- a/src/routes/(app)/tag/[id]/+page.ts +++ b/src/routes/(app)/tag/[id]/+page.ts @@ -1,14 +1,14 @@ import { error } from "@sveltejs/kit"; export const load = async ({ params }) => { - const { id } = params; + const { id } = params; - if (!id) { - error(400); - return; - } + if (!id) { + error(400); + return; + } - return { - tagId: Number(id) - }; + return { + tagId: Number(id), + }; }; diff --git a/src/routes/(app)/tv/[id]/+page.svelte b/src/routes/(app)/tv/[id]/+page.svelte index bd8c00ee..48ae9f7d 100644 --- a/src/routes/(app)/tv/[id]/+page.svelte +++ b/src/routes/(app)/tv/[id]/+page.svelte @@ -1,472 +1,494 @@ - {show?.name ? `${show.name} - ` : ""}Show + {show?.name ? `${show.name} - ` : ""}Show {#if pageError} - + {:else if !show} - + {:else if Object.keys(show).length > 0} -
    -
    - {#if show?.backdrop_path} - - {/if} -
    - -
    - - -
    - - - <span class="quick-info"> - {#if show?.episode_run_time?.length > 0} - <span>{show.episode_run_time.join(",")} min</span> - {/if} - - <div> - {#each show.genres as g, i} - <span>{g.name}{i !== show.genres.length - 1 ? ", " : ""}</span> - {/each} - </div> - </span> - - <span style="font-weight: bold; font-size: 14px;">Overview</span> - <p>{show.overview}</p> - - <div class="btns"> - {#if trailer} - <button on:click={() => (trailerShown = !trailerShown)}>View Trailer</button> - {#if trailerShown} - <VideoEmbedModal embed={trailer} closed={() => (trailerShown = false)} /> - {/if} - {/if} - {#if jellyfinUrl} - <a class="btn" href={jellyfinUrl} target="_blank"> - {#if localStorage.getItem("useEmby")} - <Icon i="emby" wh={14} />Play On Emby - {:else} - <Icon i="jellyfin" wh={14} />Play On Jellyfin - {/if} - </a> - {/if} - {#if $serverFeatures.sonarr && data.tvId} - <ArrRequestButton - type="tv" - tmdbId={data.tvId} - openRequestModal={() => (requestModalShown = !requestModalShown)} - bind:this={arrRequestButtonComp} - /> - {/if} - {#if wListItem} - <div class="other-side"> - <AddToTagButton watchedItem={wListItem} /> - <button - on:click={() => { - if (wListItem?.pinned) { - contentChanged(undefined, undefined, undefined, false); - } else { - contentChanged(undefined, undefined, undefined, true); - } - }} - use:tooltip={{ - text: `${wListItem?.pinned ? "Unpin from" : "Pin to"} top of list`, - pos: "bot" - }} - > - <Icon i={wListItem?.pinned ? "unpin" : "pin"} wh={19} /> - </button> - <button - class="delete-btn" - on:click={() => - wListItem - ? removeWatched(wListItem.id) - : console.error("no wlistItem.. can't delete")} - use:tooltip={{ text: "Delete", pos: "bot" }} - > - <Icon i="trash" wh={19} /> - </button> - </div> - {/if} - </div> - - <ProvidersList providers={show["watch/providers"]} /> - </div> - </div> - </div> - - {#if requestModalShown} - <RequestShow - content={show} - onClose={(reqResp) => { - requestModalShown = false; - if (reqResp) { - arrRequestButtonComp.setExistingRequest(reqResp); - } - }} - /> - {/if} - - <div class="page"> - <div class="review"> - <!-- <span>What did you think?</span> --> - <Rating rating={wListItem?.rating} onChange={(n) => contentChanged(undefined, n)} /> - <Status status={wListItem?.status} onChange={(n) => contentChanged(n)} /> - {#if wListItem} - <MyThoughts - contentTitle={show.name} - thoughts={wListItem?.thoughts} - onChange={(newThoughts) => { - return contentChanged(undefined, undefined, newThoughts); - }} - /> - {/if} - </div> - - {#if showId} - <FollowedThoughts mediaType="tv" mediaId={showId} /> - {/if} - - {#await getTvCredits()} - <Spinner /> - {:then credits} - {#if credits.topCrew?.length > 0} - <div class="creators"> - {#each credits.topCrew as crew} - <div> - <span>{crew.name}</span> - <span>{crew.job}</span> - </div> - {/each} - </div> - {/if} - - {#if credits.cast?.length > 0} - <HorizontalList title="Cast"> - {#each credits.cast?.slice(0, 50) as cast} - <PersonPoster - id={cast.id} - name={cast.name} - path={cast.profile_path} - role={cast.character} - zoomOnHover={false} - /> - {/each} - </HorizontalList> - {/if} - {:catch err} - <Error error={err} pretty="Failed to load cast!" /> - {/await} - - <SimilarContent type="tv" similar={show.similar} /> - - {#if wListItem} - <Activity wListId={wListItem.id} activity={wListItem.activity} /> - {/if} - {#if data?.tvId} - <SeasonsList tvId={data.tvId} seasons={show.seasons} watchedItem={wListItem} /> - {/if} - </div> - </div> + <div> + <div class="content"> + {#if show?.backdrop_path} + <img + class="backdrop" + src={"https://www.themoviedb.org/t/p/w1920_and_h800_multi_faces" + + show.backdrop_path} + alt="" + /> + {/if} + <div class="vignette"></div> + + <div class="details-container"> + <img + class="poster" + src={"https://image.tmdb.org/t/p/w500" + show.poster_path} + alt="" + /> + + <div class="details"> + <Title + title={show.name} + homepage={show.homepage} + releaseYear={new Date( + Date.parse(show.first_air_date), + ).getFullYear()} + voteAverage={show.vote_average} + voteCount={show.vote_count} + /> + + <span class="quick-info"> + {#if show?.episode_run_time?.length > 0} + <span>{show.episode_run_time.join(",")} min</span> + {/if} + + <div> + {#each show.genres as g, i} + <span>{g.name}{i !== show.genres.length - 1 ? ", " : ""}</span> + {/each} + </div> + </span> + + <span style="font-weight: bold; font-size: 14px;">Overview</span> + <p>{show.overview}</p> + + <div class="btns"> + {#if trailer} + <button onclick={() => (trailerShown = !trailerShown)} + >View Trailer</button + > + {#if trailerShown} + <VideoEmbedModal + embed={trailer} + closed={() => (trailerShown = false)} + /> + {/if} + {/if} + {#if jellyfinUrl} + <a class="btn" href={jellyfinUrl} target="_blank"> + {#if localStorage.getItem("useEmby")} + <Icon i="emby" wh={14} />Play On Emby + {:else} + <Icon i="jellyfin" wh={14} />Play On Jellyfin + {/if} + </a> + {/if} + {#if store.serverFeatures?.sonarr && data.tvId} + <ArrRequestButton + type="tv" + tmdbId={data.tvId} + openRequestModal={() => + (requestModalShown = !requestModalShown)} + bind:this={arrRequestButtonComp} + /> + {/if} + {#if wListItem} + <div class="other-side"> + <AddToTagButton watchedItem={wListItem} /> + <button + onclick={() => { + if (wListItem?.pinned) { + contentChanged(undefined, undefined, undefined, false); + } else { + contentChanged(undefined, undefined, undefined, true); + } + }} + use:tooltip={{ + text: `${wListItem?.pinned ? "Unpin from" : "Pin to"} top of list`, + pos: "bot", + }} + > + <Icon i={wListItem?.pinned ? "unpin" : "pin"} wh={19} /> + </button> + <button + class="delete-btn" + onclick={() => + wListItem + ? removeWatched(wListItem.id) + : console.error("no wlistItem.. can't delete")} + use:tooltip={{ text: "Delete", pos: "bot" }} + > + <Icon i="trash" wh={19} /> + </button> + </div> + {/if} + </div> + + <ProvidersList providers={show["watch/providers"]} /> + </div> + </div> + </div> + + {#if requestModalShown} + <RequestShow + content={show} + onClose={(reqResp) => { + requestModalShown = false; + if (reqResp) { + arrRequestButtonComp?.setExistingRequest(reqResp); + } + }} + /> + {/if} + + <div class="page"> + <div class="review"> + <!-- <span>What did you think?</span> --> + <Rating + rating={wListItem?.rating} + onChange={(n) => contentChanged(undefined, n)} + /> + <Status + status={wListItem?.status} + onChange={(n) => contentChanged(n)} + /> + {#if wListItem} + <MyThoughts + contentTitle={show.name} + thoughts={wListItem?.thoughts} + onChange={(newThoughts) => { + return contentChanged(undefined, undefined, newThoughts); + }} + /> + {/if} + </div> + + {#if data.tvId} + <FollowedThoughts mediaType="tv" mediaId={data.tvId} /> + {/if} + + {#await getTvCredits()} + <Spinner /> + {:then credits} + {#if credits.topCrew?.length > 0} + <div class="creators"> + {#each credits.topCrew as crew} + <div> + <span>{crew.name}</span> + <span>{crew.job}</span> + </div> + {/each} + </div> + {/if} + + {#if credits.cast?.length > 0} + <HorizontalList title="Cast"> + {#each credits.cast?.slice(0, 50) as cast} + <PersonPoster + id={cast.id} + name={cast.name} + path={cast.profile_path} + role={cast.character} + zoomOnHover={false} + /> + {/each} + </HorizontalList> + {/if} + {:catch err} + <Error error={err} pretty="Failed to load cast!" /> + {/await} + + <SimilarContent type="tv" similar={show.similar} /> + + {#if wListItem} + <Activity wListId={wListItem.id} activity={wListItem.activity} /> + {/if} + {#if data?.tvId} + <SeasonsList + tvId={data.tvId} + seasons={show.seasons} + watchedItem={wListItem} + /> + {/if} + </div> + </div> {:else} - Show not found + Show not found {/if} <style lang="scss"> - .content { - position: relative; - color: white; - - img.provider { - width: 45px; - height: 45px; - box-shadow: 0px 0px 8px -4px #9c8080; - border-radius: 50px; - } - - img.backdrop { - position: absolute; - left: 0; - top: 0; - z-index: -2; - width: 100%; - height: 100%; - object-fit: cover; - filter: $backdrop-filter; - mix-blend-mode: $backdrop-mix-blend-mode; - mask-image: $backdrop-mask-image; - } - - .vignette { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba($color: #000000, $alpha: 0.7); - z-index: -1; - mask-image: $backdrop-mask-image; - } - - .details-container { - display: flex; - flex-flow: row; - gap: 35px; - max-width: 1100px; - padding: 40px 80px; - margin-left: auto; - margin-right: auto; - - img.poster { - width: 235px; - height: 100%; - box-shadow: 0px 0px 14px -4px #9c8080; - border-radius: 12px; - } - - .details { - display: flex; - flex-flow: column; - gap: 5px; - - .quick-info { - display: flex; - gap: 10px; - margin-bottom: 8px; - } - - p { - font-size: 14px; - margin-bottom: 18px; - } - - .btns { - display: flex; - flex-flow: row; - flex-wrap: wrap; - gap: 8px; - margin-top: auto; - - a.btn, - button { - max-width: fit-content; - overflow: hidden; - animation: 50ms cubic-bezier(0.86, 0, 0.07, 1) forwards otherbtn; - white-space: nowrap; - gap: 6px; - justify-content: flex-start; - font-size: 14px; - - @keyframes otherbtn { - from { - width: 0px; - } - to { - width: 100%; - } - } - } - - .other-side { - display: flex; - flex-flow: row; - gap: 8px; - - @media screen and (min-width: 900px) { - margin-left: auto; - } - } - - .delete-btn { - &:hover { - color: $error; - } - } - } - } - - @media screen and (max-width: 700px) { - padding: 40px; - } - - @media screen and (max-width: 590px) { - flex-flow: column; - align-items: center; - } - } - } - - .page { - display: flex; - flex-flow: column; - align-items: center; - margin-left: auto; - margin-right: auto; - gap: 30px; - padding: 20px 50px; - max-width: 1200px; - - @media screen and (max-width: 500px) { - padding: 20px; - } - } - - .review { - display: flex; - flex-flow: column; - gap: 10px; - width: 100%; - max-width: 380px; - - @media screen and (max-width: 420px) { - max-width: 340px; - } - } - - .creators { - display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 35px; - margin: 10px 60px; - - div { - display: flex; - flex-flow: column; - min-width: 150px; - - span:first-child { - font-weight: bold; - } - } - } + .content { + position: relative; + color: white; + + img.provider { + width: 45px; + height: 45px; + box-shadow: 0px 0px 8px -4px #9c8080; + border-radius: 50px; + } + + img.backdrop { + position: absolute; + left: 0; + top: 0; + z-index: -2; + width: 100%; + height: 100%; + object-fit: cover; + filter: $backdrop-filter; + mix-blend-mode: $backdrop-mix-blend-mode; + mask-image: $backdrop-mask-image; + } + + .vignette { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba($color: #000000, $alpha: 0.7); + z-index: -1; + mask-image: $backdrop-mask-image; + } + + .details-container { + display: flex; + flex-flow: row; + gap: 35px; + max-width: 1100px; + padding: 40px 80px; + margin-left: auto; + margin-right: auto; + + img.poster { + width: 235px; + height: 100%; + box-shadow: 0px 0px 14px -4px #9c8080; + border-radius: 12px; + } + + .details { + display: flex; + flex-flow: column; + gap: 5px; + + .quick-info { + display: flex; + gap: 10px; + margin-bottom: 8px; + } + + p { + font-size: 14px; + margin-bottom: 18px; + } + + .btns { + display: flex; + flex-flow: row; + flex-wrap: wrap; + gap: 8px; + margin-top: auto; + + a.btn, + button { + max-width: fit-content; + overflow: hidden; + animation: 50ms cubic-bezier(0.86, 0, 0.07, 1) forwards otherbtn; + white-space: nowrap; + gap: 6px; + justify-content: flex-start; + font-size: 14px; + + @keyframes otherbtn { + from { + width: 0px; + } + to { + width: 100%; + } + } + } + + .other-side { + display: flex; + flex-flow: row; + gap: 8px; + + @media screen and (min-width: 900px) { + margin-left: auto; + } + } + + .delete-btn { + &:hover { + color: $error; + } + } + } + } + + @media screen and (max-width: 700px) { + padding: 40px; + } + + @media screen and (max-width: 590px) { + flex-flow: column; + align-items: center; + } + } + } + + .page { + display: flex; + flex-flow: column; + align-items: center; + margin-left: auto; + margin-right: auto; + gap: 30px; + padding: 20px 50px; + max-width: 1200px; + + @media screen and (max-width: 500px) { + padding: 20px; + } + } + + .review { + display: flex; + flex-flow: column; + gap: 10px; + width: 100%; + max-width: 380px; + + @media screen and (max-width: 420px) { + max-width: 340px; + } + } + + .creators { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 35px; + margin: 10px 60px; + + div { + display: flex; + flex-flow: column; + min-width: 150px; + + span:first-child { + font-weight: bold; + } + } + } </style> diff --git a/src/routes/(app)/tv/[id]/+page.ts b/src/routes/(app)/tv/[id]/+page.ts index 32218ad5..a8606fce 100644 --- a/src/routes/(app)/tv/[id]/+page.ts +++ b/src/routes/(app)/tv/[id]/+page.ts @@ -2,14 +2,14 @@ import { error } from "@sveltejs/kit"; import type { PageLoad } from "../../search/[query]/$types"; export const load = (async ({ params }) => { - const { id } = params; + const { id } = params; - if (!id) { - error(400); - return; - } + if (!id) { + error(400); + return; + } - return { - tvId: Number(id) - }; + return { + tvId: Number(id), + }; }) satisfies PageLoad; diff --git a/src/routes/(plain)/+layout.svelte b/src/routes/(plain)/+layout.svelte index 0a0c7262..01afc814 100644 --- a/src/routes/(plain)/+layout.svelte +++ b/src/routes/(plain)/+layout.svelte @@ -1,25 +1,30 @@ +<script lang="ts"> + interface Props { + children?: import("svelte").Snippet; + } + + let { children }: Props = $props(); +</script> + <nav> - <a href="/"><h1>Watcharr</h1></a> + <h1>Watcharr</h1> </nav> -<slot /> +{@render children?.()} <style lang="scss"> - nav { - display: flex; - align-items: center; - justify-content: space-between; - margin: 10px 20px 28px 20px; - position: relative; - - a { - text-decoration: none; - } + nav { + display: flex; + align-items: center; + justify-content: space-between; + margin: 10px 20px 28px 20px; + position: relative; - h1 { - color: white; - -webkit-text-stroke: 1.5px black; - font-size: 35px; - } - } + h1 { + color: white; + -webkit-text-stroke: 1.5px black; + font-size: 35px; + user-select: none; + } + } </style> diff --git a/src/routes/(plain)/login/+page.svelte b/src/routes/(plain)/login/+page.svelte index 52df7b88..20a2d05e 100644 --- a/src/routes/(plain)/login/+page.svelte +++ b/src/routes/(plain)/login/+page.svelte @@ -1,338 +1,347 @@ <script lang="ts"> - import { goto } from "$app/navigation"; - import { page } from "$app/stores"; - import Icon from "@/lib/Icon.svelte"; - import { UserType, type Icon as Icons, type AvailableAuthProviders } from "@/types"; - import { noAuthAxios } from "@/lib/util/api"; - import { onMount, afterUpdate } from "svelte"; - import { notify, unNotify } from "@/lib/util/notify"; + import { goto } from "$app/navigation"; + import { page } from "$app/state"; + import Icon from "@/lib/Icon.svelte"; + import { type AvailableAuthProviders } from "@/types"; + import { noAuthAxios } from "@/lib/util/api"; + import { onMount } from "svelte"; + import { notify, unNotify } from "@/lib/util/notify"; - let error: string; - let login = true; - let availableProviders: string[] = []; - let apHeader = false; - let apPlex = false; - let signupEnabled = true; - let useEmby = false; - let noAuto = false; + let error: string | undefined = $state(); + let login = $state(true); + let availableProviders: string[] = $state([]); + let apHeader = $state(false); + let apPlex = $state(false); + let signupEnabled = $state(true); + let useEmby = $state(false); + let noAuto = $state(false); - onMount(() => { - if (localStorage.getItem("token")) { - goto("/"); - } + onMount(() => { + if (localStorage.getItem("token")) { + goto("/"); + } - noAuthAxios.get<AvailableAuthProviders>("/auth/available").then((r) => { - if (r?.data) { - if (r.data.isInSetup) { - console.log("Server is in setup.. navigating to web setup page."); - goto("/setup"); - } - availableProviders = r.data.available; - apHeader = availableProviders?.includes("header"); - apPlex = availableProviders?.includes("plex"); - signupEnabled = r.data.signupEnabled; - useEmby = r.data.useEmby; - if (r.data.headerAuthAutoLogin && !noAuto) { - console.log("handling headerAuthAutoLogin.. calling proxyLogin automatically now."); - proxyLogin(true); - } - } - }); - }); + if (!error && page.url.searchParams.get("again")) { + error = "Please Login Again"; + } + if (page.url.searchParams.get("noAuto") == "1") { + console.info( + "login: Found noAuto param.. auto logins should be disabled now.", + ); + noAuto = true; + } - afterUpdate(() => { - if (!error && $page.url.searchParams.get("again")) { - error = "Please Login Again"; - } - if ($page.url.searchParams.get("noAuto") == "1") { - console.info("login: Found noAuto param.. auto logins should be disabled now."); - noAuto = true; - } - }); + noAuthAxios.get<AvailableAuthProviders>("/auth/available").then((r) => { + if (r?.data) { + if (r.data.isInSetup) { + console.log("Server is in setup.. navigating to web setup page."); + goto("/setup"); + } + availableProviders = r.data.available; + apHeader = availableProviders?.includes("header"); + apPlex = availableProviders?.includes("plex"); + signupEnabled = r.data.signupEnabled; + useEmby = r.data.useEmby; + if (r.data.headerAuthAutoLogin && !noAuto) { + console.log( + "handling headerAuthAutoLogin.. calling proxyLogin automatically now.", + ); + proxyLogin(true); + } + } + }); + }); - function handleLogin(ev: SubmitEvent) { - const fd = new FormData(ev.target! as HTMLFormElement); - const user = fd.get("username"); - const pass = fd.get("password"); + function handleLogin(ev: SubmitEvent) { + ev.preventDefault(); + const fd = new FormData(ev.target! as HTMLFormElement); + const user = fd.get("username"); + const pass = fd.get("password"); - if (!user || !pass) { - error = "Username and Password fields are required"; - return; - } + if (!user || !pass) { + error = "Username and Password fields are required"; + return; + } - let customAuthEP = ""; - if ((ev.submitter as HTMLButtonElement)?.name === "jellyfin") { - customAuthEP = "jellyfin"; - } + let customAuthEP = ""; + if ((ev.submitter as HTMLButtonElement)?.name === "jellyfin") { + customAuthEP = "jellyfin"; + } - const nid = notify({ text: "Logging in", type: "loading" }); - noAuthAxios - .post(`/auth${login ? `/${customAuthEP}` : "/register"}`, { - username: user, - password: pass - }) - .then((resp) => { - if (resp.data?.token) { - console.log("Received token... logging in."); - localStorage.setItem("token", resp.data.token); - if (useEmby) { - localStorage.setItem("useEmby", "1"); - } else { - localStorage.removeItem("useEmby"); - } - goto("/"); - notify({ id: nid, text: `Welcome ${user}!`, type: "success" }); - } - }) - .catch((err) => { - if (err.response) { - error = err.response.data.error; - } else { - error = err.message; - } - unNotify(nid); - }); - } + const nid = notify({ text: "Logging in", type: "loading" }); + noAuthAxios + .post(`/auth${login ? `/${customAuthEP}` : "/register"}`, { + username: user, + password: pass, + }) + .then((resp) => { + if (resp.data?.token) { + console.log("Received token... logging in."); + localStorage.setItem("token", resp.data.token); + if (useEmby) { + localStorage.setItem("useEmby", "1"); + } else { + localStorage.removeItem("useEmby"); + } + goto("/"); + notify({ id: nid, text: `Welcome ${user}!`, type: "success" }); + } + }) + .catch((err) => { + if (err.response) { + error = err.response.data.error; + } else { + error = err.message; + } + unNotify(nid); + }); + } - async function plexLogin() { - try { - const { preparePlexAuth, doPlexLogin, plexPinPoll } = await import("@/lib/util/plex"); - const p = preparePlexAuth(); - const pin = await doPlexLogin(p); - plexPinPoll(pin, p, (err, token) => { - if (err) { - error = "Plex Auth Failed"; - console.error("Plex auth failed!", err); - return; - } - const nid = notify({ text: "Logging in", type: "loading" }); - noAuthAxios - .post("/auth/plex", { - token, - clientIdentifier: p.clientId - }) - .then((resp) => { - if (resp.data?.token) { - console.log("Received token... logging in."); - localStorage.setItem("token", resp.data.token); - goto("/"); - notify({ id: nid, text: `Welcome!`, type: "success" }); - } - }) - .catch((err) => { - console.error("plexLogin: Fail", err); - if (err.response) { - error = err.response.data.error; - } else { - error = err.message; - } - notify({ id: nid, text: `Failed!`, type: "error" }); - }); - }); - } catch (err) { - console.error("plexLogin: failed!", err); - error = "Plex login failed"; - } - } + async function plexLogin() { + try { + const { preparePlexAuth, doPlexLogin, plexPinPoll } = await import( + "@/lib/util/plex" + ); + const p = preparePlexAuth(); + const pin = await doPlexLogin(p); + plexPinPoll(pin, p, (err, token) => { + if (err) { + error = "Plex Auth Failed"; + console.error("Plex auth failed!", err); + return; + } + const nid = notify({ text: "Logging in", type: "loading" }); + noAuthAxios + .post("/auth/plex", { + token, + clientIdentifier: p.clientId, + }) + .then((resp) => { + if (resp.data?.token) { + console.log("Received token... logging in."); + localStorage.setItem("token", resp.data.token); + goto("/"); + notify({ id: nid, text: `Welcome!`, type: "success" }); + } + }) + .catch((err) => { + console.error("plexLogin: Fail", err); + if (err.response) { + error = err.response.data.error; + } else { + error = err.message; + } + notify({ id: nid, text: `Failed!`, type: "error" }); + }); + }); + } catch (err) { + console.error("plexLogin: failed!", err); + error = "Plex login failed"; + } + } - function proxyLogin(auto = false) { - const nid = notify({ text: "Logging in", type: "loading" }); - noAuthAxios - .post(`/auth/proxy`) - .then((resp) => { - if (resp.data?.token) { - console.log("Received token... logging in."); - localStorage.setItem("token", resp.data.token); - goto("/"); - notify({ id: nid, text: `Welcome!`, type: "success" }); - } - }) - .catch((err) => { - if (err.response) { - error = err.response.data.error; - } else { - error = err.message; - } - if (auto) { - notify({ id: nid, text: `Automatic SSO Login Failed!`, type: "error" }); - } else { - unNotify(nid); - } - }); - } + function proxyLogin(auto = false) { + const nid = notify({ text: "Logging in", type: "loading" }); + noAuthAxios + .post(`/auth/proxy`) + .then((resp) => { + if (resp.data?.token) { + console.log("Received token... logging in."); + localStorage.setItem("token", resp.data.token); + goto("/"); + notify({ id: nid, text: `Welcome!`, type: "success" }); + } + }) + .catch((err) => { + if (err.response) { + error = err.response.data.error; + } else { + error = err.message; + } + if (auto) { + notify({ + id: nid, + text: `Automatic SSO Login Failed!`, + type: "error", + }); + } else { + unNotify(nid); + } + }); + } </script> <div> - <div class="inner"> - <h2> - {#if login} - Get Back In! - {:else} - Lucky You Found Us! - {/if} - </h2> + <div class="inner"> + <h2> + {#if login} + Get Back In! + {:else} + Lucky You Found Us! + {/if} + </h2> - {#if error} - <span class="error">{error}!</span> - {/if} + {#if error} + <span class="error">{error}!</span> + {/if} - <form on:submit|preventDefault={handleLogin}> - <label for="username">Username</label> - <input type="text" name="username" placeholder="Username" /> + <form onsubmit={handleLogin}> + <label for="username">Username</label> + <input type="text" name="username" placeholder="Username" /> - <label for="password">Password</label> - <input type="password" name="password" placeholder="Password" /> + <label for="password">Password</label> + <input type="password" name="password" placeholder="Password" /> - {#if login} - <span class="login-with" style="font-weight: bold">Login With</span> - <div class="login-btns"> - <button type="submit"><span class="watcharr">W</span>Watcharr</button> - {#if availableProviders?.length > 0} - {#if availableProviders.find((ap) => ap === "jellyfin")} - {#if useEmby} - <button type="submit" name="jellyfin" class="other"> - <Icon i="emby" wh={18} /> - emby - </button> - {:else} - <button type="submit" name="jellyfin" class="other"> - <Icon i="jellyfin" wh={18} /> - jellyfin - </button> - {/if} - {/if} - {/if} - </div> - {#if apHeader || apPlex} - <p style="font-weight: bold; font-size: 14px;">or</p> - {#if apHeader} - <div class="login-btns"> - <button - type="button" - name="proxy" - class="proxy other" - on:click={() => { - proxyLogin(); - }} - > - <Icon i="lock-closed" wh={18} />Continue with Single Sign-On - </button> - </div> - {/if} - {#if apPlex} - <div class="login-btns"> - <button - type="button" - on:click={() => { - plexLogin(); - }} - name="plex" - class="plex other" - > - <Icon i="plex" wh={18} />Continue with Plex - </button> - </div> - {/if} - {/if} - {:else} - <div class="login-btns"> - <button type="submit">Sign Up</button> - </div> - {/if} - </form> + {#if login} + <span class="login-with" style="font-weight: bold">Login With</span> + <div class="login-btns"> + <button type="submit"><span class="watcharr">W</span>Watcharr</button> + {#if availableProviders?.length > 0} + {#if availableProviders.find((ap) => ap === "jellyfin")} + {#if useEmby} + <button type="submit" name="jellyfin" class="other"> + <Icon i="emby" wh={18} /> + emby + </button> + {:else} + <button type="submit" name="jellyfin" class="other"> + <Icon i="jellyfin" wh={18} /> + jellyfin + </button> + {/if} + {/if} + {/if} + </div> + {#if apHeader || apPlex} + <p style="font-weight: bold; font-size: 14px;">or</p> + {#if apHeader} + <div class="login-btns"> + <button + type="button" + name="proxy" + class="proxy other" + onclick={() => { + proxyLogin(); + }} + > + <Icon i="lock-closed" wh={18} />Continue with Single Sign-On + </button> + </div> + {/if} + {#if apPlex} + <div class="login-btns"> + <button + type="button" + onclick={() => { + plexLogin(); + }} + name="plex" + class="plex other" + > + <Icon i="plex" wh={18} />Continue with Plex + </button> + </div> + {/if} + {/if} + {:else} + <div class="login-btns"> + <button type="submit">Sign Up</button> + </div> + {/if} + </form> - {#if signupEnabled} - <button - class="plain" - on:click={() => { - login = !login; - }} - > - {#if login} - Not a user? - {:else} - Already a user? - {/if} - </button> - {/if} - </div> + {#if signupEnabled} + <button + class="plain" + onclick={() => { + login = !login; + }} + > + {#if login} + Not a user? + {:else} + Already a user? + {/if} + </button> + {/if} + </div> </div> <style lang="scss"> - div, - form { - display: flex; - flex-flow: column; - align-items: center; - gap: 10px; - margin: 0 35px; - } + div, + form { + display: flex; + flex-flow: column; + align-items: center; + gap: 10px; + margin: 0 35px; + } - .inner, - form { - width: 100%; - max-width: 400px; - } + .inner, + form { + width: 100%; + max-width: 400px; + } - .inner h2 { - font-weight: normal; - } + .inner h2 { + font-weight: normal; + } - label { - align-self: flex-start; - font-weight: bold; - } + label { + align-self: flex-start; + font-weight: bold; + } - span.login-with { - font-size: 14px; - } + span.login-with { + font-size: 14px; + } - .login-btns { - display: flex; - flex-flow: row; - gap: 10px; - width: 100%; + .login-btns { + display: flex; + flex-flow: row; + gap: 10px; + width: 100%; - /* Hardcoded point for when main watcharr/jellyfin btns break. */ - @media screen and (max-width: 320px) { - flex-wrap: wrap; - } + /* Hardcoded point for when main watcharr/jellyfin btns break. */ + @media screen and (max-width: 320px) { + flex-wrap: wrap; + } - button { - display: flex; - flex-flow: row; - gap: 10px; - text-transform: capitalize; + button { + display: flex; + flex-flow: row; + gap: 10px; + text-transform: capitalize; - .watcharr { - font-family: "Rampart One"; - font-size: 19px; - line-height: 19px; - } + .watcharr { + font-family: "Rampart One"; + font-size: 19px; + line-height: 19px; + } - &.other { - overflow: hidden; - animation: 250ms ease otherbtn; + &.other { + overflow: hidden; + animation: 250ms ease otherbtn; - @keyframes otherbtn { - from { - width: 0px; - } - to { - width: 100%; - } - } - } - } - } + @keyframes otherbtn { + from { + width: 0px; + } + to { + width: 100%; + } + } + } + } + } - .error { - display: flex; - justify-content: center; - width: 100%; - padding: 10px; - background-color: rgb(221, 48, 48); - text-transform: capitalize; - color: white; - } + .error { + display: flex; + justify-content: center; + width: 100%; + padding: 10px; + background-color: rgb(221, 48, 48); + text-transform: capitalize; + color: white; + } </style> diff --git a/src/routes/(plain)/setup/+page.svelte b/src/routes/(plain)/setup/+page.svelte index 32446e15..4fd49180 100644 --- a/src/routes/(plain)/setup/+page.svelte +++ b/src/routes/(plain)/setup/+page.svelte @@ -1,150 +1,152 @@ <script lang="ts"> - import { goto } from "$app/navigation"; - import type { AvailableAuthProviders } from "@/types"; - import { noAuthAxios } from "@/lib/util/api"; - import { onMount } from "svelte"; - import { notify, unNotify } from "@/lib/util/notify"; - - let error: string; - - onMount(() => { - if (localStorage.getItem("token")) { - goto("/"); - } - - noAuthAxios.get<AvailableAuthProviders>("/auth/available").then((r) => { - if (r?.data) { - if (!r?.data?.isInSetup) { - console.log("Server not in setup.. navigating to login page."); - goto("/login"); - } - } - }); - }); - - function handleLogin(ev: SubmitEvent) { - const fd = new FormData(ev.target! as HTMLFormElement); - const user = fd.get("username"); - const pass = fd.get("password"); - - if (!user || !pass) { - error = "Username and Password fields are required"; - return; - } - - const nid = notify({ text: "Setting Up Admin User", type: "loading" }); - noAuthAxios - .post("/setup/create_admin", { - username: user, - password: pass - }) - .then((resp) => { - if (resp.data?.token) { - console.log("Received token... logging in."); - localStorage.setItem("token", resp.data.token); - goto("/"); - notify({ id: nid, text: `Welcome ${user}!`, type: "success" }); - } - }) - .catch((err) => { - if (err.response) { - error = err.response.data.error; - } else { - error = err.message; - } - unNotify(nid); - }); - } + import { preventDefault } from "svelte/legacy"; + + import { goto } from "$app/navigation"; + import type { AvailableAuthProviders } from "@/types"; + import { noAuthAxios } from "@/lib/util/api"; + import { onMount } from "svelte"; + import { notify, unNotify } from "@/lib/util/notify"; + + let error: string = $state(); + + onMount(() => { + if (localStorage.getItem("token")) { + goto("/"); + } + + noAuthAxios.get<AvailableAuthProviders>("/auth/available").then((r) => { + if (r?.data) { + if (!r?.data?.isInSetup) { + console.log("Server not in setup.. navigating to login page."); + goto("/login"); + } + } + }); + }); + + function handleLogin(ev: SubmitEvent) { + const fd = new FormData(ev.target! as HTMLFormElement); + const user = fd.get("username"); + const pass = fd.get("password"); + + if (!user || !pass) { + error = "Username and Password fields are required"; + return; + } + + const nid = notify({ text: "Setting Up Admin User", type: "loading" }); + noAuthAxios + .post("/setup/create_admin", { + username: user, + password: pass, + }) + .then((resp) => { + if (resp.data?.token) { + console.log("Received token... logging in."); + localStorage.setItem("token", resp.data.token); + goto("/"); + notify({ id: nid, text: `Welcome ${user}!`, type: "success" }); + } + }) + .catch((err) => { + if (err.response) { + error = err.response.data.error; + } else { + error = err.message; + } + unNotify(nid); + }); + } </script> <svelte:head> - <title>Setup Watcharr + Setup Watcharr
    -
    -
    -

    Setup Admin User

    -
    Welcome to Watcharr! Setup your admin acount below.
    -
    - - {#if error} - {error}! - {/if} - -
    - - - - - - - -
    -
    +
    +
    +

    Setup Admin User

    +
    Welcome to Watcharr! Setup your admin acount below.
    +
    + + {#if error} + {error}! + {/if} + +
    + + + + + + + +
    +
    diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index 165fad18..a5203628 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -1,54 +1,54 @@
    -
    -

    {page.status}

    - {#if page.status === 404} -

    This page could not be found

    - {:else if page.status === 500} -

    The server broke, try refreshing

    - {:else if page?.error?.message} -

    {page.error.message}

    - {:else} -

    We couldn't load this page

    - {/if} -
    - - -
    -
    +
    +

    {page.status}

    + {#if page.status === 404} +

    This page could not be found

    + {:else if page.status === 500} +

    The server broke, try refreshing

    + {:else if page?.error?.message} +

    {page.error.message}

    + {:else} +

    We couldn't load this page

    + {/if} +
    + + +
    +
    diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index dba91205..d7609c31 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,61 +1,61 @@ - - {#if pwaInfo?.webManifest?.linkTag} - - {@html pwaInfo.webManifest.linkTag} - {/if} + {#if pwaInfo?.webManifest?.linkTag} + + {@html pwaInfo.webManifest.linkTag} + {/if} -
    +
    - {#each notifs as n} -
    - {#if n.type === "loading"} - - {/if} - - - {@html n.text} - -
    - {/each} + {#each store.notifications as n} +
    + {#if n.type === "loading"} + + {/if} + + + {@html n.text} + +
    + {/each}
    - + +{@render children?.()} diff --git a/src/store.svelte.ts b/src/store.svelte.ts new file mode 100644 index 00000000..bc7ce842 --- /dev/null +++ b/src/store.svelte.ts @@ -0,0 +1,268 @@ +import type { + Filters, + Follow, + ImportedList, + PrivateUser, + ServerFeatures, + Tag, + Theme, + UserSettings, + WLDetailedViewOption, + Watched, +} from "./types"; +import type { Notification } from "./lib/util/notify"; +import { browser } from "$app/environment"; +import { toggleTheme } from "./lib/util/helpers"; + +export const defaultSort = ["DATEADDED", "DOWN"]; + +interface Store { + userInfo: PrivateUser | undefined; + userSettings: UserSettings | undefined; + watchedList: Watched[]; + notifications: Notification[]; + activeSort: string[]; + activeFilters: Filters; + appTheme: Theme; + importedList: + | { + data: string; + type: + | "text-list" + | "tmdb" + | "movary" + | "watcharr" + | "myanimelist" + | "ryot" + | "todomovies" + | "imdb"; + } + | undefined; + parsedImportedList: ImportedList[] | undefined; + searchQuery: string; + serverFeatures: ServerFeatures | undefined; + follows: Follow[]; + wlDetailedView: WLDetailedViewOption[]; + tags: Tag[]; +} + +/** + * This is our actual (private) store. + */ +const _store: Store = $state({ + watchedList: [], + notifications: [], + activeSort: defaultSort, + activeFilters: { type: [], status: [] }, + appTheme: "light", + importedList: undefined, + parsedImportedList: undefined, + searchQuery: "", + userInfo: undefined, + userSettings: undefined, + serverFeatures: undefined, + follows: [], + wlDetailedView: [], + tags: [], +}); + +/** + * Expose store to app through getters/setters + * to control what can and can't be accessed. + * With setters we can easily and more reliably + * save certain properties to localStorage when + * they are updated. + */ +export const store = { + get watchedList() { + return _store.watchedList; + }, + set watchedList(w) { + _store.watchedList = w; + }, + get notifications() { + return _store.notifications; + }, + set notifications(v) { + _store.notifications = v; + }, + get activeSort() { + return _store.activeSort; + }, + set activeSort(v) { + _store.activeSort = v; + localStorage.setItem("activeFilter", JSON.stringify(v)); + console.debug("Store: Saved activeSort:", v); + }, + get activeFilters() { + return _store.activeFilters; + }, + set activeFilters(v) { + _store.activeFilters = v; + localStorage.setItem("activeFilterReal", JSON.stringify(v)); + console.debug("Store: Saved activeFilters:", v); + }, + get appTheme() { + return _store.appTheme; + }, + /** + * Only set appTheme through toggleTheme() helper. + */ + set appTheme(v) { + _store.appTheme = v; + localStorage.setItem("theme", v); + console.debug("Store: Saved appTheme:", v); + }, + get importedList() { + return _store.importedList; + }, + set importedList(v) { + _store.importedList = v; + }, + get parsedImportedList() { + return _store.parsedImportedList; + }, + set parsedImportedList(v) { + _store.parsedImportedList = v; + }, + get searchQuery() { + return _store.searchQuery; + }, + set searchQuery(v) { + _store.searchQuery = v; + }, + get userInfo() { + return _store.userInfo; + }, + set userInfo(v) { + _store.userInfo = v; + }, + get userSettings() { + return _store.userSettings; + }, + set userSettings(v) { + _store.userSettings = v; + }, + get serverFeatures() { + return _store.serverFeatures; + }, + set serverFeatures(v) { + _store.serverFeatures = v; + }, + get follows() { + return _store.follows; + }, + set follows(v) { + _store.follows = v; + }, + get wlDetailedView() { + return _store.wlDetailedView; + }, + set wlDetailedView(v) { + _store.wlDetailedView = v; + if (v) { + localStorage.setItem( + "wlDetailedView", + JSON.stringify(store.wlDetailedView), + ); + console.debug("Store: Saved wlDetailedView:", v); + } else { + localStorage.removeItem("wlDetailedView"); + console.debug("Store: Removed wlDetailedView"); + } + }, + get tags() { + return _store.tags; + }, + set tags(v) { + _store.tags = v; + }, +}; + +/** + * Reset everything in `store` back to default values. + */ +export const clearAllStores = () => { + store.watchedList = []; + store.notifications = []; + store.activeSort = defaultSort; + store.appTheme = "light"; + store.importedList = undefined; + store.parsedImportedList = undefined; + store.searchQuery = ""; + store.userInfo = undefined; + store.userSettings = undefined; + store.serverFeatures = undefined; + store.follows = []; + store.wlDetailedView = []; + store.tags = []; + clearActiveFilters(); +}; + +export const clearActiveFilters = () => { + store.activeFilters = { type: [], status: [] }; +}; + +if (browser) { + rehydrateStore(); +} + +/** + * Restore state from localStorage and apply values into + * our `store`. + * Rehydrates directly into `_store` (the real store) + * to avoid the setters that would trigger a save right + * after rehydrate. + */ +function rehydrateStore() { + console.info("rehydrateStore: Running.."); + // Restore activeSort + const raf = localStorage.getItem("activeFilter"); + if (raf) { + _store.activeSort = JSON.parse(raf); + console.debug( + "rehydrateStore: Restored activeSort:", + $state.snapshot(store.activeSort), + ); + } + // Restore activeFilters + const filters = localStorage.getItem("activeFilterReal"); + if (filters) { + _store.activeFilters = JSON.parse(filters); + console.debug( + "rehydrateStore: Restored activeFilters:", + $state.snapshot(store.activeFilters), + ); + } + // Restore appTheme + const theme = localStorage.getItem("theme") as Theme; + if (theme) { + _store.appTheme = theme; + toggleTheme(theme, false); + console.debug( + "rehydrateStore: Restored appTheme:", + $state.snapshot(store.appTheme), + ); + } else { + let defTheme: Theme = "light"; + if (window.matchMedia("(prefers-color-scheme: dark)").matches) { + defTheme = "dark"; + } + _store.appTheme = defTheme; + toggleTheme(defTheme, false); + console.debug( + "rehydrateStore: appTheme hydrated from system default (wont save):", + defTheme, + ); + } + // Restore wlDetailedView + const wlDetailedViewR = localStorage.getItem("wlDetailedView"); + if (wlDetailedViewR) { + _store.wlDetailedView = JSON.parse(wlDetailedViewR); + console.debug( + "rehydrateStore: Restored wlDetailedView:", + $state.snapshot(store.wlDetailedView), + ); + } + console.info("rehydrateStore: Done."); +} diff --git a/src/store.ts b/src/store.ts deleted file mode 100644 index 9cdabff9..00000000 --- a/src/store.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { writable } from "svelte/store"; -import type { - Filters, - Follow, - ImportedList, - PrivateUser, - ServerFeatures, - Tag, - Theme, - UserSettings, - WLDetailedViewOption, - Watched -} from "./types"; -import type { Notification } from "./lib/util/notify"; -import { browser } from "$app/environment"; -import { toggleTheme } from "./lib/util/helpers"; - -export const defaultSort = ["DATEADDED", "DOWN"]; - -export const userInfo = writable(); -export const userSettings = writable(); -export const watchedList = writable([]); -export const notifications = writable([]); -export const activeSort = writable(defaultSort); -export const activeFilters = writable({ type: [], status: [] }); -export const appTheme = writable(); -export const importedList = writable< - | { - data: string; - type: - | "text-list" - | "tmdb" - | "movary" - | "watcharr" - | "myanimelist" - | "ryot" - | "todomovies" - | "imdb"; - } - | undefined ->(); -export const parsedImportedList = writable(); -export const searchQuery = writable(""); -export const serverFeatures = writable(); -export const follows = writable(); -export const wlDetailedView = writable([]); -export const tags = writable(); - -export const clearAllStores = () => { - watchedList.set([]); - notifications.set([]); - activeSort.set(defaultSort); - importedList.set(undefined); - parsedImportedList.set(undefined); - searchQuery.set(""); - userInfo.set(undefined); - userSettings.set(undefined); - follows.set([]); - wlDetailedView.set([]); - tags.set([]); - clearActiveFilters(); -}; - -export const clearActiveFilters = () => { - activeFilters.set({ type: [], status: [] }); -}; - -if (browser) { - // Rehydrate - const raf = localStorage.getItem("activeFilter"); - if (raf) { - activeSort.update((v) => (v = JSON.parse(raf))); - } - - const filters = localStorage.getItem("activeFilterReal"); - if (filters) { - activeFilters.update((v) => (v = JSON.parse(filters))); - } - - const theme = localStorage.getItem("theme") as Theme; - if (theme) { - appTheme.update((t) => (t = theme)); - toggleTheme(theme); - } else { - let defTheme: Theme = "light"; - if (window.matchMedia("(prefers-color-scheme: dark)").matches) { - defTheme = "dark"; - } - console.log("Theme not set, setting default theme from system theme:", defTheme); - appTheme.update((t) => (t = defTheme)); - toggleTheme(defTheme); - } - - const wlDetailedViewR = localStorage.getItem("wlDetailedView"); - if (wlDetailedViewR) { - wlDetailedView.update((v) => (v = JSON.parse(wlDetailedViewR))); - } - - // Save changes - activeSort.subscribe((v) => { - localStorage.setItem("activeFilter", JSON.stringify(v)); - }); - - activeFilters.subscribe((v) => { - localStorage.setItem("activeFilterReal", JSON.stringify(v)); - }); - - appTheme.subscribe((v) => { - localStorage.setItem("theme", v); - }); - - wlDetailedView.subscribe((v) => { - if (v) { - localStorage.setItem("wlDetailedView", JSON.stringify(v)); - } else { - localStorage.removeItem("wlDetailedView"); - } - }); -} diff --git a/src/types.ts b/src/types.ts index 476877a1..1fbbd494 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,1282 +1,1296 @@ -export type WatchedStatus = "PLANNED" | "WATCHING" | "FINISHED" | "HOLD" | "DROPPED"; +export type WatchedStatus = + | "PLANNED" + | "WATCHING" + | "FINISHED" + | "HOLD" + | "DROPPED"; export type ContentType = "tv" | "movie" | "tv_episode"; export type MediaType = ContentType | "person"; // Wasn't able to figure out how to import this type from its component file in other places, so its here for now. export type Icon = - | "check" - | "clock" - | "calendar" - | "thumb-down" - | "thumb-up" - | "play" - | "pause" - | "jellyfin" - | "emby" - | "plex" - | "trash" - | "close" - | "close-circle" - | "filter" - | "filter-circle" - | "reel" - | "compass" - | "document" - | "add" - | "arrow" - | "chevron" - | "search" - | "sort" - | "eye-closed" - | "people-nocircle" - | "people" - | "person" - | "person-add" - | "person-minus" - | "pencil" - | "eye" - | "star" - | "movary" - | "ryot" - | "trakt" - | "myanimelist" - | "todomovies" - | "themoviedb" - | "imdb" - | "refresh" - | "gamepad" - | "film" - | "tv" - | "pin" - | "unpin" - | "sparkles" - | "tag" - | "ticket" - | "lock-closed"; + | "check" + | "clock" + | "calendar" + | "thumb-down" + | "thumb-up" + | "play" + | "pause" + | "jellyfin" + | "emby" + | "plex" + | "trash" + | "close" + | "close-circle" + | "filter" + | "filter-circle" + | "reel" + | "compass" + | "document" + | "add" + | "arrow" + | "chevron" + | "search" + | "sort" + | "eye-closed" + | "people-nocircle" + | "people" + | "person" + | "person-add" + | "person-minus" + | "pencil" + | "eye" + | "star" + | "movary" + | "ryot" + | "trakt" + | "myanimelist" + | "todomovies" + | "themoviedb" + | "imdb" + | "refresh" + | "gamepad" + | "film" + | "tv" + | "pin" + | "unpin" + | "sparkles" + | "tag" + | "ticket" + | "lock-closed"; export type Theme = "light" | "dark"; -export type WLDetailedViewOption = "statusRating" | "lastWatched" | "dateAdded" | "dateModified"; +export type WLDetailedViewOption = + | "statusRating" + | "lastWatched" + | "dateAdded" + | "dateModified"; export type PosterExtraDetails = { - dateAdded?: string; - dateModified?: string; - /** - * Only for shows. - */ - lastWatched?: string; + dateAdded?: string; + dateModified?: string; + /** + * Only for shows. + */ + lastWatched?: string; }; export enum UserType { - Watcharr = 0, - Jellyfin = 1, - Plex = 2, - Proxy = 3 + Watcharr = 0, + Jellyfin = 1, + Plex = 2, + Proxy = 3, } interface dbModel { - id: number; - createdAt: string; - updatedAt: string; - deletedAt: string; + id: number; + createdAt: string; + updatedAt: string; + deletedAt: string; } export interface Content { - // id: number; // Not used - tmdbId: number; - title: string; - poster_path: string; - overview: string; - type: ContentType; - release_date: string; - first_air_date: string; + // id: number; // Not used + tmdbId: number; + title: string; + poster_path: string; + overview: string; + type: ContentType; + release_date: string; + first_air_date: string; } export interface Activity extends dbModel { - watchedId: number; - type: string; - data: string; - customDate: string; + watchedId: number; + type: string; + data: string; + customDate: string; } export interface WatchedSeason { - id: number; - watchedID: number; - status: WatchedStatus; - rating: number; - seasonNumber: number; + id: number; + watchedID: number; + status: WatchedStatus; + rating: number; + seasonNumber: number; } export interface WatchedEpisode { - id: number; - watchedID: number; - status: WatchedStatus; - rating: number; - seasonNumber: number; - episodeNumber: number; + id: number; + watchedID: number; + status: WatchedStatus; + rating: number; + seasonNumber: number; + episodeNumber: number; } export interface Watched extends dbModel { - watched: boolean; - rating?: number; - content?: Content; - game?: Game; - activity: Activity[]; - status: WatchedStatus; - thoughts: string; - pinned: boolean; - watchedSeasons?: WatchedSeason[]; - watchedEpisodes?: WatchedEpisode[]; - tags?: Tag[]; - lastViewedSeason?: number; + watched: boolean; + rating?: number; + content?: Content; + game?: Game; + activity: Activity[]; + status: WatchedStatus; + thoughts: string; + pinned: boolean; + watchedSeasons?: WatchedSeason[]; + watchedEpisodes?: WatchedEpisode[]; + tags?: Tag[]; + lastViewedSeason?: number; } export interface WatchedAddRequest { - contentId: number; - contentType: ContentType; - rating?: number; - status: WatchedStatus; + contentId: number; + contentType: ContentType; + rating?: number; + status: WatchedStatus; } export interface PlayedAddRequest { - rating?: number; - status?: WatchedStatus; - igdbId?: number; + rating?: number; + status?: WatchedStatus; + igdbId?: number; } export interface WatchedUpdateRequest { - rating?: number; - status?: WatchedStatus; - thoughts?: string; - removeThoughts?: boolean; - pinned?: boolean; + rating?: number; + status?: WatchedStatus; + thoughts?: string; + removeThoughts?: boolean; + pinned?: boolean; } export interface WatchedUpdateResponse { - newActivity: Activity; + newActivity: Activity; } export interface ActivityUpdateRequest { - customDate: string; + customDate: string; } export interface WatchedSeasonAddResponse { - watchedSeasons: WatchedSeason[]; - addedActivity: Activity; + watchedSeasons: WatchedSeason[]; + addedActivity: Activity; } export interface WatchedEpisodeAddResponse { - watchedEpisodes: WatchedEpisode[]; - addedActivity: Activity; - episodeStatusChangedHookResponse?: EpisodeStatusChangedHookResponse; + watchedEpisodes: WatchedEpisode[]; + addedActivity: Activity; + episodeStatusChangedHookResponse?: EpisodeStatusChangedHookResponse; } export interface EpisodeStatusChangedHookResponse { - newShowStatus?: WatchedStatus; - watchedSeason?: WatchedSeason; - addedActivities?: Activity[]; - errors?: string[]; + newShowStatus?: WatchedStatus; + watchedSeason?: WatchedSeason; + addedActivities?: Activity[]; + errors?: string[]; } export interface Profile { - joined: Date; - showsWatched: number; - moviesWatched: number; - moviesWatchedRuntime: number; - showsWatchedRuntime: number; + joined: Date; + showsWatched: number; + moviesWatched: number; + moviesWatchedRuntime: number; + showsWatchedRuntime: number; } export interface UserSettings { - private: boolean; - privateThoughts: boolean; - hideSpoilers: boolean; - includePreviouslyWatched: boolean; - country: string; - automateShowStatuses: boolean; - ratingSystem?: RatingSystem; - /** - * A rating step decided by the user, only - * applicable for OutOf10 and OutOf5 rating systems. - * Supported: 1, 0.5, 0.1 (must validate). - */ - ratingStep?: RatingStep; + private: boolean; + privateThoughts: boolean; + hideSpoilers: boolean; + includePreviouslyWatched: boolean; + country: string; + automateShowStatuses: boolean; + ratingSystem?: RatingSystem; + /** + * A rating step decided by the user, only + * applicable for OutOf10 and OutOf5 rating systems. + * Supported: 1, 0.5, 0.1 (must validate). + */ + ratingStep?: RatingStep; } export enum RatingSystem { - OutOf10, // default - OutOf100, - OutOf5, - Thumbs + OutOf10, // default + OutOf100, + OutOf5, + Thumbs, } export enum RatingStep { - One, // default - Point5, - Point1 + One, // default + Point5, + Point1, } export interface ChangePasswordForm { - currentPassword: string; - newPassword: string; - reEnteredNewPassword: string; + currentPassword: string; + newPassword: string; + reEnteredNewPassword: string; } // What the user search returns export interface PublicUser { - id: number; - username: string; - avatar: Image; - bio: string; + id: number; + username: string; + avatar: Image; + bio: string; } // PrivateUser - Current users info export interface PrivateUser { - username: string; - type: UserType; - permissions: UserPermission; - avatar: Image; - bio: string; + username: string; + type: UserType; + permissions: UserPermission; + avatar: Image; + bio: string; } export enum UserPermission { - PERM_NONE = 1, - PERM_ADMIN = 2, - PERM_REQUEST_CONTENT = 4, - PERM_REQUEST_CONTENT_AUTO_APPROVE = 8 + PERM_NONE = 1, + PERM_ADMIN = 2, + PERM_REQUEST_CONTENT = 4, + PERM_REQUEST_CONTENT_AUTO_APPROVE = 8, } export interface Image { - createdAt: Date; - blurHash: string; - path: string; + createdAt: Date; + blurHash: string; + path: string; } export interface JellyfinFoundContent { - hasContent: boolean; - url: string; + hasContent: boolean; + url: string; } export interface AvailableAuthProviders { - available: string[]; - signupEnabled: boolean; - isInSetup: boolean; - useEmby: boolean; - headerAuthAutoLogin: boolean; + available: string[]; + signupEnabled: boolean; + isInSetup: boolean; + useEmby: boolean; + headerAuthAutoLogin: boolean; } export interface TokenClaims { - userId: number; - username: string; - type: number; + userId: number; + username: string; + type: number; } export interface TMDBContentDetails { - id: number; - backdrop_path: string; - genres: { - id: number; - name: string; - }[]; - poster_path: string; - homepage: string; - popularity: number; - overview: string; - original_language: string; - production_companies: { - id: number; - logo_path: string; - name: string; - origin_country: string; - }[]; - production_countries: { - iso_3166_1: string; - name: string; - }[]; - status: string; - tagline: string; - vote_average: number; - vote_count: number; - spoken_languages: { - english_name: string; - iso_639_1: string; - name: string; - }[]; + id: number; + backdrop_path: string; + genres: { + id: number; + name: string; + }[]; + poster_path: string; + homepage: string; + popularity: number; + overview: string; + original_language: string; + production_companies: { + id: number; + logo_path: string; + name: string; + origin_country: string; + }[]; + production_countries: { + iso_3166_1: string; + name: string; + }[]; + status: string; + tagline: string; + vote_average: number; + vote_count: number; + spoken_languages: { + english_name: string; + iso_639_1: string; + name: string; + }[]; } export interface TMDBMovieDetails extends TMDBContentDetails { - adult: boolean; - belongs_to_collection: object; - budget: number; - imdb_id: string; - original_title: string; - release_date: string; - revenue: number; - runtime: number; - title: string; - video: boolean; - videos: TMDBContentVideos; - "watch/providers": TMDBContentWatchProviders; - similar: TMDBMovieSimilar; - external_ids: TMDBExternalIdsMovie; + adult: boolean; + belongs_to_collection: object; + budget: number; + imdb_id: string; + original_title: string; + release_date: string; + revenue: number; + runtime: number; + title: string; + video: boolean; + videos: TMDBContentVideos; + "watch/providers": TMDBContentWatchProviders; + similar: TMDBMovieSimilar; + external_ids: TMDBExternalIdsMovie; } export interface TMDBShowDetails extends TMDBContentDetails { - created_by: { - id: number; - credit_id: string; - name: string; - gender: number; - profile_path: string; - }[]; - episode_run_time: number[]; - first_air_date: string; - in_production: boolean; - languages: string[]; - last_air_date: string; - last_episode_to_air: { - air_date: string; - episode_number: number; - id: number; - name: string; - overview: string; - production_code: string; - season_number: number; - still_path: string; - vote_average: number; - vote_count: number; - }; - name: string; - next_episode_to_air: object; - networks: { - name: string; - id: number; - logo_path: string; - origin_country: string; - }[]; - number_of_episodes: number; - number_of_seasons: number; - origin_country: string[]; - original_name: string; - seasons: TMDBShowSeason[]; - type: string; - videos: TMDBContentVideos; - "watch/providers": TMDBContentWatchProviders; - similar: TMDBShowSimilar; - external_ids: TMDBExternalIdsShow; - keywords: TMDBKeywords; + created_by: { + id: number; + credit_id: string; + name: string; + gender: number; + profile_path: string; + }[]; + episode_run_time: number[]; + first_air_date: string; + in_production: boolean; + languages: string[]; + last_air_date: string; + last_episode_to_air: { + air_date: string; + episode_number: number; + id: number; + name: string; + overview: string; + production_code: string; + season_number: number; + still_path: string; + vote_average: number; + vote_count: number; + }; + name: string; + next_episode_to_air: object; + networks: { + name: string; + id: number; + logo_path: string; + origin_country: string; + }[]; + number_of_episodes: number; + number_of_seasons: number; + origin_country: string[]; + original_name: string; + seasons: TMDBShowSeason[]; + type: string; + videos: TMDBContentVideos; + "watch/providers": TMDBContentWatchProviders; + similar: TMDBShowSimilar; + external_ids: TMDBExternalIdsShow; + keywords: TMDBKeywords; } export interface TMDBWatchProvider { - logo_path: string; - provider_id: string; - provider_name: string; - display_priority: string; + logo_path: string; + provider_id: string; + provider_name: string; + display_priority: string; } export interface TMDBContentWatchProviders { - link: string; - flatrate: TMDBWatchProvider[]; - free: TMDBWatchProvider[]; + link: string; + flatrate: TMDBWatchProvider[]; + free: TMDBWatchProvider[]; } export interface TMDBContentVideos { - id: number; - results: { - iso_639_1: string; - iso_3166_1: string; - name: string; - key: string; - site: string; - size: number; - type: string; - official: boolean; - published_at: string; - id: string; - }[]; + id: number; + results: { + iso_639_1: string; + iso_3166_1: string; + name: string; + key: string; + site: string; + size: number; + type: string; + official: boolean; + published_at: string; + id: string; + }[]; } export interface TMDBShowSeason { - air_date: string; - episode_count: number; - id: number; - name: string; - overview: string; - poster_path: string; - season_number: number; + air_date: string; + episode_count: number; + id: number; + name: string; + overview: string; + poster_path: string; + season_number: number; } export interface TMDBSeasonDetails { - _id: string; - air_date: string; - episodes: TMDBSeasonDetailsEpisode[]; - name: string; - overview: string; - id: number; - poster_path: string; - season_number: number; + _id: string; + air_date: string; + episodes: TMDBSeasonDetailsEpisode[]; + name: string; + overview: string; + id: number; + poster_path: string; + season_number: number; } export interface TMDBSeasonDetailsEpisode { - air_date: string; - episode_number: number; - id: number; - name: string; - overview: string; - production_code: string; - runtime: number; - season_number: number; - show_id: number; - still_path: string; - vote_average: number; - vote_count: number; - crew: { - department: string; - job: string; - credit_id: string; - adult: boolean; - gender: number; - id: number; - known_for_department: string; - name: string; - original_name: string; - popularity: number; - profile_path: string; - }[]; - guest_stars: { - character: string; - credit_id: string; - order: number; - adult: boolean; - gender: number; - id: number; - known_for_department: string; - name: string; - original_name: string; - popularity: number; - profile_path: string; - }[]; + air_date: string; + episode_number: number; + id: number; + name: string; + overview: string; + production_code: string; + runtime: number; + season_number: number; + show_id: number; + still_path: string; + vote_average: number; + vote_count: number; + crew: { + department: string; + job: string; + credit_id: string; + adult: boolean; + gender: number; + id: number; + known_for_department: string; + name: string; + original_name: string; + popularity: number; + profile_path: string; + }[]; + guest_stars: { + character: string; + credit_id: string; + order: number; + adult: boolean; + gender: number; + id: number; + known_for_department: string; + name: string; + original_name: string; + popularity: number; + profile_path: string; + }[]; } export interface TMDBContentCredits { - id: number; - cast: { - adult: boolean; - gender: number; - id: number; - known_for_department: string; - name: string; - original_name: string; - popularity: number; - profile_path: string; - cast_id: number; - character: string; - credit_id: string; - order: number; - }[]; - crew: TMDBContentCreditsCrew[]; + id: number; + cast: { + adult: boolean; + gender: number; + id: number; + known_for_department: string; + name: string; + original_name: string; + popularity: number; + profile_path: string; + cast_id: number; + character: string; + credit_id: string; + order: number; + }[]; + crew: TMDBContentCreditsCrew[]; } export interface TMDBContentCreditsCrew { - adult: boolean; - gender: number; - id: number; - known_for_department: string; - name: string; - original_name: string; - popularity: number; - profile_path: string; - credit_id: string; - department: string; - job: string; + adult: boolean; + gender: number; + id: number; + known_for_department: string; + name: string; + original_name: string; + popularity: number; + profile_path: string; + credit_id: string; + department: string; + job: string; } export interface TMDBShowSimilar { - page: number; - results: { - adult: boolean; - backdrop_path: string; - genre_ids: number[]; - id: number; - origin_country: string[]; - original_language: string; - original_name: string; - overview: string; - popularity: number; - poster_path: string; - first_air_date: string; - name: string; - vote_average: number; - vote_count: number; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + adult: boolean; + backdrop_path: string; + genre_ids: number[]; + id: number; + origin_country: string[]; + original_language: string; + original_name: string; + overview: string; + popularity: number; + poster_path: string; + first_air_date: string; + name: string; + vote_average: number; + vote_count: number; + }[]; + total_pages: number; + total_results: number; } export interface TMDBMovieSimilar { - page: number; - results: { - adult: boolean; - backdrop_path: string; - genre_ids: number[]; - id: number; - original_language: string; - original_title: string; - overview: string; - popularity: number; - poster_path: string; - release_date: string; - title: string; - video: boolean; - vote_average: number; - vote_count: number; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + adult: boolean; + backdrop_path: string; + genre_ids: number[]; + id: number; + original_language: string; + original_title: string; + overview: string; + popularity: number; + poster_path: string; + release_date: string; + title: string; + video: boolean; + vote_average: number; + vote_count: number; + }[]; + total_pages: number; + total_results: number; } export interface TMDBPersonDetails { - birthday?: string; - known_for_department?: string; - deathday?: string; - id?: number; - name?: string; - also_known_as?: string[]; - gender?: number; - biography?: string; - popularity?: number; - place_of_birth?: string; - profile_path?: string; - adult?: boolean; - imdb_id?: string; - homepage?: string; + birthday?: string; + known_for_department?: string; + deathday?: string; + id?: number; + name?: string; + also_known_as?: string[]; + gender?: number; + biography?: string; + popularity?: number; + place_of_birth?: string; + profile_path?: string; + adult?: boolean; + imdb_id?: string; + homepage?: string; } export interface TMDBPersonCombinedCredits { - id: number; - cast: TMDBPersonCombinedCreditsCast[]; + id: number; + cast: TMDBPersonCombinedCreditsCast[]; } export interface TMDBPersonCombinedCreditsCast { - id: number; - original_language: string; - episode_count: number; - overview: string; - origin_country: string[]; - original_name: string; - genre_ids: number[]; - name: string; - media_type: MediaType; - poster_path: string; - first_air_date: string; - vote_average: number; - vote_count: number; - character: string; - backdrop_path: string; - popularity: number; - credit_id: string; - original_title: string; - video: boolean; - release_date: string; - title: string; - adult: boolean; + id: number; + original_language: string; + episode_count: number; + overview: string; + origin_country: string[]; + original_name: string; + genre_ids: number[]; + name: string; + media_type: MediaType; + poster_path: string; + first_air_date: string; + vote_average: number; + vote_count: number; + character: string; + backdrop_path: string; + popularity: number; + credit_id: string; + original_title: string; + video: boolean; + release_date: string; + title: string; + adult: boolean; } export interface TMDBDiscoverMovies { - page: number; - results: { - adult: boolean; - backdrop_path: string; - genre_ids: number[]; - id: number; - original_language: string; - original_title: string; - overview: string; - popularity: number; - poster_path: string; - release_date: string; - title: string; - video: boolean; - vote_average: number; - vote_count: number; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + adult: boolean; + backdrop_path: string; + genre_ids: number[]; + id: number; + original_language: string; + original_title: string; + overview: string; + popularity: number; + poster_path: string; + release_date: string; + title: string; + video: boolean; + vote_average: number; + vote_count: number; + }[]; + total_pages: number; + total_results: number; } export interface TMDBDiscoverShows { - page: number; - results: { - backdrop_path: string; - first_air_date: string; - genre_ids: number[]; - id: number; - name: string; - origin_country: string[]; - original_language: string; - original_name: string; - overview: string; - popularity: number; - poster_path: string; - vote_average: number; - vote_count: number; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + backdrop_path: string; + first_air_date: string; + genre_ids: number[]; + id: number; + name: string; + origin_country: string[]; + original_language: string; + original_name: string; + overview: string; + popularity: number; + poster_path: string; + vote_average: number; + vote_count: number; + }[]; + total_pages: number; + total_results: number; } export interface TMDBTrendingAll { - page: number; - results: { - adult: boolean; - backdrop_path: string; - id: number; - title?: string; - original_language: string; - original_title?: string; - overview: string; - poster_path: string; - media_type: MediaType; - genre_ids: number[]; - popularity: number; - release_date?: string; - video?: boolean; - vote_average: number; - vote_count: number; - name?: string; - original_name?: string; - first_air_date?: string; - origin_country?: string[]; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + adult: boolean; + backdrop_path: string; + id: number; + title?: string; + original_language: string; + original_title?: string; + overview: string; + poster_path: string; + media_type: MediaType; + genre_ids: number[]; + popularity: number; + release_date?: string; + video?: boolean; + vote_average: number; + vote_count: number; + name?: string; + original_name?: string; + first_air_date?: string; + origin_country?: string[]; + }[]; + total_pages: number; + total_results: number; } export interface TMDBUpcomingMovies { - dates: { - maximum: string; - minimum: string; - }; - page: number; - results: { - adult: boolean; - backdrop_path: string; - genre_ids: number[]; - id: number; - original_language: string; - original_title: string; - overview: string; - popularity: number; - poster_path: string; - release_date: string; - title: string; - video: boolean; - vote_average: number; - vote_count: number; - }[]; - total_pages: number; - total_results: number; + dates: { + maximum: string; + minimum: string; + }; + page: number; + results: { + adult: boolean; + backdrop_path: string; + genre_ids: number[]; + id: number; + original_language: string; + original_title: string; + overview: string; + popularity: number; + poster_path: string; + release_date: string; + title: string; + video: boolean; + vote_average: number; + vote_count: number; + }[]; + total_pages: number; + total_results: number; } export interface TMDBUpcomingShows { - page: number; - results: { - backdrop_path: string; - first_air_date: string; - genre_ids: number[]; - id: number; - name: string; - origin_country: string[]; - original_language: string; - original_name: string; - overview: string; - popularity: number; - poster_path: string; - vote_average: number; - vote_count: number; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + backdrop_path: string; + first_air_date: string; + genre_ids: number[]; + id: number; + name: string; + origin_country: string[]; + original_language: string; + original_name: string; + overview: string; + popularity: number; + poster_path: string; + vote_average: number; + vote_count: number; + }[]; + total_pages: number; + total_results: number; } export interface TMDBExternalIds { - id: number; - imdb_id: string; - wikidata_id: string; - facebook_id: string; - instagram_id: string; - twitter_id: string; + id: number; + imdb_id: string; + wikidata_id: string; + facebook_id: string; + instagram_id: string; + twitter_id: string; } export interface TMDBExternalIdsMovie extends TMDBExternalIds {} export interface TMDBExternalIdsShow extends TMDBExternalIds { - freebase_mid: string; - freebase_id: string; - tvdb_id: number; - tvrage_id: number; + freebase_mid: string; + freebase_id: string; + tvdb_id: number; + tvrage_id: number; } export interface TMDBKeywords { - results: { - name: string; - id: number; - }[]; + results: { + name: string; + id: number; + }[]; } export interface TMDBRegions { - results: { - iso_3166_1: string; - english_name: string; - native_name: string; - }[]; + results: { + iso_3166_1: string; + english_name: string; + native_name: string; + }[]; } // ContentSearch* interfaces are for tmdb 'multi' search results. export interface ContentSearch { - page: number; - results: (ContentSearchMovie | ContentSearchTv | ContentSearchPerson)[]; - total_pages: number; - total_results: number; + page: number; + results: (ContentSearchMovie | ContentSearchTv | ContentSearchPerson)[]; + total_pages: number; + total_results: number; } export interface ContentSearchMovie { - poster_path?: string; - adult?: boolean; - overview?: string; - release_date?: string; - original_title?: string; - genre_ids?: number[]; - id: number; - media_type: "movie"; - original_language?: string; - title?: string; - backdrop_path?: string; - popularity?: number; - vote_count?: number; - video?: boolean; - vote_average?: number; + poster_path?: string; + adult?: boolean; + overview?: string; + release_date?: string; + original_title?: string; + genre_ids?: number[]; + id: number; + media_type: "movie"; + original_language?: string; + title?: string; + backdrop_path?: string; + popularity?: number; + vote_count?: number; + video?: boolean; + vote_average?: number; } export interface ContentSearchTv { - poster_path?: string; - popularity?: number; - id: number; - overview?: string; - backdrop_path?: string; - vote_average?: number; - media_type: "tv"; - first_air_date?: string; - origin_country?: string[]; - genre_ids?: number[]; - original_language?: string; - vote_count?: number; - name?: string; - original_name?: string; + poster_path?: string; + popularity?: number; + id: number; + overview?: string; + backdrop_path?: string; + vote_average?: number; + media_type: "tv"; + first_air_date?: string; + origin_country?: string[]; + genre_ids?: number[]; + original_language?: string; + vote_count?: number; + name?: string; + original_name?: string; } export interface ContentSearchPerson { - profile_path?: string; - adult?: boolean; - id?: number; - media_type: "person"; - known_for?: ContentSearchMovie | ContentSearchTv; - name?: string; - popularity?: number; + profile_path?: string; + adult?: boolean; + id?: number; + media_type: "person"; + known_for?: ContentSearchMovie | ContentSearchTv; + name?: string; + popularity?: number; } export interface MoviesSearchResponse { - page: number; - results: { - adult: boolean; - backdrop_path: string; - genre_ids: number[]; - id: number; - original_language: string; - original_title: string; - overview: string; - popularity: number; - poster_path: string; - release_date: string; - title: string; - video: boolean; - vote_average: number; - vote_count: number; - media_type: "movie"; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + adult: boolean; + backdrop_path: string; + genre_ids: number[]; + id: number; + original_language: string; + original_title: string; + overview: string; + popularity: number; + poster_path: string; + release_date: string; + title: string; + video: boolean; + vote_average: number; + vote_count: number; + media_type: "movie"; + }[]; + total_pages: number; + total_results: number; } export interface ShowsSearchResponse { - page: number; - results: { - adult: boolean; - backdrop_path: string; - genre_ids: number[]; - id: number; - origin_country: string[]; - original_language: string; - original_name: string; - overview: string; - popularity: number; - poster_path: string; - first_air_date: string; - name: string; - vote_average: number; - vote_count: number; - media_type: "tv"; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + adult: boolean; + backdrop_path: string; + genre_ids: number[]; + id: number; + origin_country: string[]; + original_language: string; + original_name: string; + overview: string; + popularity: number; + poster_path: string; + first_air_date: string; + name: string; + vote_average: number; + vote_count: number; + media_type: "tv"; + }[]; + total_pages: number; + total_results: number; } export interface PeopleSearchResponse { - page: number; - results: { - adult: boolean; - gender: number; - id: number; - known_for_department: string; - name: string; - original_name: string; - popularity: number; - profile_path: string; - media_type: "person"; - known_for: { - adult: boolean; - backdrop_path: string; - id: number; - title: string; - original_language: string; - original_title: string; - overview: string; - poster_path: string; - media_type: string; - genre_ids: number[]; - popularity: number; - release_date: string; - video: boolean; - vote_average: number; - vote_count: number; - }[]; - }[]; - total_pages: number; - total_results: number; + page: number; + results: { + adult: boolean; + gender: number; + id: number; + known_for_department: string; + name: string; + original_name: string; + popularity: number; + profile_path: string; + media_type: "person"; + known_for: { + adult: boolean; + backdrop_path: string; + id: number; + title: string; + original_language: string; + original_title: string; + overview: string; + poster_path: string; + media_type: string; + genre_ids: number[]; + popularity: number; + release_date: string; + video: boolean; + vote_average: number; + vote_count: number; + }[]; + }[]; + total_pages: number; + total_results: number; } export interface GameSearch { - id: number; - cover: { - id: number; - image_id: string; - }; - first_release_date: string; - name: string; - summary?: string; - version_title?: string; + id: number; + cover: { + id: number; + image_id: string; + }; + first_release_date: string; + name: string; + summary?: string; + version_title?: string; } export enum ImportResponseType { - IMPORT_SUCCESS = "IMPORT_SUCCESS", - IMPORT_FAILED = "IMPORT_FAILED", - IMPORT_MULTI = "IMPORT_MULTI", - IMPORT_NOTFOUND = "IMPORT_NOTFOUND", - IMPORT_EXISTS = "IMPORT_EXISTS" + IMPORT_SUCCESS = "IMPORT_SUCCESS", + IMPORT_FAILED = "IMPORT_FAILED", + IMPORT_MULTI = "IMPORT_MULTI", + IMPORT_NOTFOUND = "IMPORT_NOTFOUND", + IMPORT_EXISTS = "IMPORT_EXISTS", } export interface ImportResponse { - type: ImportResponseType; - results: (ContentSearchMovie | ContentSearchTv)[]; - match?: ContentSearchMovie | ContentSearchTv; - watchedEntry?: Watched; + type: ImportResponseType; + results: (ContentSearchMovie | ContentSearchTv)[]; + match?: ContentSearchMovie | ContentSearchTv; + watchedEntry?: Watched; } export interface ImportedList { - tmdbId?: number; - name: string; - year?: string; - type?: ContentType; - state?: string; - rating?: number; - ratingCustomDate?: Date; - status?: WatchedStatus; - thoughts?: string; - datesWatched?: Date[]; - activity?: Activity[]; - watchedEpisodes?: WatchedEpisode[]; - watchedSeasons?: WatchedSeason[]; - tags?: TagAddRequest[]; - imdbId?: string; + tmdbId?: number; + name: string; + year?: string; + type?: ContentType; + state?: string; + rating?: number; + ratingCustomDate?: Date; + status?: WatchedStatus; + thoughts?: string; + datesWatched?: Date[]; + activity?: Activity[]; + watchedEpisodes?: WatchedEpisode[]; + watchedSeasons?: WatchedSeason[]; + tags?: TagAddRequest[]; + imdbId?: string; } export interface Filters { - type: string[]; - status: string[]; + type: string[]; + status: string[]; } export interface ManagedUser { - id: number; - createdAt: Date; - username: string; - type: UserType; - permissions: number; - private: boolean; + id: number; + createdAt: Date; + username: string; + type: UserType; + permissions: number; + private: boolean; } export interface ServerConfig { - DEFAULT_COUNTRY: string; - JELLYFIN_HOST: string; - USE_EMBY: boolean; - SIGNUP_ENABLED: boolean; - TMDB_KEY: string; - PLEX_HOST: string; - PLEX_MACHINE_ID: string; - SONARR: SonarrSettings[]; - RADARR: RadarrSettings[]; - TWITCH: TwitchSettings; - DEBUG: boolean; + DEFAULT_COUNTRY: string; + JELLYFIN_HOST: string; + USE_EMBY: boolean; + SIGNUP_ENABLED: boolean; + TMDB_KEY: string; + PLEX_HOST: string; + PLEX_MACHINE_ID: string; + SONARR: SonarrSettings[]; + RADARR: RadarrSettings[]; + TWITCH: TwitchSettings; + DEBUG: boolean; } export interface ServerConfigByName { - value: T; + value: T; } export interface SonarrSettings { - name: string; - host?: string; - key?: string; - qualityProfile?: number; - rootFolder?: number; - languageProfile?: number; - automaticSearch?: boolean; + name: string; + host?: string; + key?: string; + qualityProfile?: number; + rootFolder?: number; + languageProfile?: number; + automaticSearch?: boolean; } export interface RadarrSettings { - name: string; - host?: string; - key?: string; - qualityProfile?: number; - rootFolder?: number; - automaticSearch?: boolean; + name: string; + host?: string; + key?: string; + qualityProfile?: number; + rootFolder?: number; + automaticSearch?: boolean; } export interface TwitchSettings { - clientId: string; - clientSecret: string; + clientId: string; + clientSecret: string; } export interface TrustedHeaderAuthSetting { - enabled: boolean; - headerName: string; - autoLogin?: boolean; - logoutUrl?: string; + enabled: boolean; + headerName: string; + autoLogin: boolean; + logoutUrl: string; } export interface TrustedHeaderAuthLogoutDetailsResponse { - logoutUrl?: string; + logoutUrl?: string; } export interface DropDownItem { - id: number | string; - value: string; - icon?: Icon; + id: number | string; + value: string; + icon?: Icon; } export interface ListBoxItem { - id: number; - value: boolean; - displayValue: string; + id: number; + value: boolean; + displayValue: string; } export interface QualityProfile { - name: string; - upgradeAllowed: boolean; - cutoff: number; - items: { - quality?: { - id: number; - name: string; - source: string; - resolution: number; - }; - items: any[]; - allowed: boolean; - name?: string; - id?: number; - }[]; - id: number; + name: string; + upgradeAllowed: boolean; + cutoff: number; + items: { + quality?: { + id: number; + name: string; + source: string; + resolution: number; + }; + items: any[]; + allowed: boolean; + name?: string; + id?: number; + }[]; + id: number; } export interface RootFolder { - path: string; - accessible: boolean; - freeSpace: number; - unmappedFolders: any[]; - id: number; + path: string; + accessible: boolean; + freeSpace: number; + unmappedFolders: any[]; + id: number; } export interface LanguageProfile { - name: string; - upgradeAllowed: boolean; - cutoff: { - id: number; - name: string; - }; - languages: { - language: { - id: number; - name: string; - }; - allowed: boolean; - }[]; - id: number; + name: string; + upgradeAllowed: boolean; + cutoff: { + id: number; + name: string; + }; + languages: { + language: { + id: number; + name: string; + }; + allowed: boolean; + }[]; + id: number; } export interface SonarrTestResponse { - qualityProfiles: QualityProfile[]; - rootFolders: RootFolder[]; - languageProfiles: LanguageProfile[]; + qualityProfiles: QualityProfile[]; + rootFolders: RootFolder[]; + languageProfiles: LanguageProfile[]; } export interface RadarrTestResponse { - qualityProfiles: QualityProfile[]; - rootFolders: RootFolder[]; + qualityProfiles: QualityProfile[]; + rootFolders: RootFolder[]; } -export type ArrRequestStatus = "PENDING" | "APPROVED" | "AUTO_APPROVED" | "DENIED" | "FOUND"; +export type ArrRequestStatus = + | "PENDING" + | "APPROVED" + | "AUTO_APPROVED" + | "DENIED" + | "FOUND"; export interface ArrRequestResponse { - id: number; - createdAt: string; - updatedAt: string; - serverName: string; - arrId: number; - content: Content; - status: ArrRequestStatus; - requestJson: string; - username: string; + id: number; + createdAt: string; + updatedAt: string; + serverName: string; + arrId: number; + content: Content; + status: ArrRequestStatus; + requestJson: string; + username: string; } export interface ArrDetailsResponse { - progress: number; - estimatedCompletionTime: string; - status: string; - trackedDownloadStatus: string; - trackedDownloadState: string; + progress: number; + estimatedCompletionTime: string; + status: string; + trackedDownloadStatus: string; + trackedDownloadState: string; } export interface ArrInfoResponse { - hasFile: boolean; - isAvailable: boolean; - added: string; + hasFile: boolean; + isAvailable: boolean; + added: string; } export interface ServerFeatures { - sonarr: boolean; - radarr: boolean; - games: boolean; + sonarr: boolean; + radarr: boolean; + games: boolean; } export interface Follow { - createdAt: Date; - followedUser: PublicUser; + createdAt: Date; + followedUser: PublicUser; } interface MovaryExportBase { - title: string; - year: string; - tmdbId: string; - imdbId: string; + title: string; + year: string; + tmdbId: string; + imdbId: string; } export interface MovaryHistory extends MovaryExportBase { - watchedAt: string; - comment: string; + watchedAt: string; + comment: string; } export interface MovaryRatings extends MovaryExportBase { - userRating: string; + userRating: string; } export interface MovaryWatchlist extends MovaryExportBase { - addedAt: string; + addedAt: string; } export interface TodoMoviesExport { - Movie: TodoMoviesMovie[]; - MovieList: TodoMoviesCustomList[]; + Movie: TodoMoviesMovie[]; + MovieList: TodoMoviesCustomList[]; } export interface TodoMoviesMovie { - Attrs: { - tmdbID: number; - title: string; - isWatched: number; - insertionDate: { - Value: number; - Class: string; - }; - myScore: number; - }; - Rels: { - lists: { - Items: string[]; - Entity: string; - }; - }; - ObjectID: string; + Attrs: { + tmdbID: number; + title: string; + isWatched: number; + insertionDate: { + Value: number; + Class: string; + }; + myScore: number; + }; + Rels: { + lists: { + Items: string[]; + Entity: string; + }; + }; + ObjectID: string; } export interface TodoMoviesCustomList { - Attrs: { - colorInHex: string; - order: number; - iconFileName: string; - featuredListID: number; - name: string; - }; - Rels: { - movies: { - Items: string[]; - Entity: string; - }; - }; - ObjectID: string; + Attrs: { + colorInHex: string; + order: number; + iconFileName: string; + featuredListID: number; + name: string; + }; + Rels: { + movies: { + Items: string[]; + Entity: string; + }; + }; + ObjectID: string; } export interface Game { - id: number; - updatedAt: string; - igdbId: number; - name: string; - coverId: string; - summary: string; - storyline: string; - releaseDate?: string; - rating: number; - ratingCount: number; - status: number; - category: number; - poster?: Image; + id: number; + updatedAt: string; + igdbId: number; + name: string; + coverId: string; + summary: string; + storyline: string; + releaseDate?: string; + rating: number; + ratingCount: number; + status: number; + category: number; + poster?: Image; } export interface GameDetailsResponse { - id: number; - artworks: { - width: number; - height: number; - image_id: string; - }[]; - category: number; - cover: { - id: number; - image_id: string; - }; - first_release_date: number; - game_modes: { - id: number; - name: string; - }[]; - genres: { - id: number; - name: string; - }[]; - involved_companies: { - id: number; - company: { - id: number; - description: string; - name: string; - slug: string; - websites: { - id: number; - category: number; - trusted: boolean; - url: string; - }[]; - }; - developer: boolean; - porting: boolean; - publisher: boolean; - supporting: boolean; - }[]; - name: string; - platforms: { - id: number; - name: string; - }[]; - rating: number; - rating_count: number; - summary: string; - storyline: string; - url: string; - videos: { - id: number; - name: string; - video_id: string; - }[]; - websites: { - id: number; - category: number; - trusted: boolean; - url: string; - }[]; - similar_games: { - id: number; - name: string; - summary: string; - first_release_date: number; - cover: { - id: number; - image_id: string; - }; - }[]; + id: number; + artworks: { + width: number; + height: number; + image_id: string; + }[]; + category: number; + cover: { + id: number; + image_id: string; + }; + first_release_date: number; + game_modes: { + id: number; + name: string; + }[]; + genres: { + id: number; + name: string; + }[]; + involved_companies: { + id: number; + company: { + id: number; + description: string; + name: string; + slug: string; + websites: { + id: number; + category: number; + trusted: boolean; + url: string; + }[]; + }; + developer: boolean; + porting: boolean; + publisher: boolean; + supporting: boolean; + }[]; + name: string; + platforms: { + id: number; + name: string; + }[]; + rating: number; + rating_count: number; + summary: string; + storyline: string; + url: string; + videos: { + id: number; + name: string; + video_id: string; + }[]; + websites: { + id: number; + category: number; + trusted: boolean; + url: string; + }[]; + similar_games: { + id: number; + name: string; + summary: string; + first_release_date: number; + cover: { + id: number; + image_id: string; + }; + }[]; } export enum GameWebsiteCategory { - Official = 1, - Wikipedia = 3, - Twitch = 6, - Steam = 13, - Reddit = 14 + Official = 1, + Wikipedia = 3, + Twitch = 6, + Steam = 13, + Reddit = 14, } // General interface for all requests that return a job that was started. export interface JobCreatedResponse { - jobId: string; + jobId: string; } export enum JobStatus { - CREATED = "CREATED", - RUNNING = "RUNNING", - DONE = "DONE", - CANCELLED = "CANCELLED" + CREATED = "CREATED", + RUNNING = "RUNNING", + DONE = "DONE", + CANCELLED = "CANCELLED", } export interface GetJobResponse { - name: string; - status: JobStatus; - currentTask?: string; - errors: string[]; + name: string; + status: JobStatus; + currentTask?: string; + errors: string[]; } export interface TaskRescheduleRequest { - seconds: number; + seconds: number; } export interface AllTasksResponse { - name: string; - nextRun: Date; - seconds: number; + name: string; + nextRun: Date; + seconds: number; } export interface Tag extends dbModel { - name: string; - color: string; - bgColor: string; + name: string; + color: string; + bgColor: string; } export interface TagAddRequest { - name: string; - color: string; - bgColor: string; + name: string; + color: string; + bgColor: string; } diff --git a/src/vars.scss b/src/vars.scss index 821b2fa2..ae1e7c7c 100644 --- a/src/vars.scss +++ b/src/vars.scss @@ -1,29 +1,29 @@ :root { - --bg-color: white; - --nav-color: rgba(255, 255, 255, 0.8); - --text-color: black; - --accent-color: rgba(128, 128, 128, 0.226); - --accent-color-hover: rgba(46, 46, 46); - --backdrop-filter: blur(4px) grayscale(80%); - --backdrop-mix-blend-mode: multiply; - --rating-color: black; - --placeholder-color: #8e8e8e; - --poster-rating-color: gold; - --img-blend-multiply-bg-col: rgba(0, 0, 0, 0.85); + --bg-color: white; + --nav-color: rgba(255, 255, 255, 0.8); + --text-color: black; + --accent-color: rgba(128, 128, 128, 0.226); + --accent-color-hover: rgba(46, 46, 46); + --backdrop-filter: blur(4px) grayscale(80%); + --backdrop-mix-blend-mode: multiply; + --rating-color: black; + --placeholder-color: #8e8e8e; + --poster-rating-color: gold; + --img-blend-multiply-bg-col: rgba(0, 0, 0, 0.85); } :root.theme-dark { - --bg-color: rgb(15, 15, 15); - --nav-color: rgba(15, 15, 15, 0.438); - --text-color: white; - --accent-color: rgba(46, 46, 46); - --accent-color-hover: rgba(255, 255, 255, 0.8); - --backdrop-filter: blur(0.5px) grayscale(50%); - --backdrop-mix-blend-mode: difference; - --rating-color: gold; - --placeholder-color: #8e8e8e; - --poster-rating-color: black; - --img-blend-multiply-bg-col: rgba(255, 255, 255, 0.03); + --bg-color: rgb(15, 15, 15); + --nav-color: rgba(15, 15, 15, 0.438); + --text-color: white; + --accent-color: rgba(46, 46, 46); + --accent-color-hover: rgba(255, 255, 255, 0.8); + --backdrop-filter: blur(0.5px) grayscale(50%); + --backdrop-mix-blend-mode: difference; + --rating-color: gold; + --placeholder-color: #8e8e8e; + --poster-rating-color: black; + --img-blend-multiply-bg-col: rgba(255, 255, 255, 0.03); } $bg-color: var(--bg-color); @@ -33,7 +33,11 @@ $accent-color: var(--accent-color); $accent-color-hover: var(--accent-color-hover); $backdrop-filter: var(--backdrop-filter); $backdrop-mix-blend-mode: var(--backdrop-mix-blend-mode); -$backdrop-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1) 80%, rgba(0, 0, 0, 0)); +$backdrop-mask-image: linear-gradient( + to bottom, + rgba(0, 0, 0, 1) 80%, + rgba(0, 0, 0, 0) +); $nav-color: var(--nav-color); $nav-height: 71px; // How tall the nav is naturally, usefull in some places. $poster-rating-color: var(--poster-rating-color); diff --git a/svelte.config.js b/svelte.config.js index 7011e185..d58341db 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,27 +1,27 @@ import adapter from "@sveltejs/adapter-node"; import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; -import sveltePreprocess from "svelte-preprocess"; +import { sveltePreprocess } from "svelte-preprocess"; /** @type {import('@sveltejs/kit').Config} */ const config = { - // Consult https://kit.svelte.dev/docs/integrations#preprocessors - // for more information about preprocessors - preprocess: [ - sveltePreprocess({ - scss: { - prependData: `@import "./src/norm.scss";` - } - }), - vitePreprocess() - ], + // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // for more information about preprocessors + preprocess: [ + sveltePreprocess({ + scss: { + prependData: `@import "./src/norm.scss";`, + }, + }), + vitePreprocess(), + ], - kit: { - adapter: adapter(), + kit: { + adapter: adapter(), - alias: { - "@": "src" - } - } + alias: { + "@": "src", + }, + }, }; export default config; diff --git a/tsconfig.json b/tsconfig.json index f00950ec..05579b46 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,33 +1,33 @@ { - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "types": ["vite-plugin-pwa/client", "vite-plugin-pwa/info"] - }, - // Includes merged from ./svelte-kit/tsconfig.json, since we want to add .env.d.ts, - // and typescript wont merge both the include arrays.. only override. - "include": [ - "./.svelte-kit/ambient.d.ts", - "./.svelte-kit/types/**/$types.d.ts", - "./vite.config.js", - "./vite.config.ts", - "./src/**/*.js", - "./src/**/*.ts", - "./src/**/*.svelte", - "./tests/**/*.js", - "./tests/**/*.ts", - "./tests/**/*.svelte", - "./env.d.ts" - ] - // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias - // - // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes - // from the referenced tsconfig.json - TypeScript does not merge them in + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "types": ["vite-plugin-pwa/client", "vite-plugin-pwa/info"] + }, + // Includes merged from ./svelte-kit/tsconfig.json, since we want to add .env.d.ts, + // and typescript wont merge both the include arrays.. only override. + "include": [ + "./.svelte-kit/ambient.d.ts", + "./.svelte-kit/types/**/$types.d.ts", + "./vite.config.js", + "./vite.config.ts", + "./src/**/*.js", + "./src/**/*.ts", + "./src/**/*.svelte", + "./tests/**/*.js", + "./tests/**/*.ts", + "./tests/**/*.svelte", + "./env.d.ts" + ] + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in } diff --git a/vite.config.ts b/vite.config.ts index 95517992..31ecefaa 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,48 +5,48 @@ import { SvelteKitPWA } from "@vite-pwa/sveltekit"; const pkg = JSON.parse(readFileSync("package.json", "utf8")); export default defineConfig({ - plugins: [ - sveltekit(), - SvelteKitPWA({ - manifest: { - name: "Watcharr", - short_name: "Watcharr", - description: "Your movie and show watched list.", - background_color: "#f1da83", - categories: ["entertainment"], - start_url: "/", - scope: "/", - display: "standalone", - icons: [ - { - src: "/logo-sqre-144.png", - sizes: "144x144", - type: "image/png" - }, - { - src: "/logo-sqre-192.png", - sizes: "192x192", - type: "image/png" - }, - { - src: "/logo-sqre.png", - sizes: "512x512", - type: "image/png" - }, - { - src: "/logo-sqre.png", - sizes: "512x512", - type: "image/png", - purpose: "any maskable" - } - ] - }, - devOptions: { - enabled: true - } - }) - ], - define: { - __WATCHARR_VERSION__: JSON.stringify(pkg.version) - } + plugins: [ + sveltekit(), + SvelteKitPWA({ + manifest: { + name: "Watcharr", + short_name: "Watcharr", + description: "Your movie and show watched list.", + background_color: "#f1da83", + categories: ["entertainment"], + start_url: "/", + scope: "/", + display: "standalone", + icons: [ + { + src: "/logo-sqre-144.png", + sizes: "144x144", + type: "image/png", + }, + { + src: "/logo-sqre-192.png", + sizes: "192x192", + type: "image/png", + }, + { + src: "/logo-sqre.png", + sizes: "512x512", + type: "image/png", + }, + { + src: "/logo-sqre.png", + sizes: "512x512", + type: "image/png", + purpose: "any maskable", + }, + ], + }, + devOptions: { + enabled: true, + }, + }), + ], + define: { + __WATCHARR_VERSION__: JSON.stringify(pkg.version), + }, });