├── .nvmrc ├── .npmrc ├── src ├── routes │ ├── +layout.svelte │ ├── +page.server.ts │ ├── +layout.server.ts │ ├── +page.svelte │ └── +layout.ts ├── test │ ├── Link.svelte │ ├── WithContext.svelte │ ├── createEvent.ts │ ├── join.spec.ts │ ├── i18n.ts │ ├── parse.spec.ts │ ├── detector.spec.ts │ ├── SvelteI18next.spec.ts │ └── Trans.spec.ts ├── lib │ ├── provider.svelte │ ├── index.ts │ ├── context.ts │ ├── store.ts │ ├── types.ts │ ├── Node.svelte │ ├── utils │ │ ├── misc.ts │ │ └── parse.ts │ ├── request.ts │ ├── Trans.svelte │ ├── detector.ts │ └── i18n.ts ├── i18n.server.ts ├── app.html ├── app.d.ts ├── i18n.ts └── hooks.server.ts ├── static ├── locales │ ├── en │ │ ├── errors.json │ │ └── common.json │ └── es │ │ ├── errors.json │ │ └── common.json └── favicon.png ├── vitest-setup.ts ├── .gitignore ├── .eslintignore ├── .prettierignore ├── .prettierrc ├── vite.config.ts ├── .eslintrc.cjs ├── .eslintrc.js ├── tsconfig.json ├── svelte.config.js ├── LICENSE ├── package.json ├── README.md └── pnpm-lock.yaml /.nvmrc: -------------------------------------------------------------------------------- 1 | v18.14.0 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/locales/en/errors.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /static/locales/es/errors.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/test/Link.svelte: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maximux13/svelte-i18next/HEAD/static/favicon.png -------------------------------------------------------------------------------- /static/locales/en/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Svelte i18next - Hello {{name}}!", 3 | "world": "World" 4 | } 5 | -------------------------------------------------------------------------------- /static/locales/es/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Svelte i18next - Hola {{name}}!", 3 | "world": "Mundo" 4 | } 5 | -------------------------------------------------------------------------------- /vitest-setup.ts: -------------------------------------------------------------------------------- 1 | import * as matchers from '@testing-library/jest-dom/matchers'; 2 | import { expect } from 'vitest'; 3 | 4 | expect.extend(matchers); 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /dist 5 | /.svelte-kit 6 | /package 7 | .env 8 | .env.* 9 | !.env.example 10 | vite.config.js.timestamp-* 11 | vite.config.ts.timestamp-* 12 | coverage/ -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /src/routes/+page.server.ts: -------------------------------------------------------------------------------- 1 | import type { PageServerLoad } from './$types'; 2 | 3 | export const load: PageServerLoad = async ({ locals, depends }) => { 4 | depends('i18n:lng'); 5 | 6 | return { world: locals.i18n.t('world') }; 7 | }; 8 | -------------------------------------------------------------------------------- /src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutServerLoad } from './$types'; 2 | 3 | export const load: LayoutServerLoad = async ({ locals, depends }) => { 4 | depends('i18n:lng'); 5 | 6 | return { i18n: locals.i18n.initOptions }; 7 | }; 8 | -------------------------------------------------------------------------------- /src/test/WithContext.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": false, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /src/lib/provider.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SvelteI18next } from './i18n'; 2 | export { default as SvelteI18nProvider } from './provider.svelte'; 3 | export { default as useI18n } from './context'; 4 | export { default as Trans } from './Trans.svelte'; 5 | export { default as createFetchRequest } from './request'; 6 | export * from './store'; 7 | export * from './types'; 8 | -------------------------------------------------------------------------------- /src/i18n.server.ts: -------------------------------------------------------------------------------- 1 | import Backend from 'i18next-fs-backend'; 2 | 3 | import { SvelteI18next } from '$lib'; 4 | 5 | import i18n from './i18n'; 6 | 7 | const i18next = new SvelteI18next({ 8 | i18next: { 9 | ...i18n, 10 | backend: { loadPath: '/locales/{{lng}}/{{ns}}.json' } 11 | }, 12 | backend: Backend 13 | }); 14 | 15 | export default i18next; 16 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | test: { 7 | coverage: { 8 | provider: 'v8' 9 | }, 10 | include: ['src/**/*.{test,spec}.{js,ts}'], 11 | globals: true, 12 | environment: 'jsdom', 13 | setupFiles: ['./vitest-setup.ts'] 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /src/lib/context.ts: -------------------------------------------------------------------------------- 1 | import { getContext as getSvelteContext } from 'svelte'; 2 | 3 | import { error } from '$lib/utils/misc'; 4 | 5 | import type { i18n } from 'i18next'; 6 | import type { Writable } from 'svelte/store'; 7 | 8 | export default function getContext() { 9 | const context = getSvelteContext('i18n') as Writable; 10 | 11 | if (!context) { 12 | error('No context found. Are you using the component outside of a ?'); 13 | } 14 | 15 | return context; 16 | } 17 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | 4 | // See https://kit.svelte.dev/docs/types#app 5 | 6 | // for information about these interfaces 7 | declare global { 8 | namespace App { 9 | // interface Error {} 10 | interface Locals { 11 | i18n: import('$lib').i18nLocals['i18n']; 12 | } 13 | // interface PageData {} 14 | // interface Platform {} 15 | // interface Locals {} 16 | } 17 | } 18 | 19 | export {}; 20 | -------------------------------------------------------------------------------- /src/i18n.ts: -------------------------------------------------------------------------------- 1 | import type { InitOptions } from 'i18next'; 2 | 3 | export default { 4 | // This is the list of languages your application supports 5 | supportedLngs: ['en', 'es'], 6 | // This is the language you want to use in case 7 | // if the user language is not in the supportedLngs 8 | fallbackLng: 'en', 9 | // The default namespace of i18next is "translation", but you can customize it here 10 | defaultNS: 'common', 11 | // This is the list of namespaces your application supports 12 | ns: ['common', 'errors'] 13 | } as InitOptions; 14 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | {$i18n.t('title', { name: world })} 9 | 10 | 11 |

Welcome to SvelteKit

12 |

Visit kit.svelte.dev to read the documentation

13 | 14 |
{$i18n.t('title', { name: world })}
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/routes/+layout.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutLoad } from './$types'; 2 | 3 | import { createInstance } from 'i18next'; 4 | import Backend from 'i18next-http-backend'; 5 | import LanguageDetector from 'i18next-browser-languagedetector'; 6 | 7 | import { createStore } from '$lib'; 8 | 9 | export const load: LayoutLoad = async ({ data }) => { 10 | const i18next = createInstance(); 11 | 12 | i18next 13 | .use(Backend) 14 | .use(LanguageDetector) 15 | .init({ 16 | ...data.i18n, 17 | detection: { caches: ['cookie'], order: ['htmlTag'] } 18 | }); 19 | 20 | const store = createStore(i18next); 21 | 22 | return { i18n: store }; 23 | }; 24 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "types": ["@testing-library/jest-dom"] 13 | } 14 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 15 | // 16 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 17 | // from the referenced tsconfig.json - TypeScript does not merge them in 18 | } 19 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /src/lib/store.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store'; 2 | import type { i18n } from 'i18next'; 3 | 4 | import { invalidate } from '$app/navigation'; 5 | import { browser } from '$app/environment'; 6 | 7 | export type i18nStore = ReturnType; 8 | 9 | export const createStore = (instance: i18n) => { 10 | const store = writable(instance); 11 | 12 | instance.on('initialized', () => { 13 | store.set(instance); 14 | }); 15 | 16 | instance.on('loaded', () => { 17 | store.set(instance); 18 | }); 19 | 20 | instance.on('added', () => { 21 | store.set(instance); 22 | }); 23 | 24 | instance.on('languageChanged', () => { 25 | if (browser) invalidate('i18n:lng'); 26 | else store.set(instance); 27 | }); 28 | 29 | return store; 30 | }; 31 | -------------------------------------------------------------------------------- /src/lib/types.ts: -------------------------------------------------------------------------------- 1 | import type { ComponentType } from 'svelte'; 2 | import type { i18n, InitOptions } from 'i18next'; 3 | 4 | export interface i18nLocals { 5 | i18n: i18n & { initOptions: Partial }; 6 | } 7 | 8 | export type Component = ComponentType | string | { component: Component; props?: any }; 9 | 10 | export type ComponentMap = 11 | | Component[] 12 | | { 13 | [key: string]: Component; 14 | }; 15 | 16 | export type ContentNode = 17 | | { 18 | type: 'text'; 19 | children: string; 20 | } 21 | | { 22 | type: 'html'; 23 | tag: string; 24 | props: Record; 25 | children: ContentNode[]; 26 | } 27 | | { 28 | type: 'svelte'; 29 | component: Component; 30 | props: Record; 31 | children: ContentNode[]; 32 | }; 33 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'node:path'; 2 | 3 | import { createInstance } from 'i18next'; 4 | import Backend from 'i18next-fs-backend'; 5 | 6 | import type { Handle } from '@sveltejs/kit'; 7 | 8 | import i18n from './i18n'; 9 | import i18next from './i18n.server'; 10 | 11 | export const handle: Handle = async (props) => { 12 | const { event } = props; 13 | 14 | const instance = createInstance(); 15 | const lng = await i18next.getLocale(event); 16 | const ns = await i18next.getNamespaces(event); 17 | 18 | await instance.use(Backend).init({ 19 | ...i18n, 20 | backend: { loadPath: resolve('./static/locales/{{lng}}/{{ns}}.json') }, 21 | lng, 22 | ns 23 | }); 24 | 25 | const initOptions = i18next.getInitOptions(instance); 26 | 27 | event.locals.i18n = Object.assign(instance, { initOptions }); 28 | 29 | return props.resolve(event, { 30 | transformPageChunk: ({ html }) => html.replace('', ``) 31 | }); 32 | }; 33 | -------------------------------------------------------------------------------- /src/lib/Node.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 | {#if node.type === 'text'} 18 | {node.children} 19 | {:else if node.type === 'html'} 20 | 21 | {#each node.children as child} 22 | 23 | {/each} 24 | 25 | {:else if node.type === 'svelte' && isSvelteComponent(node.component)} 26 | 27 | {#each node.children as child} 28 | 29 | {/each} 30 | 31 | {/if} 32 | -------------------------------------------------------------------------------- /src/test/createEvent.ts: -------------------------------------------------------------------------------- 1 | import { vi } from 'vitest'; 2 | import { i18n } from './i18n'; 3 | import type { Cookies, RequestEvent } from '@sveltejs/kit'; 4 | 5 | export function createEvent({ 6 | url, 7 | routeId, 8 | params = {}, 9 | headers = new Headers() 10 | }: { 11 | url: URL | string; 12 | routeId: string; 13 | params?: Record; 14 | headers?: Headers; 15 | }): RequestEvent { 16 | return { 17 | cookies: { 18 | get: vi.fn(), 19 | getAll: vi.fn(), 20 | set: vi.fn(), 21 | delete: vi.fn(), 22 | serialize: vi.fn() 23 | } as Cookies, 24 | fetch: fetch, 25 | getClientAddress: () => '', 26 | locals: { 27 | i18n: Object.assign(i18n, { initOptions: { fallbackLng: 'en' } }) 28 | }, 29 | isDataRequest: false, 30 | isSubRequest: false, 31 | params: params, 32 | platform: 'node', 33 | request: new Request(url, { 34 | headers 35 | }), 36 | route: { id: routeId || null }, 37 | setHeaders: vi.fn(), 38 | url: new URL(url) 39 | }; 40 | } 41 | -------------------------------------------------------------------------------- /src/lib/utils/misc.ts: -------------------------------------------------------------------------------- 1 | export function warn(message: string) { 2 | console.warn('svelte-i18next:: ' + message); 3 | } 4 | 5 | export function error(message: string) { 6 | throw new Error('svelte-i18next:: ' + message); 7 | } 8 | 9 | /** 10 | * Joins multiple path segments into a single path string. The resulting path is normalized by removing any trailing slashes and ensuring that there is exactly one leading slash. 11 | * 12 | * @param paths - The path segments to join. 13 | * @returns The joined path string. 14 | */ 15 | export function join(...segments: string[]) { 16 | const cleanedSegments = segments.map((segment) => segment.replace(/^\/+|\/+$/g, '')); 17 | 18 | // Filter out any empty strings 19 | const nonEmptySegments = cleanedSegments.filter((segment) => segment.length > 0); 20 | 21 | // Join the segments using the forward slash separator 22 | let joinedPath = nonEmptySegments.join('/'); 23 | 24 | // Add a leading slash if the original first segment had one 25 | if (segments.length > 0 && segments[0].startsWith('/')) { 26 | joinedPath = '/' + joinedPath; 27 | } 28 | 29 | return joinedPath; 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Andres Felipe Alarcon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/test/join.spec.ts: -------------------------------------------------------------------------------- 1 | import { join } from '$lib/utils/misc'; 2 | 3 | import { describe, expect, it } from 'vitest'; 4 | 5 | describe('join', () => { 6 | it('should join path segments using the system-specific separator', () => { 7 | expect(join('path', 'to', 'file.txt')).toBe('path/to/file.txt'); 8 | expect(join('path/', '/to/', '/file.txt')).toBe('path/to/file.txt'); 9 | expect(join('/path', 'to', 'file.txt')).toBe('/path/to/file.txt'); 10 | expect(join('/path/', '/to/', '/file.txt')).toBe('/path/to/file.txt'); 11 | }); 12 | 13 | it('should normalize the resulting path by removing any trailing slashes and ensuring that there is exactly one leading slash', () => { 14 | expect(join('path/', 'to/', 'file.txt/')).toBe('path/to/file.txt'); 15 | expect(join('/path/', '/to/', '/file.txt/')).toBe('/path/to/file.txt'); 16 | expect(join('path', 'to', 'file.txt')).toBe('path/to/file.txt'); 17 | expect(join('/path', '/to', '/file.txt')).toBe('/path/to/file.txt'); 18 | }); 19 | 20 | it('should handle empty path segments', () => { 21 | expect(join('', 'path', '', 'to', '', 'file.txt')).toBe('path/to/file.txt'); 22 | expect(join('', '', '', '')).toBe(''); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/lib/request.ts: -------------------------------------------------------------------------------- 1 | import type { HttpBackendOptions, RequestCallback } from 'i18next-http-backend'; 2 | 3 | export default function createFetchRequest(_fetch: typeof fetch): HttpBackendOptions['request'] { 4 | let omitFetchOptions = false; 5 | 6 | function fetchIt(url: string, options: RequestInit, callback: RequestCallback) { 7 | _fetch(url, options) 8 | .then((response) => { 9 | if (!response.ok) { 10 | return callback(response.statusText || 'Error', { 11 | status: response.status, 12 | data: '' 13 | }); 14 | } 15 | 16 | response 17 | .text() 18 | .then((data) => { 19 | callback(null, { status: response.status, data }); 20 | }) 21 | .catch((err) => callback(err, { status: 400, data: '' })); 22 | }) 23 | .catch((err) => callback(err, { status: 400, data: '' })); 24 | } 25 | 26 | return (options, url, payload, callback) => { 27 | const headers = Object.assign( 28 | {}, 29 | typeof options.customHeaders === 'function' ? options.customHeaders() : options.customHeaders 30 | ); 31 | 32 | if (payload) headers['Content-Type'] = 'application/json'; 33 | 34 | const reqOptions = 35 | typeof options.requestOptions === 'function' 36 | ? options.requestOptions(payload) 37 | : options.requestOptions; 38 | 39 | const fetchOptions = Object.assign( 40 | { 41 | method: payload ? 'POST' : 'GET', 42 | body: payload ? (options as any)?.['stringify']?.(payload) : undefined, 43 | headers 44 | }, 45 | omitFetchOptions ? {} : reqOptions 46 | ); 47 | 48 | try { 49 | fetchIt(url, fetchOptions, callback); 50 | } catch (e: any) { 51 | if ( 52 | !reqOptions || 53 | Object.keys(reqOptions).length === 0 || 54 | !e.message || 55 | e.message.indexOf('not implemented') < 0 56 | ) { 57 | return callback(e, { status: e.status ?? 400, data: '' }); 58 | } 59 | try { 60 | Object.keys(reqOptions).forEach((opt) => { 61 | delete (fetchOptions as any)[opt]; 62 | }); 63 | 64 | fetchIt(url, fetchOptions, callback); 65 | omitFetchOptions = true; 66 | } catch (err: any) { 67 | return callback(err, { status: err.status ?? 400, data: '' }); 68 | } 69 | } 70 | }; 71 | } 72 | -------------------------------------------------------------------------------- /src/lib/Trans.svelte: -------------------------------------------------------------------------------- 1 | 75 | 76 | 77 | {#each parsedContent as node (node.children)} 78 | 79 | {/each} 80 | 81 | -------------------------------------------------------------------------------- /src/test/i18n.ts: -------------------------------------------------------------------------------- 1 | import { createStore } from '$lib/store'; 2 | import { createInstance } from 'i18next'; 3 | 4 | export const i18n = createInstance(); 5 | 6 | i18n.init({ 7 | lng: 'en', 8 | fallbackLng: 'en', 9 | resources: { 10 | en: { 11 | translation: { 12 | // Simple text 13 | simple_text: 'Simple text', 14 | // Interpolation 15 | interpolation: 'Hello {{name}}', 16 | // Interpolation with function 17 | interpolation_function: 'Hello {{name, uppercase}}', 18 | // Numeric tag 19 | numeric_tag: 'Hello <0>world', 20 | // Named tag 21 | named_tag: 'Hello world', 22 | // Numeric tag found twice in the same sentence 23 | numeric_tag_twice: 'Hello <0>world and <0>universe', 24 | // Named tag found twice in the same sentence 25 | named_tag_twice: 'Hello world and universe', 26 | // Nested tags 27 | nested_tags: 'This is <0>bold <1>and italic', 28 | // Svelte component 29 | svelte_component: 'This is a <0>svelte component', 30 | // Interpolation with tag 31 | interpolation_with_tag: 'Hello <0>{{name}}', 32 | // Interpolation with nested tags 33 | interpolation_with_nested_tags: 'Hello <0><1>{{name}}', 34 | // Interpolation with svelte component 35 | interpolation_with_svelte_component: 'Hello <0><1>{{name}}', 36 | // Interpolation with svelte component and nested tags 37 | interpolation_with_svelte_component_and_nested_tags: 'Hello <0><1>{{name}}', 38 | // Translation with context 39 | greeting_male: 'Hello Mr. {{name}}', 40 | greeting_female: 'Hello Mrs. {{name}}', 41 | // Translation with pluralization 42 | count_one: 'You have {{count}} message', 43 | count_other: 'You have {{count}} messages', 44 | // Missing tag 45 | missing_tag: 'Hello <0>world', 46 | // Array of elements 47 | array_elements: ['Hello', 'world'] 48 | }, 49 | other: { 50 | simple_text: 'Simple text (other)' 51 | } 52 | }, 53 | es: { 54 | translation: { 55 | simple_text: 'Texto simple' 56 | } 57 | } 58 | }, 59 | interpolation: { 60 | escapeValue: false, // not needed for react!! 61 | format(value, format) { 62 | if (format === 'uppercase') return value.toUpperCase(); 63 | return value; 64 | } 65 | } 66 | }); 67 | 68 | export const store = createStore(i18n); 69 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@maximux13/svelte-i18next", 3 | "description": "Add internationalization (i18n) support to your SvelteKit project", 4 | "sideEffects": false, 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/maximux13/svelte-i18next.git" 8 | }, 9 | "engines": { 10 | "node": ">=18.0.0" 11 | }, 12 | "keywords": [ 13 | "svelte", 14 | "i18n", 15 | "i18next", 16 | "kit" 17 | ], 18 | "author": { 19 | "name": "Andres Alarcon", 20 | "email": "maximux13@gmail.com", 21 | "url": "https://github.com/maximux13" 22 | }, 23 | "bugs": { 24 | "url": "https://github.com/maximux13/svelte-i18next/issues" 25 | }, 26 | "homepage": "https://github.com/maximux13/svelte-i18next#readme", 27 | "version": "2.0.0", 28 | "license": "MIT", 29 | "scripts": { 30 | "dev": "vite dev", 31 | "build": "vite build && npm run package", 32 | "preview": "vite preview", 33 | "package": "svelte-kit sync && svelte-package && publint", 34 | "prepublishOnly": "npm run package", 35 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 36 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 37 | "test:unit": "vitest", 38 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 39 | "format": "prettier --plugin-search-dir . --write .", 40 | "release": "pnpx np" 41 | }, 42 | "exports": { 43 | ".": { 44 | "types": "./dist/index.d.ts", 45 | "svelte": "./dist/index.js" 46 | } 47 | }, 48 | "files": [ 49 | "dist" 50 | ], 51 | "peerDependencies": { 52 | "@sveltejs/kit": "^1.8.5", 53 | "i18next": "^22.4.10", 54 | "i18next-http-backend": "^2.1.1", 55 | "svelte": "^3.55.1 || ^4.0.0" 56 | }, 57 | "devDependencies": { 58 | "@sveltejs/adapter-auto": "^2.0.0", 59 | "@sveltejs/kit": "^1.25.0", 60 | "@sveltejs/package": "^2.2.2", 61 | "@testing-library/dom": "^9.3.3", 62 | "@testing-library/jest-dom": "^6.1.3", 63 | "@testing-library/svelte": "^4.0.3", 64 | "@types/accept-language-parser": "^1.5.3", 65 | "@types/testing-library__jest-dom": "^6.0.0", 66 | "@typescript-eslint/eslint-plugin": "^5.54.0", 67 | "@typescript-eslint/parser": "^5.54.0", 68 | "@vitest/coverage-v8": "^0.34.6", 69 | "eslint": "^8.28.0", 70 | "eslint-config-prettier": "^8.5.0", 71 | "eslint-plugin-svelte": "2.36.0-next.2", 72 | "i18next": "^22.5.1", 73 | "i18next-browser-languagedetector": "^7.1.0", 74 | "i18next-fs-backend": "^2.2.0", 75 | "i18next-http-backend": "^2.2.2", 76 | "jsdom": "^22.1.0", 77 | "prettier": "^3.1.0", 78 | "prettier-plugin-svelte": "^3.1.2", 79 | "publint": "^0.1.9", 80 | "svelte": "^4.2.0", 81 | "svelte-check": "^3.5.2", 82 | "tslib": "^2.4.1", 83 | "typescript": "^4.9.3", 84 | "vite": "^4.0.0", 85 | "vitest": "0.34.6" 86 | }, 87 | "svelte": "./dist/index.js", 88 | "types": "./dist/index.d.ts", 89 | "type": "module", 90 | "dependencies": { 91 | "accept-language-parser": "^1.5.0", 92 | "intl-parse-accept-language": "^1.0.0" 93 | }, 94 | "np": { 95 | "testScript": "test:unit" 96 | }, 97 | "publishConfig": { 98 | "access": "public" 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/lib/utils/parse.ts: -------------------------------------------------------------------------------- 1 | import { warn } from './misc'; 2 | 3 | import type { ComponentMap, ContentNode } from '$lib/types'; 4 | import type { ComponentType } from 'svelte'; 5 | 6 | const isArrayComponentMap = (components: ComponentMap): components is ComponentType[] => 7 | Array.isArray(components); 8 | 9 | const isObjectComponentMap = ( 10 | components: ComponentMap 11 | ): components is Record => typeof components === 'object'; 12 | 13 | const isComponentWithProps = ( 14 | component: ComponentType | { component: ComponentType; props?: any } 15 | ): component is { component: ComponentType; props: any } => 16 | typeof component === 'object' && 'component' in component; 17 | 18 | export function text(text: string): Extract { 19 | return { type: 'text', children: text }; 20 | } 21 | 22 | export function html( 23 | tag: string, 24 | children: ContentNode[] = [], 25 | props: Record = {} 26 | ): Extract { 27 | return { type: 'html', tag, children, props }; 28 | } 29 | 30 | export function svelte( 31 | component: any, 32 | children: ContentNode[] = [], 33 | props: Record = {} 34 | ): Extract { 35 | return { type: 'svelte', component, children, props }; 36 | } 37 | 38 | /** 39 | * Parses the given translation content to produce a structured representation of it. 40 | * 41 | * @param {string} content - The translation string with embedded tags. 42 | * @param {Array|string} components - An array or object of components or HTML tags to interpolate. 43 | * @returns {Array} A structured array representation of the content with its components. 44 | */ 45 | function parseContent(content: string, components: ComponentMap): ContentNode[] { 46 | const regExp = /<(\d+|[\w_]+)>(.*?)<\/\1>/gs; 47 | const result: ContentNode[] = []; 48 | let match; 49 | let lastIndex = 0; 50 | 51 | while ((match = regExp.exec(content)) !== null) { 52 | const [fullMatch, tag, innerContent] = match; 53 | 54 | if (match.index > lastIndex) { 55 | const text = content.substring(lastIndex, match.index); 56 | result.push({ type: 'text', children: text }); 57 | } 58 | 59 | let Component; 60 | let props = {}; 61 | 62 | if (isArrayComponentMap(components) && !isNaN(Number(tag))) { 63 | Component = components[parseInt(tag)]; 64 | } 65 | 66 | if (isObjectComponentMap(components)) { 67 | Component = components[tag]; 68 | } 69 | 70 | if (!Component) { 71 | warn(`No component found for tag <${tag}>.`); 72 | result.push(text(innerContent)); 73 | lastIndex = match.index + fullMatch.length; 74 | continue; 75 | } 76 | 77 | if (isComponentWithProps(Component)) { 78 | props = Component.props || {}; 79 | Component = Component.component; 80 | } 81 | 82 | if (typeof Component === 'string') { 83 | result.push(html(Component, parseContent(innerContent, components), props)); 84 | } else { 85 | result.push(svelte(Component, parseContent(innerContent, components), props)); 86 | } 87 | lastIndex = match.index + fullMatch.length; 88 | } 89 | 90 | if (lastIndex < content.length) { 91 | result.push(text(content.substring(lastIndex))); 92 | } 93 | 94 | return result; 95 | } 96 | 97 | export default parseContent; 98 | -------------------------------------------------------------------------------- /src/test/parse.spec.ts: -------------------------------------------------------------------------------- 1 | import { test } from 'vitest'; 2 | 3 | import parse from '$lib/utils/parse'; 4 | 5 | import type { ComponentType } from 'svelte'; 6 | import type { ComponentMap } from '$lib/types'; 7 | 8 | function text(text: string) { 9 | return { type: 'text', children: text }; 10 | } 11 | 12 | function html(tag: string, children: any[] = [], props: any = {}) { 13 | return { type: 'html', tag, children, props }; 14 | } 15 | 16 | function svelte(component: any, children: any[] = [], props: any = {}) { 17 | return { type: 'svelte', component, children, props }; 18 | } 19 | 20 | test('should handle simple text without tags', ({ expect }) => { 21 | const content = 'Simple text'; 22 | const components = [] as ComponentMap; 23 | const result = parse(content, components); 24 | expect(result).toEqual([text(content)]); 25 | }); 26 | 27 | test('should handle text with numeric tags', ({ expect }) => { 28 | const content = 'Hello <0>world'; 29 | const components = ['strong']; 30 | const result = parse(content, components); 31 | expect(result).toEqual([text('Hello '), html('strong', [text('world')])]); 32 | }); 33 | 34 | test('should handle text with named tags', ({ expect }) => { 35 | const content = 'Hello world'; 36 | const components = { strongTag: 'strong' }; 37 | const result = parse(content, components); 38 | expect(result).toEqual([text('Hello '), html('strong', [text('world')])]); 39 | }); 40 | 41 | test('should handle nested tags', ({ expect }) => { 42 | const content = 'This is <0>bold <1>and italic'; 43 | const components = ['strong', 'em']; 44 | const result = parse(content, components); 45 | expect(result).toEqual([ 46 | text('This is '), 47 | html('strong', [text('bold '), html('em', [text('and italic')])]) 48 | ]); 49 | }); 50 | 51 | test('should handle svelte components', ({ expect }) => { 52 | const FakeComponent = {} as ComponentType; // Just a placeholder for testing 53 | const content = 'This is a <0>svelte component'; 54 | const components = [FakeComponent]; 55 | const result = parse(content, components); 56 | expect(result).toEqual([text('This is a '), svelte(FakeComponent, [text('svelte component')])]); 57 | }); 58 | 59 | test('should handle components with props', ({ expect }) => { 60 | const FakeComponent = {} as ComponentType; 61 | const content = 'This is a <0>svelte component with props'; 62 | const components = [{ component: FakeComponent, props: { propKey: 'propValue' } }]; 63 | const result = parse(content, components); 64 | expect(result).toEqual([ 65 | text('This is a '), 66 | svelte(FakeComponent, [text('svelte component with props')], { propKey: 'propValue' }) 67 | ]); 68 | }); 69 | 70 | test('should handle unmatched tags', ({ expect }) => { 71 | const content = 'This is a <0>test and <1>another test'; 72 | const components: ComponentMap = ['strong']; 73 | const result = parse(content, components); 74 | expect(result).toEqual([ 75 | text('This is a '), 76 | html('strong', [text('test')]), 77 | text(' and '), 78 | text('another test') 79 | ]); 80 | }); 81 | 82 | test('should handle consecutive tags', ({ expect }) => { 83 | const content = 'This is <0>bold<1>italic'; 84 | const components: ComponentMap = ['strong', 'em']; 85 | const result = parse(content, components); 86 | expect(result).toEqual([ 87 | text('This is '), 88 | html('strong', [text('bold')]), 89 | html('em', [text('italic')]) 90 | ]); 91 | }); 92 | -------------------------------------------------------------------------------- /src/lib/detector.ts: -------------------------------------------------------------------------------- 1 | import { pick } from 'accept-language-parser'; 2 | import { parseAcceptLanguage } from 'intl-parse-accept-language'; 3 | 4 | import type { Cookies, RequestEvent, ServerLoadEvent } from '@sveltejs/kit'; 5 | import type { InitOptions } from 'i18next'; 6 | 7 | export type Params = Partial>; 8 | export type EventLike = ServerLoadEvent | RequestEvent; 9 | 10 | export const DEFAULT_PARAM = 'lng'; 11 | export const DEFAULT_COOKIE_NAME = 'i18next'; 12 | 13 | /** 14 | * `LanguageDetectorOptions` 15 | 16 | * @property {string} cookie - The name of the cookie to use for language detection. 17 | * @property {string} param - The query parameter to look for. Defaults to 'lng'. 18 | * @property order - An array of the order in which to check for the language. 19 | * @property supportedLngs - An array of languages that are supported by the application. 20 | * @property fallbackLng - The language to use if the language can't be detected. 21 | */ 22 | export type LanguageDetectorOptions = { 23 | cookie?: string; 24 | param?: string; 25 | order?: Array<'params' | 'cookie' | 'header'>; 26 | supportedLngs?: InitOptions['supportedLngs']; 27 | fallbackLng?: InitOptions['fallbackLng']; 28 | }; 29 | 30 | export default class LanguageDetector { 31 | constructor(private options: LanguageDetectorOptions) {} 32 | 33 | public async detect(event: EventLike): Promise { 34 | const orders = this.options.order ?? (['params', 'cookie', 'header'] as const); 35 | 36 | let locale: string | null = null; 37 | 38 | for (const order of orders) { 39 | if (order === 'params') { 40 | locale = this.fromParams(event.params); 41 | } 42 | 43 | if (order === 'cookie') { 44 | locale = this.fromCookie(event.cookies); 45 | } 46 | 47 | if (order === 'header') { 48 | locale = this.fromHeader(event.request); 49 | } 50 | 51 | if (locale) return locale; 52 | } 53 | 54 | return ( 55 | (this.options.fallbackLng as string) || 56 | (this.options.supportedLngs && Array.isArray(this.options.supportedLngs) 57 | ? this.options.supportedLngs[0] 58 | : this.options.supportedLngs) 59 | ); 60 | } 61 | 62 | private fromParams(params: Params) { 63 | const param = params?.[this.options.param || DEFAULT_PARAM]; 64 | if (!param) return null; 65 | 66 | return this.pick(param); 67 | } 68 | 69 | private fromCookie(cookies: Cookies) { 70 | const cookie = cookies.get(this.options.cookie ?? DEFAULT_COOKIE_NAME); 71 | if (!cookie) return null; 72 | 73 | return this.pick(cookie); 74 | } 75 | 76 | private fromHeader(request: Request) { 77 | const header = request.headers.get('Accept-Language'); 78 | if (!header) return null; 79 | 80 | const locales = parseAcceptLanguage(header, { 81 | validate: Intl.DateTimeFormat.supportedLocalesOf, 82 | ignoreWildcard: true 83 | }); 84 | 85 | return this.pick(locales.join(',')); 86 | } 87 | 88 | private pick(lang: string | undefined) { 89 | const supportedLngs = Array.isArray(this.options.supportedLngs) 90 | ? this.options.supportedLngs 91 | : [this.options.supportedLngs]; 92 | 93 | return ( 94 | pick(supportedLngs, lang ?? (this.options.fallbackLng as string), { 95 | loose: false 96 | }) || 97 | pick(supportedLngs, lang ?? (this.options.fallbackLng as string), { 98 | loose: true 99 | }) 100 | ); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/test/detector.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test, vi } from 'vitest'; 2 | 3 | import LanguageDetector from '$lib/detector'; 4 | 5 | import { createEvent } from './createEvent'; 6 | 7 | describe('detector', () => { 8 | test('should exits', () => { 9 | expect(LanguageDetector).toBeDefined(); 10 | }); 11 | 12 | const detector = new LanguageDetector({ 13 | cookie: 'i18next', 14 | param: 'lng', 15 | order: ['params', 'cookie', 'header'], 16 | supportedLngs: ['en', 'es'], 17 | fallbackLng: 'en' 18 | }); 19 | 20 | test('should detect language from params', async () => { 21 | const event = createEvent({ 22 | url: 'http://localhost:3000', 23 | routeId: 'index', 24 | params: { lng: 'es' } 25 | }); 26 | 27 | const result = await detector.detect(event); 28 | 29 | expect(result).toBe('es'); 30 | }); 31 | 32 | test('should detect language from cookie', async () => { 33 | const event = createEvent({ 34 | url: 'http://localhost:3000', 35 | routeId: 'index' 36 | }); 37 | 38 | event.cookies.get = vi.fn().mockReturnValue('es'); 39 | 40 | const result = await detector.detect(event); 41 | 42 | expect(result).toBe('es'); 43 | }); 44 | 45 | test('should detect language from header', async () => { 46 | const event = createEvent({ 47 | url: 'http://localhost:3000', 48 | routeId: 'index', 49 | headers: new Headers({ 'accept-language': 'es-CO' }) 50 | }); 51 | 52 | const result = await detector.detect(event); 53 | 54 | expect(result).toBe('es'); 55 | }); 56 | 57 | test('should detect language based on order', async () => { 58 | const event = createEvent({ 59 | url: 'http://localhost:3000', 60 | routeId: 'index', 61 | params: { lng: 'en' }, 62 | headers: new Headers({ 'accept-language': 'es' }) 63 | }); 64 | 65 | event.cookies.get = vi.fn().mockReturnValue('fr'); 66 | 67 | const headerFirst = new LanguageDetector({ 68 | cookie: 'i18next', 69 | param: 'lng', 70 | order: ['header', 'cookie', 'params'], 71 | supportedLngs: ['en', 'es', 'fr'], 72 | fallbackLng: 'en' 73 | }); 74 | 75 | const result = await headerFirst.detect(event); 76 | 77 | expect(result).toBe('es'); 78 | 79 | const cookieFirst = new LanguageDetector({ 80 | cookie: 'i18next', 81 | param: 'lng', 82 | order: ['cookie', 'header', 'params'], 83 | supportedLngs: ['en', 'es', 'fr'], 84 | fallbackLng: 'en' 85 | }); 86 | 87 | const result2 = await cookieFirst.detect(event); 88 | 89 | expect(result2).toBe('fr'); 90 | 91 | const paramsFirst = new LanguageDetector({ 92 | cookie: 'i18next', 93 | param: 'lng', 94 | order: ['params', 'header', 'cookie'], 95 | supportedLngs: ['en', 'es', 'fr'], 96 | fallbackLng: 'en' 97 | }); 98 | 99 | const result3 = await paramsFirst.detect(event); 100 | 101 | expect(result3).toBe('en'); 102 | }); 103 | 104 | test('should detect language from header with multiple languages', async () => { 105 | const event = createEvent({ 106 | url: 'http://localhost:3000', 107 | routeId: 'index', 108 | headers: new Headers({ 'accept-language': 'es-CO, en-US' }) 109 | }); 110 | 111 | const result = await detector.detect(event); 112 | 113 | expect(result).toBe('es'); 114 | }); 115 | 116 | test('should detect language from header with multiple languages and unsupported language', async () => { 117 | const event = createEvent({ 118 | url: 'http://localhost:3000', 119 | routeId: 'index', 120 | headers: new Headers({ 'accept-language': 'fr, en-US' }) 121 | }); 122 | 123 | const result = await detector.detect(event); 124 | 125 | expect(result).toBe('en'); 126 | }); 127 | 128 | test('should fallback to default language if no language is detected', async () => { 129 | const event = createEvent({ 130 | url: 'http://localhost:3000', 131 | routeId: 'index' 132 | }); 133 | 134 | const result = await detector.detect(event); 135 | 136 | expect(result).toBe('en'); 137 | }); 138 | 139 | test('should fallback to default language if detected language is not supported', async () => { 140 | const event = createEvent({ 141 | url: 'http://localhost:3000', 142 | routeId: 'index', 143 | headers: new Headers({ 'accept-language': 'fr' }) 144 | }); 145 | 146 | const result = await detector.detect(event); 147 | 148 | expect(result).toBe('en'); 149 | }); 150 | 151 | test('should fallback to default language if detected language is not supported and multiple languages are sent', async () => { 152 | const event = createEvent({ 153 | url: 'http://localhost:3000', 154 | routeId: 'index', 155 | headers: new Headers({ 'accept-language': 'fr, zh' }) 156 | }); 157 | 158 | const result = await detector.detect(event); 159 | 160 | expect(result).toBe('en'); 161 | }); 162 | }); 163 | -------------------------------------------------------------------------------- /src/test/SvelteI18next.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test, vi } from 'vitest'; 2 | 3 | import { SvelteI18next } from '$lib'; 4 | import { createEvent } from './createEvent'; 5 | 6 | process.cwd = vi.fn().mockReturnValue('/Mock/'); 7 | 8 | class TestSvelteI18next extends SvelteI18next { 9 | protected async resolveRoute(path: string) { 10 | const routes = { 11 | '/Mock/src/routes/+page': { config: { ns: 'rootPageNS' } }, 12 | '/Mock/src/routes/+page.server': { config: { ns: 'rootPageServerNS' } }, 13 | '/Mock/src/routes/+layout': { config: { ns: 'rootLayoutNS' } }, 14 | '/Mock/src/routes/+layout.server': { config: { ns: 'rootLayoutServerNS' } }, 15 | '/Mock/src/routes/a/+page': { config: { ns: 'aPageNS' } }, 16 | '/Mock/src/routes/a/+layout': { config: { ns: 'aLayoutNS' } }, 17 | '/Mock/src/routes/a/b/+page.server': { config: { ns: 'abPageServerNS' } }, 18 | '/Mock/src/routes/a/b/c/+layout.server': { config: { ns: 'abcLayoutServerNS' } }, 19 | '/Mock/src/routes/(A)/+layout': { config: { ns: '(A)aaLayoutNS' } }, 20 | '/Mock/src/routes/(A)/aa/+page.server': { config: { ns: '(A)aaPageServerNS' } }, 21 | '/Mock/src/routes/(A)/(B)/bb/+page.server': { config: { ns: '(A)(B)bbPageServerNS' } } 22 | }; 23 | 24 | return routes[path as keyof typeof routes] || {}; 25 | } 26 | } 27 | 28 | describe('SvelteI18next', () => { 29 | const instance = new TestSvelteI18next({ 30 | i18next: { 31 | defaultNS: 'translation', 32 | supportedLngs: ['en', 'es'], 33 | resources: { 34 | en: { 35 | translation: { 36 | key: 'key' 37 | } 38 | }, 39 | es: { 40 | translation: { 41 | key: 'Schlüssel' 42 | } 43 | } 44 | } 45 | } 46 | }); 47 | 48 | test('should be defined', () => { 49 | expect(SvelteI18next).toBeDefined(); 50 | }); 51 | 52 | test.each` 53 | routeId | expected 54 | ${'/'} | ${['translation', 'rootPageNS', 'rootPageServerNS', 'rootLayoutNS', 'rootLayoutServerNS']} 55 | ${'/a'} | ${['translation', 'aPageNS', 'aLayoutNS', 'rootLayoutNS', 'rootLayoutServerNS']} 56 | ${'/a/b'} | ${['translation', 'abPageServerNS', 'aLayoutNS', 'rootLayoutNS', 'rootLayoutServerNS']} 57 | ${'/a/b/c'} | ${['translation', 'abcLayoutServerNS', 'aLayoutNS', 'rootLayoutNS', 'rootLayoutServerNS']} 58 | ${'/(A)/aa'} | ${['translation', '(A)aaPageServerNS', '(A)aaLayoutNS', 'rootLayoutNS', 'rootLayoutServerNS']} 59 | ${'/(A)/(B)/bb'} | ${['translation', '(A)(B)bbPageServerNS', '(A)aaLayoutNS', 'rootLayoutNS', 'rootLayoutServerNS']} 60 | `('should provide a the right namespaces for $routeId', async ({ routeId, expected }) => { 61 | const event = createEvent({ 62 | url: 'http://localhost:3000/' + routeId, 63 | routeId 64 | }); 65 | 66 | const ns = await instance.getNamespaces(event); 67 | 68 | expect(ns).toEqual(expected); 69 | }); 70 | 71 | test('should provide a fixedT function', async () => { 72 | const event = createEvent({ 73 | url: 'http://localhost:3000/', 74 | routeId: '/' 75 | }); 76 | 77 | const fixedT = await instance.getFixedT(event); 78 | 79 | expect(fixedT).toBeDefined(); 80 | expect(fixedT('key')).toEqual('key'); 81 | }); 82 | 83 | test('should provide a fixedT function with a custom namespace', async () => { 84 | const event = createEvent({ 85 | url: 'http://localhost:3000/', 86 | routeId: '/' 87 | }); 88 | 89 | const fixedT = await instance.getFixedT(event, { namespaces: ['a', 'b'] }); 90 | 91 | expect(fixedT).toBeDefined(); 92 | expect(fixedT('key')).toEqual('key'); 93 | expect('ns' in fixedT && fixedT['ns']).toEqual(['a', 'b']); 94 | }); 95 | 96 | test('should provide a fixedT function with a custom locale', async () => { 97 | const event = createEvent({ 98 | url: 'http://localhost:3000/', 99 | routeId: '/' 100 | }); 101 | 102 | const fixedT = await instance.getFixedT(event, { locale: 'es' }); 103 | 104 | expect(fixedT).toBeDefined(); 105 | expect(fixedT('key')).toEqual('Schlüssel'); 106 | expect('lng' in fixedT && fixedT['lng']).toEqual('es'); 107 | }); 108 | 109 | test('should provide a fixedT function with a custom options', async () => { 110 | const event = createEvent({ 111 | url: 'http://localhost:3000/', 112 | routeId: '/' 113 | }); 114 | 115 | const fixedT = await instance.getFixedT(event, { 116 | locale: 'fr', 117 | options: { fallbackLng: 'en' } 118 | }); 119 | 120 | expect(fixedT).toBeDefined(); 121 | expect(fixedT('key')).toEqual('key'); 122 | }); 123 | 124 | test('should detect the locale from the event', async () => { 125 | const event = createEvent({ 126 | url: 'http://localhost:3000/', 127 | routeId: '/', 128 | headers: new Headers({ 129 | 'accept-language': 'es' 130 | }) 131 | }); 132 | 133 | const locale = await instance.getLocale(event); 134 | 135 | expect(locale).toEqual('es'); 136 | 137 | const event2 = createEvent({ 138 | url: 'http://localhost:3000/', 139 | routeId: '/', 140 | params: { 141 | lng: 'es' 142 | } 143 | }); 144 | 145 | const locale2 = await instance.getLocale(event2); 146 | 147 | expect(locale2).toEqual('es'); 148 | 149 | const event3 = createEvent({ 150 | url: 'http://localhost:3000/', 151 | routeId: '/' 152 | }); 153 | 154 | event3.cookies.get = vi.fn((name: string) => { 155 | if (name === 'i18next') return 'es'; 156 | return undefined; 157 | }); 158 | 159 | const locale3 = await instance.getLocale(event3); 160 | 161 | expect(locale3).toEqual('es'); 162 | }); 163 | }); 164 | -------------------------------------------------------------------------------- /src/lib/i18n.ts: -------------------------------------------------------------------------------- 1 | import { 2 | createInstance, 3 | type InitOptions, 4 | type NewableModule, 5 | type BackendModule, 6 | type Namespace, 7 | type i18n 8 | } from 'i18next'; 9 | 10 | import type { Cookies } from '@sveltejs/kit'; 11 | 12 | import LanguageDetector, { 13 | type LanguageDetectorOptions, 14 | type Params, 15 | type EventLike 16 | } from './detector'; 17 | 18 | import { join } from '$lib/utils/misc'; 19 | 20 | /** 21 | * `SvelteI18nextOptions` 22 | * 23 | * @property {InitOptions} i18next - InitOptions 24 | * @property {BackendModule} - The backend module to use. 25 | * @property {LanguageDetectorOptions} detector - This is the language detector config. 26 | */ 27 | export type SvelteI18nextOptions = { 28 | i18next: InitOptions; 29 | backend?: NewableModule>; 30 | detector?: LanguageDetectorOptions; 31 | }; 32 | 33 | /** 34 | * `DetectOptions` 35 | * 36 | * @property {Cookies} cookies - The cookies that were sent with the request. 37 | * @property {Params} params - The parameters of the request. 38 | * @property {Request} request - The request object 39 | */ 40 | export type DetectOptions = { cookies: Cookies; params: Params; request: Request }; 41 | 42 | export default class SvelteI18next { 43 | private detector: LanguageDetector; 44 | 45 | constructor(private options: SvelteI18nextOptions) { 46 | this.detector = new LanguageDetector({ 47 | ...options.detector, 48 | supportedLngs: options.detector?.supportedLngs ?? this.options.i18next.supportedLngs, 49 | fallbackLng: options.detector?.fallbackLng ?? this.options.i18next.fallbackLng 50 | }); 51 | } 52 | 53 | private async createInstance(options: InitOptions) { 54 | let instance = createInstance(); 55 | 56 | const initOptions = { ...this.options.i18next, ...options }; 57 | 58 | if (this.options.backend) instance = instance.use(this.options.backend); 59 | 60 | await instance.init({ 61 | ...initOptions, 62 | backend: { 63 | ...initOptions.backend 64 | } 65 | }); 66 | 67 | return instance; 68 | } 69 | 70 | protected async resolveRoute(path: string) { 71 | try { 72 | const { config } = await import(path /* @vite-ignore */); 73 | 74 | return { config }; 75 | } catch { 76 | return {}; 77 | } 78 | } 79 | 80 | /** 81 | * It returns the options that will be passed to the i18next client instance 82 | * @param {i18n} instance - i18n - the instance of the i18n class 83 | */ 84 | public getInitOptions(instance: i18n) { 85 | const resources = instance.store.data; 86 | const { backend, ...initOptions } = this.options.i18next; 87 | 88 | return { 89 | ...initOptions, 90 | resources, 91 | lng: instance.language, 92 | ns: instance.options.ns, 93 | fallbackLng: instance.store.options.fallbackLng 94 | }; 95 | } 96 | 97 | /** 98 | * It returns the locale of the user following the order defined on the 99 | * detector order config key (`e.g: ['params', 'cookie', 'header']`) or fallback language 100 | * provided in the i18next config. 101 | * 102 | * @param {EventLike} event - EventLike - The event to detect the locale from. 103 | * @returns The locale of the user. 104 | */ 105 | public async getLocale(event: EventLike) { 106 | return this.detector.detect(event); 107 | } 108 | 109 | /** 110 | * If the route has a namespace, return it, otherwise return the default namespace 111 | * @param {EventLike} event - EventLike - This is the event that is passed to the handler. 112 | * @returns An array of namespaces. 113 | */ 114 | public async getNamespaces(event: EventLike): Promise { 115 | if (!event.route.id) return []; 116 | 117 | const ns = this.options.i18next.ns ?? this.options.i18next.defaultNS; 118 | const namespaces = Array.isArray(ns) ? [...ns] : [ns]; 119 | const route = event.route.id; 120 | const paths = ['', ...route.slice(1).split('/').filter(Boolean)]; 121 | const cwd = process.cwd(); 122 | const self = this; 123 | 124 | async function addNamespace(path: string) { 125 | const file = await self.resolveRoute(path); 126 | if (!file?.config?.ns) return; 127 | 128 | const config = file.config; 129 | if (typeof config.ns === 'string') namespaces.push(config.ns); 130 | else namespaces.push(...config.ns); 131 | } 132 | 133 | await addNamespace(join(cwd, '/src/routes/', `${route}`, '/+page')); 134 | await addNamespace(join(cwd, '/src/routes/', `${route}`, '/+page.server')); 135 | 136 | while (paths.length > 0) { 137 | const route = paths.join('/'); 138 | await addNamespace(join(cwd, '/src/routes/', `${route}`, '/+layout')); 139 | await addNamespace(join(cwd, '/src/routes/', `${route}`, '/+layout.server')); 140 | paths.pop(); 141 | } 142 | 143 | return [...new Set(namespaces)].filter(Boolean); 144 | } 145 | 146 | /** 147 | * It creates an i18next instance, changes the language to the one specified in the options or the 148 | * one returned by the getLocale function, and returns the fixedT function 149 | * 150 | * @param {EventLike} event - The event object that was passed to the handler. 151 | * @param options 152 | * @param {string} options.locale - fixed locale string 153 | * @param {Namespace} options.namespace - override default namespace 154 | * @param {InitOptions} options.options - init options forwarded to the i18next instance 155 | * 156 | * @returns A function that returns a translation for a given key. 157 | */ 158 | public async getFixedT( 159 | event: EventLike, 160 | options: { 161 | locale?: string; 162 | namespaces?: N; 163 | options?: InitOptions; 164 | } = {} 165 | ) { 166 | const ns = options.namespaces ?? (this.options.i18next.defaultNS as string); 167 | 168 | const [instance, lng] = await Promise.all([ 169 | this.createInstance({ 170 | ...this.options.i18next, 171 | ...options.options, 172 | ns 173 | }), 174 | 175 | options.locale ?? (await this.getLocale(event)) 176 | ]); 177 | 178 | await instance.changeLanguage(lng); 179 | 180 | return instance.getFixedT(lng, options.namespaces); 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /src/test/Trans.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, test, expect, vi } from 'vitest'; 2 | import { act, render } from '@testing-library/svelte'; 3 | import { createInstance } from 'i18next'; 4 | 5 | import Trans from '$lib/Trans.svelte'; 6 | import TransWithContext from './WithContext.svelte'; 7 | import Link from './Link.svelte'; 8 | import { store } from './i18n'; 9 | import { createStore } from '$lib/store'; 10 | 11 | describe('', () => { 12 | test.each` 13 | key | props | expected 14 | ${'simple_text'} | ${{}} | ${'Simple text'} 15 | ${'interpolation'} | ${{ values: { name: 'John' } }} | ${'Hello John'} 16 | ${'interpolation_function'} | ${{ values: { name: 'John' } }} | ${'Hello JOHN'} 17 | ${'numeric_tag'} | ${{ components: ['strong'] }} | ${'Hello world'} 18 | ${'named_tag'} | ${{ components: { a: 'strong' } }} | ${'Hello world'} 19 | ${'numeric_tag_twice'} | ${{ components: ['strong'] }} | ${'Hello world and universe'} 20 | ${'named_tag_twice'} | ${{ components: { a: 'strong' } }} | ${'Hello world and universe'} 21 | ${'nested_tags'} | ${{ components: ['strong', 'i'] }} | ${'This is bold and italic'} 22 | ${'svelte_component'} | ${{ components: [Link] }} | ${'This is a svelte component'} 23 | ${'interpolation_with_tag'} | ${{ values: { name: 'John' }, components: ['strong'] }} | ${'Hello John'} 24 | ${'interpolation_with_nested_tags'} | ${{ values: { name: 'John' }, components: ['strong', 'i'] }} | ${'Hello John'} 25 | ${'interpolation_with_svelte_component'} | ${{ values: { name: 'John' }, components: [Link, 'strong'] }} | ${'Hello John'} 26 | ${'interpolation_with_svelte_component_and_nested_tags'} | ${{ values: { name: 'John' }, components: [Link, 'strong'] }} | ${'Hello John'} 27 | ${'greeting'} | ${{ values: { name: 'John' }, context: 'male' }} | ${'Hello Mr. John'} 28 | ${'greeting'} | ${{ values: { name: 'Jane' }, context: 'female' }} | ${'Hello Mrs. Jane'} 29 | ${'count'} | ${{ count: 1 }} | ${'You have 1 message'} 30 | ${'count'} | ${{ count: 2 }} | ${'You have 2 messages'} 31 | ${'array_elements'} | ${{ tOptions: { joinArrays: ' ' } }} | ${'Hello world'} 32 | `('should render "$key" key', async ({ key, props, expected }) => { 33 | const { container } = render(Trans, { props: { i18n: store, key, ...props } }); 34 | 35 | expect(container.textContent).toBe(expected); 36 | }); 37 | 38 | test('should render html component', async () => { 39 | render(Trans, { props: { i18n: store, key: 'numeric_tag', components: ['strong'] } }); 40 | 41 | expect(document.querySelector('strong')).toBeInTheDocument(); 42 | expect(document.querySelector('strong')).toHaveTextContent('world'); 43 | }); 44 | 45 | test('should render svelte component', async () => { 46 | render(Trans, { props: { i18n: store, key: 'numeric_tag', components: [Link] } }); 47 | 48 | expect(document.querySelector('a')).toBeInTheDocument(); 49 | expect(document.querySelector('a')).toHaveTextContent('world'); 50 | }); 51 | 52 | test('should pass down props to component', async () => { 53 | render(Trans, { 54 | props: { 55 | i18n: store, 56 | key: 'nested_tags', 57 | components: [ 58 | { component: 'strong', props: { class: 'bold' } }, 59 | { component: Link, props: { href: 'https://example.com' } } 60 | ] 61 | } 62 | }); 63 | 64 | expect(document.querySelector('strong')).toBeInTheDocument(); 65 | expect(document.querySelector('strong')).toHaveClass('bold'); 66 | expect(document.querySelector('a')).toBeInTheDocument(); 67 | expect(document.querySelector('a')).toHaveAttribute('href', 'https://example.com'); 68 | }); 69 | 70 | test('should render named tag', async () => { 71 | render(Trans, { 72 | props: { 73 | i18n: store, 74 | defaultValue: 'Hello world and universe', 75 | components: { 76 | a: { component: 'strong', props: { class: 'bold' } }, 77 | b: { component: 'i', props: { class: 'italic' } } 78 | } 79 | } 80 | }); 81 | 82 | expect(document.querySelector('strong')).toBeInTheDocument(); 83 | expect(document.querySelector('strong')).toHaveClass('bold'); 84 | expect(document.querySelector('i')).toBeInTheDocument(); 85 | expect(document.querySelector('i')).toHaveClass('italic'); 86 | }); 87 | 88 | test('should warn when missing tag', async () => { 89 | window.console.warn = vi.fn(); 90 | 91 | render(Trans, { 92 | props: { 93 | i18n: store, 94 | key: 'missing_tag' 95 | } 96 | }); 97 | 98 | expect(window.console.warn).toHaveBeenCalled(); 99 | expect(window.console.warn).toHaveBeenCalledWith( 100 | 'svelte-i18next:: No component found for tag <0>.' 101 | ); 102 | }); 103 | 104 | test('should render key from other namespace', async () => { 105 | render(Trans, { 106 | props: { 107 | i18n: store, 108 | key: 'simple_text', 109 | ns: 'other' 110 | } 111 | }); 112 | 113 | expect(document.body).toHaveTextContent('Simple text (other)'); 114 | }); 115 | 116 | test('should render key from other language', async () => { 117 | render(Trans, { 118 | props: { 119 | i18n: store, 120 | key: 'simple_text', 121 | tOptions: { 122 | lng: 'es' 123 | } 124 | } 125 | }); 126 | 127 | expect(document.body).toHaveTextContent('Texto simple'); 128 | }); 129 | 130 | test('should allow to override t function', async () => { 131 | const instance = createInstance(); 132 | instance.init({ 133 | lng: 'en', 134 | fallbackLng: 'en', 135 | resources: { 136 | en: { 137 | translation: { 138 | simple_text: 'Simple text with custom t function' 139 | } 140 | } 141 | } 142 | }); 143 | 144 | render(Trans, { 145 | props: { 146 | i18n: store, 147 | key: 'simple_text', 148 | t: instance.t.bind(instance) 149 | } 150 | }); 151 | 152 | expect(document.body).toHaveTextContent('Simple text with custom t function'); 153 | }); 154 | 155 | test('should use default value when key is missing', async () => { 156 | render(Trans, { 157 | props: { 158 | i18n: store, 159 | key: 'missing_key', 160 | defaultValue: 'Default value' 161 | } 162 | }); 163 | 164 | expect(document.body).toHaveTextContent('Default value'); 165 | }); 166 | 167 | test('should use i18n instance from context', async () => { 168 | render(TransWithContext, { 169 | props: { 170 | key: 'simple_text' 171 | } 172 | }); 173 | 174 | expect(document.body).toHaveTextContent('Simple text'); 175 | }); 176 | 177 | test('should update content when i18n instance changes', async () => { 178 | const instance = createInstance(); 179 | 180 | instance.init({ 181 | lng: 'en', 182 | fallbackLng: 'en', 183 | resources: { 184 | en: { 185 | translation: { 186 | simple_text: 'Simple text' 187 | } 188 | }, 189 | es: { 190 | translation: { 191 | simple_text: 'Texto simple' 192 | } 193 | } 194 | } 195 | }); 196 | 197 | render(Trans, { 198 | props: { 199 | i18n: createStore(instance), 200 | key: 'simple_text' 201 | } 202 | }); 203 | 204 | expect(document.body).toHaveTextContent('Simple text'); 205 | 206 | await act(() => { 207 | instance.changeLanguage('es'); 208 | }); 209 | 210 | expect(document.body).toHaveTextContent('Texto simple'); 211 | }); 212 | }); 213 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Svelte.i18next 2 | 3 | ![License](https://img.shields.io/github/license/maximux13/svelte-i18next) 4 | ![Downloads](https://img.shields.io/npm/dm/@maximux13/svelte-i18next) 5 | ![Version](https://img.shields.io/npm/v/@maximux13/svelte-i18next) 6 | 7 | ## Table of Contents 8 | 9 | - [Introduction](#introduction) 10 | - [Installation](#installation) 11 | - [Configuration](#configuration) 12 | - [Usage](#usage) 13 | - [Advanced Features](#advanced-features) 14 | - [Managing Namespaces](#managing-namespaces) 15 | - [getFixedT](#getfixedt) 16 | - [Trans Component](#trans-component) 17 | - [Acknowledgements](#acknowledgements) 18 | - [Troubleshooting](#troubleshooting) 19 | - [License](#license) 20 | 21 | ## Introduction 22 | 23 | [Svelte.i18next](https://github.com/maximux13/svelte-i18next) is a library that makes it easy to add internationalization (i18n) support to your [SvelteKit](https://kit.svelte.dev/). It provides a simple interface for configuring [i18next](https://www.i18next.com/) and managing translations. 24 | 25 | ## Installation 26 | 27 | To install Svelte.i18next, simply run: 28 | 29 | ```bash 30 | pnpm install @maximux13/svelte-i18next i18next i18next-browser-languagedetector i18next-http-backend 31 | ``` 32 | 33 | ## Configuration 34 | 35 | To set up Svelte.i18next in your project, you'll need to go through the following configuration steps: 36 | 37 | ### i18n Config File 38 | 39 | Step 1: Create an i18n Configuration File 40 | 41 | Create a file named src/i18n.ts and populate it with the i18n configuration. Here is an example: 42 | 43 | ```ts 44 | export default { 45 | supportedLngs: ['en', 'es'], // Supported languages 46 | fallbackLng: 'en', // Fallback language 47 | defaultNS: 'common' // Default namespace 48 | }; 49 | ``` 50 | 51 | ### Locale Files 52 | 53 | Step 2: Create Locale Files 54 | 55 | Create locale JSON files inside the static/locales/{lng}/{ns}.json directory. Replace {lng} with the language code (e.g., en, es) and {ns} with the namespace (e.g., common). 56 | 57 | Example content for `static/locales/en/common.json`: 58 | 59 | ```json 60 | { 61 | "title": "Svelte i18next - Hello {{name}}!", 62 | "world": "World" 63 | } 64 | ``` 65 | 66 | ### Server Initialization 67 | 68 | Step 3: Initialize SvelteI18next Instance 69 | 70 | In your src/i18n.server.ts, initialize a new SvelteI18next instance as shown below: 71 | 72 | ```ts 73 | // src/i18n.server.ts 74 | import Backend from 'i18next-http-backend'; 75 | import { SvelteI18next } from '@maximux13/svelte-i18next'; 76 | import i18n from './i18n'; 77 | 78 | const i18next = new SvelteI18next({ 79 | i18next: { 80 | ...i18n, 81 | backend: { loadPath: '/locales/{{lng}}/{{ns}}.json' } 82 | }, 83 | backend: Backend 84 | }); 85 | 86 | export default i18next; 87 | ``` 88 | 89 | ### Add Server Hook 90 | 91 | Step 4: Add Server Hook 92 | 93 | Create a server hook to initialize i18next in src/hook.server.ts: 94 | 95 | ```ts 96 | import type { Handle } from '@sveltejs/kit'; 97 | import { createInstance } from 'i18next'; 98 | import Backend from 'i18next-http-backend'; 99 | 100 | import i18n from './i18n'; 101 | import i18next from './i18n.server'; 102 | 103 | import { createFetchRequest } from '@maximux13/svelte-i18next'; 104 | 105 | export const handle: Handle = async (props) => { 106 | const { event, resolve } = props; 107 | 108 | const instance = createInstance(); 109 | const lng = await i18next.getLocale(event); 110 | const ns = await i18next.getNamespaces(event); 111 | const request = createFetchRequest(event.fetch); 112 | 113 | await instance 114 | .use(Backend) 115 | .init({ ...i18n, backend: { loadPath: '/locales/{{lng}}/{{ns}}.json', request }, lng, ns }); 116 | 117 | const initOptions = i18next.getInitOptions(instance); 118 | 119 | event.locals.i18n = Object.assign(instance, { initOptions }); 120 | 121 | return resolve(event, { 122 | transformPageChunk: ({ html }) => html.replace('', ``) 123 | }); 124 | }; 125 | ``` 126 | 127 | ### Client Initialization 128 | 129 | Step 5: Client Instance Setup 130 | 131 | Finally, set up a client instance to expose i18next functionalities in your code. For example, in src/routes/+layout.server.ts and src/routes/+layout.ts: 132 | 133 | `src/routes/+layout.server.ts` 134 | 135 | ```ts 136 | import type { LayoutServerLoad } from './$types'; 137 | 138 | export const load: LayoutServerLoad = async ({ locals, depends }) => { 139 | depends('i18n:lng'); 140 | 141 | return { i18n: locals.i18n.initOptions }; 142 | }; 143 | ``` 144 | 145 | `src/routes/+layout.ts` 146 | 147 | ```ts 148 | import type { LayoutLoad } from './$types'; 149 | 150 | import i18next from 'i18next'; 151 | import Backend from 'i18next-http-backend'; 152 | import LanguageDetector from 'i18next-browser-languagedetector'; 153 | 154 | import { createStore } from '@maximux13/svelte-i18next'; 155 | 156 | export const load: LayoutLoad = async ({ data }) => { 157 | i18next 158 | .use(Backend) 159 | .use(LanguageDetector) 160 | .init({ 161 | ...data.i18n, 162 | detection: { caches: ['cookie'], order: ['htmlTag'] } 163 | }); 164 | 165 | const store = createStore(i18next); 166 | 167 | return { i18n: store }; 168 | }; 169 | ``` 170 | 171 | ## Usage 172 | 173 | Once you've completed the [Configuration](#configuration) steps, you can start using Svelte.i18next in your Svelte components and server-side code. 174 | 175 | ### In Svelte Components 176 | 177 | You can use the i18n store in your Svelte components to access translations. Here's an example: 178 | 179 | ```svelte 180 | 185 | 186 |

{$i18n.t('title', { name: $i18n.t('world') })}

187 | ``` 188 | 189 | ### In Svelte Server Code 190 | 191 | You can also use i18n functionalities in your server-side code. For instance: 192 | 193 | ```ts 194 | // Example in a server-side Svelte file 195 | import type { PageServerLoad } from './$types'; 196 | 197 | export const load: PageServerLoad = async ({ locals, depends }) => { 198 | depends('i18n:lng'); 199 | 200 | return { world: locals.i18n.t('world') }; 201 | }; 202 | ``` 203 | 204 | **Note**: We use `depends('i18n:lng');` to invalidate the data when the language changes. This invalidation is triggered by the i18n store when calling `$i18n.changeLanguage` method. 205 | 206 | ## Advanced Features 207 | 208 | ### Managing Namespaces 209 | 210 | To manage namespaces, specify which namespaces should be loaded on each page by setting the `ns` property in your page or layout configuration. For example: 211 | 212 | ```ts 213 | // src/routes/page.(server).ts 214 | export const config = { 215 | ns: ['page'] 216 | }; 217 | ``` 218 | 219 | This will load the `page` namespace for the corresponding page. You can also use an array to load multiple namespaces: 220 | 221 | ```ts 222 | export const config = { 223 | ns: ['page', 'otherNamespace'] 224 | }; 225 | ``` 226 | 227 | ### getFixedT 228 | 229 | The `getFixedT` function allows you to use a fixed translation function in your server-side code. Example: 230 | 231 | ```ts 232 | // Inside a server-side Svelte file 233 | export function GET(event) { 234 | const t = i18next.getFixedT(event, { locale: 'en', namespaces: 'test', options: {} }); 235 | return new Response(t('title')); 236 | } 237 | ``` 238 | 239 | ### Trans Component 240 | 241 | The `Trans` component provides a convenient way to include complex translations with HTML tags and Svelte components. 242 | 243 | **Props** 244 | 245 | | Prop | Type | Description | 246 | | ------------ | ------------ | --------------------------------------------------------- | 247 | | i18n | i18n | i18n store instance (required if not wrapped in provider) | 248 | | t | i18n.t | Custom translation function | 249 | | tOptions | object | Options to pass to the translation function | 250 | | key | string | Translation key | 251 | | values | object | Values for interpolation | 252 | | count | number | Count for pluralization | 253 | | context | string | Context for pluralization | 254 | | ns | string | Namespace | 255 | | defaultValue | string | Default value | 256 | | components | array/object | Components to be used for interpolation | 257 | 258 | For detailed usage of the `Trans` component, please refer to [this section](#trans-component-usage). 259 | 260 | ### Trans Component Usage 261 | 262 | The `Trans` component is designed to handle more complex translations that may include HTML tags, variables, and even Svelte components. Below are some examples and use-cases where you might find the `Trans` component useful. 263 | 264 | #### Basic Usage 265 | 266 | At its simplest, the `Trans` component can be used to translate static text. 267 | 268 | ```svelte 269 | 270 | ``` 271 | 272 | #### With Variables 273 | 274 | You can also pass variables for interpolation. 275 | 276 | ```svelte 277 | 278 | ``` 279 | 280 | #### With HTML Tags 281 | 282 | HTML tags can be included in the translation string and mapped to actual HTML tags using the `components` prop. 283 | 284 | **Example translation string**: `Click here` 285 | 286 | ```svelte 287 | 288 | ``` 289 | 290 | #### Different Ways to Declare Components 291 | 292 | ##### As a String 293 | 294 | You can declare the component as a string, representing the HTML tag name. 295 | 296 | ```svelte 297 | 298 | ``` 299 | 300 | ##### As an Object 301 | 302 | You can also declare the component as an object, providing more options including props. 303 | 304 | ```svelte 305 | 311 | ``` 312 | 313 | ##### As a Svelte Component 314 | 315 | You can use a Svelte component directly and pass props to it. 316 | 317 | ```svelte 318 | 324 | ``` 325 | 326 | #### `components` as an Array or Object 327 | 328 | The `components` prop can either be an array or an object, depending on your needs. 329 | 330 | ##### As an Array 331 | 332 | When declared as an array, the components will replace the tags in the order they appear in the translation string. 333 | 334 | **Translation string**: `Hello <0>World and <1>universe` 335 | 336 | ```svelte 337 | 338 | ``` 339 | 340 | ##### As an Object 341 | 342 | When declared as an object, you can use meaningful keys to represent your tags, making your code more readable. 343 | 344 | **Translation string**: `Hello World and universe` 345 | 346 | ```svelte 347 | 348 | ``` 349 | 350 | #### Passing Props to Components 351 | 352 | You can pass additional props to the components by using the object notation. 353 | 354 | ```svelte 355 | 362 | ``` 363 | 364 | #### Advanced Props 365 | 366 | The `Trans` component also accepts a number of advanced props like `count`, `context`, `defaultValue`, and so on. 367 | 368 | ```svelte 369 | 370 | ``` 371 | 372 | This could translate to "5 items" depending on your translation string and pluralization rules. 373 | 374 | ## Acknowledgements 375 | 376 | This library was inspired by the excellent work of SergioDXA on the [remix-i18next](https://github.com/sergiodxa/remix-i18next) library. Special thanks to all contributors and users for their support and feedback. 377 | 378 | ## Troubleshooting 379 | 380 | If you encounter any issues while using Svelte.i18next, please refer to the following resources for guidance: 381 | 382 | - **Documentation**: Make sure to read the documentation carefully for any configuration or usage details you might have missed. 383 | - **GitHub Issues**: Feel free to open an issue on our [GitHub repository](https://github.com/maximux13/svelte-i18next/issues) if you encounter bugs or have feature requests. 384 | - **Community Support**: For general questions and discussions, you can join the [Svelte community](https://svelte.dev/chat) or other relevant forums. 385 | 386 | ## License 387 | 388 | This project is licensed under the MIT License. For more details, see the [LICENSE](LICENSE) file in the repository. 389 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | accept-language-parser: 9 | specifier: ^1.5.0 10 | version: 1.5.0 11 | intl-parse-accept-language: 12 | specifier: ^1.0.0 13 | version: 1.0.0 14 | 15 | devDependencies: 16 | '@sveltejs/adapter-auto': 17 | specifier: ^2.0.0 18 | version: 2.0.0(@sveltejs/kit@1.25.0) 19 | '@sveltejs/kit': 20 | specifier: ^1.25.0 21 | version: 1.25.0(svelte@4.2.0)(vite@4.1.4) 22 | '@sveltejs/package': 23 | specifier: ^2.2.2 24 | version: 2.2.2(svelte@4.2.0)(typescript@4.9.5) 25 | '@testing-library/dom': 26 | specifier: ^9.3.3 27 | version: 9.3.3 28 | '@testing-library/jest-dom': 29 | specifier: ^6.1.3 30 | version: 6.1.3(vitest@0.34.6) 31 | '@testing-library/svelte': 32 | specifier: ^4.0.3 33 | version: 4.0.3(svelte@4.2.0) 34 | '@types/accept-language-parser': 35 | specifier: ^1.5.3 36 | version: 1.5.3 37 | '@types/testing-library__jest-dom': 38 | specifier: ^6.0.0 39 | version: 6.0.0(vitest@0.34.6) 40 | '@typescript-eslint/eslint-plugin': 41 | specifier: ^5.54.0 42 | version: 5.54.0(@typescript-eslint/parser@5.54.0)(eslint@8.35.0)(typescript@4.9.5) 43 | '@typescript-eslint/parser': 44 | specifier: ^5.54.0 45 | version: 5.54.0(eslint@8.35.0)(typescript@4.9.5) 46 | '@vitest/coverage-v8': 47 | specifier: ^0.34.6 48 | version: 0.34.6(vitest@0.34.6) 49 | eslint: 50 | specifier: ^8.28.0 51 | version: 8.35.0 52 | eslint-config-prettier: 53 | specifier: ^8.5.0 54 | version: 8.6.0(eslint@8.35.0) 55 | eslint-plugin-svelte: 56 | specifier: 2.36.0-next.2 57 | version: 2.36.0-next.2(eslint@8.35.0)(svelte@4.2.0) 58 | i18next: 59 | specifier: ^22.5.1 60 | version: 22.5.1 61 | i18next-browser-languagedetector: 62 | specifier: ^7.1.0 63 | version: 7.1.0 64 | i18next-fs-backend: 65 | specifier: ^2.2.0 66 | version: 2.2.0 67 | i18next-http-backend: 68 | specifier: ^2.2.2 69 | version: 2.2.2 70 | jsdom: 71 | specifier: ^22.1.0 72 | version: 22.1.0 73 | prettier: 74 | specifier: ^3.1.0 75 | version: 3.1.0 76 | prettier-plugin-svelte: 77 | specifier: ^3.1.2 78 | version: 3.1.2(prettier@3.1.0)(svelte@4.2.0) 79 | publint: 80 | specifier: ^0.1.9 81 | version: 0.1.9 82 | svelte: 83 | specifier: ^4.2.0 84 | version: 4.2.0 85 | svelte-check: 86 | specifier: ^3.5.2 87 | version: 3.5.2(postcss@8.4.31)(svelte@4.2.0) 88 | tslib: 89 | specifier: ^2.4.1 90 | version: 2.5.0 91 | typescript: 92 | specifier: ^4.9.3 93 | version: 4.9.5 94 | vite: 95 | specifier: ^4.0.0 96 | version: 4.1.4(@types/node@20.8.3) 97 | vitest: 98 | specifier: 0.34.6 99 | version: 0.34.6(jsdom@22.1.0) 100 | 101 | packages: 102 | 103 | /@adobe/css-tools@4.3.1: 104 | resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} 105 | dev: true 106 | 107 | /@ampproject/remapping@2.2.1: 108 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 109 | engines: {node: '>=6.0.0'} 110 | dependencies: 111 | '@jridgewell/gen-mapping': 0.3.3 112 | '@jridgewell/trace-mapping': 0.3.19 113 | dev: true 114 | 115 | /@babel/code-frame@7.22.13: 116 | resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} 117 | engines: {node: '>=6.9.0'} 118 | dependencies: 119 | '@babel/highlight': 7.22.20 120 | chalk: 2.4.2 121 | dev: true 122 | 123 | /@babel/helper-validator-identifier@7.22.20: 124 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 125 | engines: {node: '>=6.9.0'} 126 | dev: true 127 | 128 | /@babel/highlight@7.22.20: 129 | resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} 130 | engines: {node: '>=6.9.0'} 131 | dependencies: 132 | '@babel/helper-validator-identifier': 7.22.20 133 | chalk: 2.4.2 134 | js-tokens: 4.0.0 135 | dev: true 136 | 137 | /@babel/runtime@7.21.0: 138 | resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} 139 | engines: {node: '>=6.9.0'} 140 | dependencies: 141 | regenerator-runtime: 0.13.11 142 | dev: true 143 | 144 | /@bcoe/v8-coverage@0.2.3: 145 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 146 | dev: true 147 | 148 | /@esbuild/android-arm64@0.16.17: 149 | resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} 150 | engines: {node: '>=12'} 151 | cpu: [arm64] 152 | os: [android] 153 | requiresBuild: true 154 | dev: true 155 | optional: true 156 | 157 | /@esbuild/android-arm@0.16.17: 158 | resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} 159 | engines: {node: '>=12'} 160 | cpu: [arm] 161 | os: [android] 162 | requiresBuild: true 163 | dev: true 164 | optional: true 165 | 166 | /@esbuild/android-x64@0.16.17: 167 | resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} 168 | engines: {node: '>=12'} 169 | cpu: [x64] 170 | os: [android] 171 | requiresBuild: true 172 | dev: true 173 | optional: true 174 | 175 | /@esbuild/darwin-arm64@0.16.17: 176 | resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} 177 | engines: {node: '>=12'} 178 | cpu: [arm64] 179 | os: [darwin] 180 | requiresBuild: true 181 | dev: true 182 | optional: true 183 | 184 | /@esbuild/darwin-x64@0.16.17: 185 | resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} 186 | engines: {node: '>=12'} 187 | cpu: [x64] 188 | os: [darwin] 189 | requiresBuild: true 190 | dev: true 191 | optional: true 192 | 193 | /@esbuild/freebsd-arm64@0.16.17: 194 | resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} 195 | engines: {node: '>=12'} 196 | cpu: [arm64] 197 | os: [freebsd] 198 | requiresBuild: true 199 | dev: true 200 | optional: true 201 | 202 | /@esbuild/freebsd-x64@0.16.17: 203 | resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} 204 | engines: {node: '>=12'} 205 | cpu: [x64] 206 | os: [freebsd] 207 | requiresBuild: true 208 | dev: true 209 | optional: true 210 | 211 | /@esbuild/linux-arm64@0.16.17: 212 | resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} 213 | engines: {node: '>=12'} 214 | cpu: [arm64] 215 | os: [linux] 216 | requiresBuild: true 217 | dev: true 218 | optional: true 219 | 220 | /@esbuild/linux-arm@0.16.17: 221 | resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} 222 | engines: {node: '>=12'} 223 | cpu: [arm] 224 | os: [linux] 225 | requiresBuild: true 226 | dev: true 227 | optional: true 228 | 229 | /@esbuild/linux-ia32@0.16.17: 230 | resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} 231 | engines: {node: '>=12'} 232 | cpu: [ia32] 233 | os: [linux] 234 | requiresBuild: true 235 | dev: true 236 | optional: true 237 | 238 | /@esbuild/linux-loong64@0.16.17: 239 | resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} 240 | engines: {node: '>=12'} 241 | cpu: [loong64] 242 | os: [linux] 243 | requiresBuild: true 244 | dev: true 245 | optional: true 246 | 247 | /@esbuild/linux-mips64el@0.16.17: 248 | resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} 249 | engines: {node: '>=12'} 250 | cpu: [mips64el] 251 | os: [linux] 252 | requiresBuild: true 253 | dev: true 254 | optional: true 255 | 256 | /@esbuild/linux-ppc64@0.16.17: 257 | resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} 258 | engines: {node: '>=12'} 259 | cpu: [ppc64] 260 | os: [linux] 261 | requiresBuild: true 262 | dev: true 263 | optional: true 264 | 265 | /@esbuild/linux-riscv64@0.16.17: 266 | resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} 267 | engines: {node: '>=12'} 268 | cpu: [riscv64] 269 | os: [linux] 270 | requiresBuild: true 271 | dev: true 272 | optional: true 273 | 274 | /@esbuild/linux-s390x@0.16.17: 275 | resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} 276 | engines: {node: '>=12'} 277 | cpu: [s390x] 278 | os: [linux] 279 | requiresBuild: true 280 | dev: true 281 | optional: true 282 | 283 | /@esbuild/linux-x64@0.16.17: 284 | resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} 285 | engines: {node: '>=12'} 286 | cpu: [x64] 287 | os: [linux] 288 | requiresBuild: true 289 | dev: true 290 | optional: true 291 | 292 | /@esbuild/netbsd-x64@0.16.17: 293 | resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} 294 | engines: {node: '>=12'} 295 | cpu: [x64] 296 | os: [netbsd] 297 | requiresBuild: true 298 | dev: true 299 | optional: true 300 | 301 | /@esbuild/openbsd-x64@0.16.17: 302 | resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} 303 | engines: {node: '>=12'} 304 | cpu: [x64] 305 | os: [openbsd] 306 | requiresBuild: true 307 | dev: true 308 | optional: true 309 | 310 | /@esbuild/sunos-x64@0.16.17: 311 | resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} 312 | engines: {node: '>=12'} 313 | cpu: [x64] 314 | os: [sunos] 315 | requiresBuild: true 316 | dev: true 317 | optional: true 318 | 319 | /@esbuild/win32-arm64@0.16.17: 320 | resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} 321 | engines: {node: '>=12'} 322 | cpu: [arm64] 323 | os: [win32] 324 | requiresBuild: true 325 | dev: true 326 | optional: true 327 | 328 | /@esbuild/win32-ia32@0.16.17: 329 | resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} 330 | engines: {node: '>=12'} 331 | cpu: [ia32] 332 | os: [win32] 333 | requiresBuild: true 334 | dev: true 335 | optional: true 336 | 337 | /@esbuild/win32-x64@0.16.17: 338 | resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} 339 | engines: {node: '>=12'} 340 | cpu: [x64] 341 | os: [win32] 342 | requiresBuild: true 343 | dev: true 344 | optional: true 345 | 346 | /@eslint-community/eslint-utils@4.4.0(eslint@8.35.0): 347 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 348 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 349 | peerDependencies: 350 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 351 | dependencies: 352 | eslint: 8.35.0 353 | eslint-visitor-keys: 3.4.3 354 | dev: true 355 | 356 | /@eslint/eslintrc@2.0.0: 357 | resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==} 358 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 359 | dependencies: 360 | ajv: 6.12.6 361 | debug: 4.3.4 362 | espree: 9.4.1 363 | globals: 13.20.0 364 | ignore: 5.2.4 365 | import-fresh: 3.3.0 366 | js-yaml: 4.1.0 367 | minimatch: 3.1.2 368 | strip-json-comments: 3.1.1 369 | transitivePeerDependencies: 370 | - supports-color 371 | dev: true 372 | 373 | /@eslint/js@8.35.0: 374 | resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} 375 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 376 | dev: true 377 | 378 | /@humanwhocodes/config-array@0.11.8: 379 | resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} 380 | engines: {node: '>=10.10.0'} 381 | dependencies: 382 | '@humanwhocodes/object-schema': 1.2.1 383 | debug: 4.3.4 384 | minimatch: 3.1.2 385 | transitivePeerDependencies: 386 | - supports-color 387 | dev: true 388 | 389 | /@humanwhocodes/module-importer@1.0.1: 390 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 391 | engines: {node: '>=12.22'} 392 | dev: true 393 | 394 | /@humanwhocodes/object-schema@1.2.1: 395 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 396 | dev: true 397 | 398 | /@istanbuljs/schema@0.1.3: 399 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 400 | engines: {node: '>=8'} 401 | dev: true 402 | 403 | /@jest/schemas@29.6.3: 404 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 405 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 406 | dependencies: 407 | '@sinclair/typebox': 0.27.8 408 | dev: true 409 | 410 | /@jridgewell/gen-mapping@0.3.3: 411 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 412 | engines: {node: '>=6.0.0'} 413 | dependencies: 414 | '@jridgewell/set-array': 1.1.2 415 | '@jridgewell/sourcemap-codec': 1.4.15 416 | '@jridgewell/trace-mapping': 0.3.19 417 | dev: true 418 | 419 | /@jridgewell/resolve-uri@3.1.0: 420 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 421 | engines: {node: '>=6.0.0'} 422 | dev: true 423 | 424 | /@jridgewell/set-array@1.1.2: 425 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 426 | engines: {node: '>=6.0.0'} 427 | dev: true 428 | 429 | /@jridgewell/sourcemap-codec@1.4.14: 430 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 431 | dev: true 432 | 433 | /@jridgewell/sourcemap-codec@1.4.15: 434 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 435 | dev: true 436 | 437 | /@jridgewell/trace-mapping@0.3.17: 438 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} 439 | dependencies: 440 | '@jridgewell/resolve-uri': 3.1.0 441 | '@jridgewell/sourcemap-codec': 1.4.14 442 | dev: true 443 | 444 | /@jridgewell/trace-mapping@0.3.19: 445 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 446 | dependencies: 447 | '@jridgewell/resolve-uri': 3.1.0 448 | '@jridgewell/sourcemap-codec': 1.4.15 449 | dev: true 450 | 451 | /@nodelib/fs.scandir@2.1.5: 452 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 453 | engines: {node: '>= 8'} 454 | dependencies: 455 | '@nodelib/fs.stat': 2.0.5 456 | run-parallel: 1.2.0 457 | dev: true 458 | 459 | /@nodelib/fs.stat@2.0.5: 460 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 461 | engines: {node: '>= 8'} 462 | dev: true 463 | 464 | /@nodelib/fs.walk@1.2.8: 465 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 466 | engines: {node: '>= 8'} 467 | dependencies: 468 | '@nodelib/fs.scandir': 2.1.5 469 | fastq: 1.15.0 470 | dev: true 471 | 472 | /@polka/url@1.0.0-next.21: 473 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 474 | dev: true 475 | 476 | /@sinclair/typebox@0.27.8: 477 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 478 | dev: true 479 | 480 | /@sveltejs/adapter-auto@2.0.0(@sveltejs/kit@1.25.0): 481 | resolution: {integrity: sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==} 482 | peerDependencies: 483 | '@sveltejs/kit': ^1.0.0 484 | dependencies: 485 | '@sveltejs/kit': 1.25.0(svelte@4.2.0)(vite@4.1.4) 486 | import-meta-resolve: 2.2.1 487 | dev: true 488 | 489 | /@sveltejs/kit@1.25.0(svelte@4.2.0)(vite@4.1.4): 490 | resolution: {integrity: sha512-+VqMWJJYtcLoF8hYkdqY2qs/MPaawrMwA/gNBJW2o2UrcuYdNiy0ZZnjQQuPD33df/VcAulnoeyzF5ZtaajFEw==} 491 | engines: {node: ^16.14 || >=18} 492 | hasBin: true 493 | requiresBuild: true 494 | peerDependencies: 495 | svelte: ^3.54.0 || ^4.0.0-next.0 496 | vite: ^4.0.0 497 | dependencies: 498 | '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@4.2.0)(vite@4.1.4) 499 | '@types/cookie': 0.5.1 500 | cookie: 0.5.0 501 | devalue: 4.3.2 502 | esm-env: 1.0.0 503 | kleur: 4.1.5 504 | magic-string: 0.30.0 505 | mime: 3.0.0 506 | sade: 1.8.1 507 | set-cookie-parser: 2.6.0 508 | sirv: 2.0.2 509 | svelte: 4.2.0 510 | tiny-glob: 0.2.9 511 | undici: 5.23.0 512 | vite: 4.1.4(@types/node@20.8.3) 513 | transitivePeerDependencies: 514 | - supports-color 515 | dev: true 516 | 517 | /@sveltejs/package@2.2.2(svelte@4.2.0)(typescript@4.9.5): 518 | resolution: {integrity: sha512-rP3sVv6cAntcdcG4r4KspLU6nZYYUrHJBAX3Arrw0KJFdgxtlsi2iDwN0Jwr/vIkgjcU0ZPWM8kkT5kpZDlWAw==} 519 | engines: {node: ^16.14 || >=18} 520 | hasBin: true 521 | peerDependencies: 522 | svelte: ^3.44.0 || ^4.0.0 523 | dependencies: 524 | chokidar: 3.5.3 525 | kleur: 4.1.5 526 | sade: 1.8.1 527 | semver: 7.5.4 528 | svelte: 4.2.0 529 | svelte2tsx: 0.6.22(svelte@4.2.0)(typescript@4.9.5) 530 | transitivePeerDependencies: 531 | - typescript 532 | dev: true 533 | 534 | /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.0)(vite@4.1.4): 535 | resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} 536 | engines: {node: ^14.18.0 || >= 16} 537 | peerDependencies: 538 | '@sveltejs/vite-plugin-svelte': ^2.2.0 539 | svelte: ^3.54.0 || ^4.0.0 540 | vite: ^4.0.0 541 | dependencies: 542 | '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@4.2.0)(vite@4.1.4) 543 | debug: 4.3.4 544 | svelte: 4.2.0 545 | vite: 4.1.4(@types/node@20.8.3) 546 | transitivePeerDependencies: 547 | - supports-color 548 | dev: true 549 | 550 | /@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.0)(vite@4.1.4): 551 | resolution: {integrity: sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==} 552 | engines: {node: ^14.18.0 || >= 16} 553 | peerDependencies: 554 | svelte: ^3.54.0 || ^4.0.0 555 | vite: ^4.0.0 556 | dependencies: 557 | '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.0)(vite@4.1.4) 558 | debug: 4.3.4 559 | deepmerge: 4.3.1 560 | kleur: 4.1.5 561 | magic-string: 0.30.3 562 | svelte: 4.2.0 563 | svelte-hmr: 0.15.3(svelte@4.2.0) 564 | vite: 4.1.4(@types/node@20.8.3) 565 | vitefu: 0.2.4(vite@4.1.4) 566 | transitivePeerDependencies: 567 | - supports-color 568 | dev: true 569 | 570 | /@testing-library/dom@9.3.3: 571 | resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} 572 | engines: {node: '>=14'} 573 | dependencies: 574 | '@babel/code-frame': 7.22.13 575 | '@babel/runtime': 7.21.0 576 | '@types/aria-query': 5.0.2 577 | aria-query: 5.1.3 578 | chalk: 4.1.2 579 | dom-accessibility-api: 0.5.16 580 | lz-string: 1.5.0 581 | pretty-format: 27.5.1 582 | dev: true 583 | 584 | /@testing-library/jest-dom@6.1.3(vitest@0.34.6): 585 | resolution: {integrity: sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ==} 586 | engines: {node: '>=14', npm: '>=6', yarn: '>=1'} 587 | peerDependencies: 588 | '@jest/globals': '>= 28' 589 | '@types/jest': '>= 28' 590 | jest: '>= 28' 591 | vitest: '>= 0.32' 592 | peerDependenciesMeta: 593 | '@jest/globals': 594 | optional: true 595 | '@types/jest': 596 | optional: true 597 | jest: 598 | optional: true 599 | vitest: 600 | optional: true 601 | dependencies: 602 | '@adobe/css-tools': 4.3.1 603 | '@babel/runtime': 7.21.0 604 | aria-query: 5.3.0 605 | chalk: 3.0.0 606 | css.escape: 1.5.1 607 | dom-accessibility-api: 0.5.16 608 | lodash: 4.17.21 609 | redent: 3.0.0 610 | vitest: 0.34.6(jsdom@22.1.0) 611 | dev: true 612 | 613 | /@testing-library/svelte@4.0.3(svelte@4.2.0): 614 | resolution: {integrity: sha512-GldAnyGEOn5gMwME+hLVQrnfuKZFB+it5YOMnRBHX+nqeHMsSa18HeqkdvGqtqLpvn81xV7R7EYFb500ngUfXA==} 615 | engines: {node: '>= 10'} 616 | peerDependencies: 617 | svelte: ^3 || ^4 618 | dependencies: 619 | '@testing-library/dom': 9.3.3 620 | svelte: 4.2.0 621 | dev: true 622 | 623 | /@tootallnate/once@2.0.0: 624 | resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 625 | engines: {node: '>= 10'} 626 | dev: true 627 | 628 | /@types/accept-language-parser@1.5.3: 629 | resolution: {integrity: sha512-S8oM29O6nnRC3/+rwYV7GBYIIgNIZ52PCxqBG7OuItq9oATnYWy8FfeLKwvq5F7pIYjeeBSCI7y+l+Z9UEQpVQ==} 630 | dev: true 631 | 632 | /@types/aria-query@5.0.2: 633 | resolution: {integrity: sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ==} 634 | dev: true 635 | 636 | /@types/chai-subset@1.3.3: 637 | resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 638 | dependencies: 639 | '@types/chai': 4.3.6 640 | dev: true 641 | 642 | /@types/chai@4.3.6: 643 | resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} 644 | dev: true 645 | 646 | /@types/cookie@0.5.1: 647 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 648 | dev: true 649 | 650 | /@types/estree@1.0.1: 651 | resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} 652 | dev: true 653 | 654 | /@types/istanbul-lib-coverage@2.0.4: 655 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} 656 | dev: true 657 | 658 | /@types/json-schema@7.0.11: 659 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 660 | dev: true 661 | 662 | /@types/node@20.8.3: 663 | resolution: {integrity: sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==} 664 | dev: true 665 | 666 | /@types/pug@2.0.7: 667 | resolution: {integrity: sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==} 668 | dev: true 669 | 670 | /@types/semver@7.3.13: 671 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 672 | dev: true 673 | 674 | /@types/testing-library__jest-dom@6.0.0(vitest@0.34.6): 675 | resolution: {integrity: sha512-bnreXCgus6IIadyHNlN/oI5FfX4dWgvGhOPvpr7zzCYDGAPIfvyIoAozMBINmhmsVuqV0cncejF2y5KC7ScqOg==} 676 | deprecated: This is a stub types definition. @testing-library/jest-dom provides its own type definitions, so you do not need this installed. 677 | dependencies: 678 | '@testing-library/jest-dom': 6.1.3(vitest@0.34.6) 679 | transitivePeerDependencies: 680 | - '@jest/globals' 681 | - '@types/jest' 682 | - jest 683 | - vitest 684 | dev: true 685 | 686 | /@typescript-eslint/eslint-plugin@5.54.0(@typescript-eslint/parser@5.54.0)(eslint@8.35.0)(typescript@4.9.5): 687 | resolution: {integrity: sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==} 688 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 689 | peerDependencies: 690 | '@typescript-eslint/parser': ^5.0.0 691 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 692 | typescript: '*' 693 | peerDependenciesMeta: 694 | typescript: 695 | optional: true 696 | dependencies: 697 | '@typescript-eslint/parser': 5.54.0(eslint@8.35.0)(typescript@4.9.5) 698 | '@typescript-eslint/scope-manager': 5.54.0 699 | '@typescript-eslint/type-utils': 5.54.0(eslint@8.35.0)(typescript@4.9.5) 700 | '@typescript-eslint/utils': 5.54.0(eslint@8.35.0)(typescript@4.9.5) 701 | debug: 4.3.4 702 | eslint: 8.35.0 703 | grapheme-splitter: 1.0.4 704 | ignore: 5.2.4 705 | natural-compare-lite: 1.4.0 706 | regexpp: 3.2.0 707 | semver: 7.3.8 708 | tsutils: 3.21.0(typescript@4.9.5) 709 | typescript: 4.9.5 710 | transitivePeerDependencies: 711 | - supports-color 712 | dev: true 713 | 714 | /@typescript-eslint/parser@5.54.0(eslint@8.35.0)(typescript@4.9.5): 715 | resolution: {integrity: sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==} 716 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 717 | peerDependencies: 718 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 719 | typescript: '*' 720 | peerDependenciesMeta: 721 | typescript: 722 | optional: true 723 | dependencies: 724 | '@typescript-eslint/scope-manager': 5.54.0 725 | '@typescript-eslint/types': 5.54.0 726 | '@typescript-eslint/typescript-estree': 5.54.0(typescript@4.9.5) 727 | debug: 4.3.4 728 | eslint: 8.35.0 729 | typescript: 4.9.5 730 | transitivePeerDependencies: 731 | - supports-color 732 | dev: true 733 | 734 | /@typescript-eslint/scope-manager@5.54.0: 735 | resolution: {integrity: sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==} 736 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 737 | dependencies: 738 | '@typescript-eslint/types': 5.54.0 739 | '@typescript-eslint/visitor-keys': 5.54.0 740 | dev: true 741 | 742 | /@typescript-eslint/type-utils@5.54.0(eslint@8.35.0)(typescript@4.9.5): 743 | resolution: {integrity: sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==} 744 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 745 | peerDependencies: 746 | eslint: '*' 747 | typescript: '*' 748 | peerDependenciesMeta: 749 | typescript: 750 | optional: true 751 | dependencies: 752 | '@typescript-eslint/typescript-estree': 5.54.0(typescript@4.9.5) 753 | '@typescript-eslint/utils': 5.54.0(eslint@8.35.0)(typescript@4.9.5) 754 | debug: 4.3.4 755 | eslint: 8.35.0 756 | tsutils: 3.21.0(typescript@4.9.5) 757 | typescript: 4.9.5 758 | transitivePeerDependencies: 759 | - supports-color 760 | dev: true 761 | 762 | /@typescript-eslint/types@5.54.0: 763 | resolution: {integrity: sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==} 764 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 765 | dev: true 766 | 767 | /@typescript-eslint/typescript-estree@5.54.0(typescript@4.9.5): 768 | resolution: {integrity: sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==} 769 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 770 | peerDependencies: 771 | typescript: '*' 772 | peerDependenciesMeta: 773 | typescript: 774 | optional: true 775 | dependencies: 776 | '@typescript-eslint/types': 5.54.0 777 | '@typescript-eslint/visitor-keys': 5.54.0 778 | debug: 4.3.4 779 | globby: 11.1.0 780 | is-glob: 4.0.3 781 | semver: 7.3.8 782 | tsutils: 3.21.0(typescript@4.9.5) 783 | typescript: 4.9.5 784 | transitivePeerDependencies: 785 | - supports-color 786 | dev: true 787 | 788 | /@typescript-eslint/utils@5.54.0(eslint@8.35.0)(typescript@4.9.5): 789 | resolution: {integrity: sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==} 790 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 791 | peerDependencies: 792 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 793 | dependencies: 794 | '@types/json-schema': 7.0.11 795 | '@types/semver': 7.3.13 796 | '@typescript-eslint/scope-manager': 5.54.0 797 | '@typescript-eslint/types': 5.54.0 798 | '@typescript-eslint/typescript-estree': 5.54.0(typescript@4.9.5) 799 | eslint: 8.35.0 800 | eslint-scope: 5.1.1 801 | eslint-utils: 3.0.0(eslint@8.35.0) 802 | semver: 7.3.8 803 | transitivePeerDependencies: 804 | - supports-color 805 | - typescript 806 | dev: true 807 | 808 | /@typescript-eslint/visitor-keys@5.54.0: 809 | resolution: {integrity: sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==} 810 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 811 | dependencies: 812 | '@typescript-eslint/types': 5.54.0 813 | eslint-visitor-keys: 3.3.0 814 | dev: true 815 | 816 | /@vitest/coverage-v8@0.34.6(vitest@0.34.6): 817 | resolution: {integrity: sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==} 818 | peerDependencies: 819 | vitest: '>=0.32.0 <1' 820 | dependencies: 821 | '@ampproject/remapping': 2.2.1 822 | '@bcoe/v8-coverage': 0.2.3 823 | istanbul-lib-coverage: 3.2.0 824 | istanbul-lib-report: 3.0.1 825 | istanbul-lib-source-maps: 4.0.1 826 | istanbul-reports: 3.1.6 827 | magic-string: 0.30.4 828 | picocolors: 1.0.0 829 | std-env: 3.4.3 830 | test-exclude: 6.0.0 831 | v8-to-istanbul: 9.1.3 832 | vitest: 0.34.6(jsdom@22.1.0) 833 | transitivePeerDependencies: 834 | - supports-color 835 | dev: true 836 | 837 | /@vitest/expect@0.34.6: 838 | resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} 839 | dependencies: 840 | '@vitest/spy': 0.34.6 841 | '@vitest/utils': 0.34.6 842 | chai: 4.3.10 843 | dev: true 844 | 845 | /@vitest/runner@0.34.6: 846 | resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} 847 | dependencies: 848 | '@vitest/utils': 0.34.6 849 | p-limit: 4.0.0 850 | pathe: 1.1.1 851 | dev: true 852 | 853 | /@vitest/snapshot@0.34.6: 854 | resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} 855 | dependencies: 856 | magic-string: 0.30.4 857 | pathe: 1.1.1 858 | pretty-format: 29.7.0 859 | dev: true 860 | 861 | /@vitest/spy@0.34.6: 862 | resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} 863 | dependencies: 864 | tinyspy: 2.2.0 865 | dev: true 866 | 867 | /@vitest/utils@0.34.6: 868 | resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} 869 | dependencies: 870 | diff-sequences: 29.6.3 871 | loupe: 2.3.6 872 | pretty-format: 29.7.0 873 | dev: true 874 | 875 | /abab@2.0.6: 876 | resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 877 | dev: true 878 | 879 | /accept-language-parser@1.5.0: 880 | resolution: {integrity: sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==} 881 | dev: false 882 | 883 | /acorn-jsx@5.3.2(acorn@8.11.2): 884 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 885 | peerDependencies: 886 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 887 | dependencies: 888 | acorn: 8.11.2 889 | dev: true 890 | 891 | /acorn-jsx@5.3.2(acorn@8.8.2): 892 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 893 | peerDependencies: 894 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 895 | dependencies: 896 | acorn: 8.8.2 897 | dev: true 898 | 899 | /acorn-walk@8.2.0: 900 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 901 | engines: {node: '>=0.4.0'} 902 | dev: true 903 | 904 | /acorn@8.10.0: 905 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 906 | engines: {node: '>=0.4.0'} 907 | hasBin: true 908 | dev: true 909 | 910 | /acorn@8.11.2: 911 | resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} 912 | engines: {node: '>=0.4.0'} 913 | hasBin: true 914 | dev: true 915 | 916 | /acorn@8.8.2: 917 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 918 | engines: {node: '>=0.4.0'} 919 | hasBin: true 920 | dev: true 921 | 922 | /agent-base@6.0.2: 923 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 924 | engines: {node: '>= 6.0.0'} 925 | dependencies: 926 | debug: 4.3.4 927 | transitivePeerDependencies: 928 | - supports-color 929 | dev: true 930 | 931 | /ajv@6.12.6: 932 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 933 | dependencies: 934 | fast-deep-equal: 3.1.3 935 | fast-json-stable-stringify: 2.1.0 936 | json-schema-traverse: 0.4.1 937 | uri-js: 4.4.1 938 | dev: true 939 | 940 | /ansi-regex@5.0.1: 941 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 942 | engines: {node: '>=8'} 943 | dev: true 944 | 945 | /ansi-styles@3.2.1: 946 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 947 | engines: {node: '>=4'} 948 | dependencies: 949 | color-convert: 1.9.3 950 | dev: true 951 | 952 | /ansi-styles@4.3.0: 953 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 954 | engines: {node: '>=8'} 955 | dependencies: 956 | color-convert: 2.0.1 957 | dev: true 958 | 959 | /ansi-styles@5.2.0: 960 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 961 | engines: {node: '>=10'} 962 | dev: true 963 | 964 | /anymatch@3.1.3: 965 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 966 | engines: {node: '>= 8'} 967 | dependencies: 968 | normalize-path: 3.0.0 969 | picomatch: 2.3.1 970 | dev: true 971 | 972 | /argparse@2.0.1: 973 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 974 | dev: true 975 | 976 | /aria-query@5.1.3: 977 | resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} 978 | dependencies: 979 | deep-equal: 2.2.2 980 | dev: true 981 | 982 | /aria-query@5.3.0: 983 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 984 | dependencies: 985 | dequal: 2.0.3 986 | dev: true 987 | 988 | /array-buffer-byte-length@1.0.0: 989 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 990 | dependencies: 991 | call-bind: 1.0.2 992 | is-array-buffer: 3.0.2 993 | dev: true 994 | 995 | /array-union@2.1.0: 996 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 997 | engines: {node: '>=8'} 998 | dev: true 999 | 1000 | /assertion-error@1.1.0: 1001 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 1002 | dev: true 1003 | 1004 | /asynckit@0.4.0: 1005 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 1006 | dev: true 1007 | 1008 | /available-typed-arrays@1.0.5: 1009 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 1010 | engines: {node: '>= 0.4'} 1011 | dev: true 1012 | 1013 | /axobject-query@3.2.1: 1014 | resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} 1015 | dependencies: 1016 | dequal: 2.0.3 1017 | dev: true 1018 | 1019 | /balanced-match@1.0.2: 1020 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1021 | dev: true 1022 | 1023 | /binary-extensions@2.2.0: 1024 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1025 | engines: {node: '>=8'} 1026 | dev: true 1027 | 1028 | /brace-expansion@1.1.11: 1029 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1030 | dependencies: 1031 | balanced-match: 1.0.2 1032 | concat-map: 0.0.1 1033 | dev: true 1034 | 1035 | /brace-expansion@2.0.1: 1036 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1037 | dependencies: 1038 | balanced-match: 1.0.2 1039 | dev: true 1040 | 1041 | /braces@3.0.2: 1042 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1043 | engines: {node: '>=8'} 1044 | dependencies: 1045 | fill-range: 7.0.1 1046 | dev: true 1047 | 1048 | /buffer-crc32@0.2.13: 1049 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 1050 | dev: true 1051 | 1052 | /busboy@1.6.0: 1053 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 1054 | engines: {node: '>=10.16.0'} 1055 | dependencies: 1056 | streamsearch: 1.1.0 1057 | dev: true 1058 | 1059 | /cac@6.7.14: 1060 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1061 | engines: {node: '>=8'} 1062 | dev: true 1063 | 1064 | /call-bind@1.0.2: 1065 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 1066 | dependencies: 1067 | function-bind: 1.1.1 1068 | get-intrinsic: 1.2.1 1069 | dev: true 1070 | 1071 | /callsites@3.1.0: 1072 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1073 | engines: {node: '>=6'} 1074 | dev: true 1075 | 1076 | /chai@4.3.10: 1077 | resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} 1078 | engines: {node: '>=4'} 1079 | dependencies: 1080 | assertion-error: 1.1.0 1081 | check-error: 1.0.3 1082 | deep-eql: 4.1.3 1083 | get-func-name: 2.0.2 1084 | loupe: 2.3.6 1085 | pathval: 1.1.1 1086 | type-detect: 4.0.8 1087 | dev: true 1088 | 1089 | /chalk@2.4.2: 1090 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1091 | engines: {node: '>=4'} 1092 | dependencies: 1093 | ansi-styles: 3.2.1 1094 | escape-string-regexp: 1.0.5 1095 | supports-color: 5.5.0 1096 | dev: true 1097 | 1098 | /chalk@3.0.0: 1099 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 1100 | engines: {node: '>=8'} 1101 | dependencies: 1102 | ansi-styles: 4.3.0 1103 | supports-color: 7.2.0 1104 | dev: true 1105 | 1106 | /chalk@4.1.2: 1107 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1108 | engines: {node: '>=10'} 1109 | dependencies: 1110 | ansi-styles: 4.3.0 1111 | supports-color: 7.2.0 1112 | dev: true 1113 | 1114 | /check-error@1.0.3: 1115 | resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 1116 | dependencies: 1117 | get-func-name: 2.0.2 1118 | dev: true 1119 | 1120 | /chokidar@3.5.3: 1121 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1122 | engines: {node: '>= 8.10.0'} 1123 | dependencies: 1124 | anymatch: 3.1.3 1125 | braces: 3.0.2 1126 | glob-parent: 5.1.2 1127 | is-binary-path: 2.1.0 1128 | is-glob: 4.0.3 1129 | normalize-path: 3.0.0 1130 | readdirp: 3.6.0 1131 | optionalDependencies: 1132 | fsevents: 2.3.3 1133 | dev: true 1134 | 1135 | /code-red@1.0.4: 1136 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 1137 | dependencies: 1138 | '@jridgewell/sourcemap-codec': 1.4.15 1139 | '@types/estree': 1.0.1 1140 | acorn: 8.10.0 1141 | estree-walker: 3.0.3 1142 | periscopic: 3.1.0 1143 | dev: true 1144 | 1145 | /color-convert@1.9.3: 1146 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1147 | dependencies: 1148 | color-name: 1.1.3 1149 | dev: true 1150 | 1151 | /color-convert@2.0.1: 1152 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1153 | engines: {node: '>=7.0.0'} 1154 | dependencies: 1155 | color-name: 1.1.4 1156 | dev: true 1157 | 1158 | /color-name@1.1.3: 1159 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1160 | dev: true 1161 | 1162 | /color-name@1.1.4: 1163 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1164 | dev: true 1165 | 1166 | /combined-stream@1.0.8: 1167 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 1168 | engines: {node: '>= 0.8'} 1169 | dependencies: 1170 | delayed-stream: 1.0.0 1171 | dev: true 1172 | 1173 | /concat-map@0.0.1: 1174 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1175 | dev: true 1176 | 1177 | /convert-source-map@2.0.0: 1178 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1179 | dev: true 1180 | 1181 | /cookie@0.5.0: 1182 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1183 | engines: {node: '>= 0.6'} 1184 | dev: true 1185 | 1186 | /cross-fetch@3.1.6: 1187 | resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} 1188 | dependencies: 1189 | node-fetch: 2.7.0 1190 | transitivePeerDependencies: 1191 | - encoding 1192 | dev: true 1193 | 1194 | /cross-spawn@7.0.3: 1195 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1196 | engines: {node: '>= 8'} 1197 | dependencies: 1198 | path-key: 3.1.1 1199 | shebang-command: 2.0.0 1200 | which: 2.0.2 1201 | dev: true 1202 | 1203 | /css-tree@2.3.1: 1204 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 1205 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 1206 | dependencies: 1207 | mdn-data: 2.0.30 1208 | source-map-js: 1.0.2 1209 | dev: true 1210 | 1211 | /css.escape@1.5.1: 1212 | resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} 1213 | dev: true 1214 | 1215 | /cssesc@3.0.0: 1216 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1217 | engines: {node: '>=4'} 1218 | hasBin: true 1219 | dev: true 1220 | 1221 | /cssstyle@3.0.0: 1222 | resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} 1223 | engines: {node: '>=14'} 1224 | dependencies: 1225 | rrweb-cssom: 0.6.0 1226 | dev: true 1227 | 1228 | /data-urls@4.0.0: 1229 | resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} 1230 | engines: {node: '>=14'} 1231 | dependencies: 1232 | abab: 2.0.6 1233 | whatwg-mimetype: 3.0.0 1234 | whatwg-url: 12.0.1 1235 | dev: true 1236 | 1237 | /debug@4.3.4: 1238 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1239 | engines: {node: '>=6.0'} 1240 | peerDependencies: 1241 | supports-color: '*' 1242 | peerDependenciesMeta: 1243 | supports-color: 1244 | optional: true 1245 | dependencies: 1246 | ms: 2.1.2 1247 | dev: true 1248 | 1249 | /decimal.js@10.4.3: 1250 | resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} 1251 | dev: true 1252 | 1253 | /dedent-js@1.0.1: 1254 | resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} 1255 | dev: true 1256 | 1257 | /deep-eql@4.1.3: 1258 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 1259 | engines: {node: '>=6'} 1260 | dependencies: 1261 | type-detect: 4.0.8 1262 | dev: true 1263 | 1264 | /deep-equal@2.2.2: 1265 | resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} 1266 | dependencies: 1267 | array-buffer-byte-length: 1.0.0 1268 | call-bind: 1.0.2 1269 | es-get-iterator: 1.1.3 1270 | get-intrinsic: 1.2.1 1271 | is-arguments: 1.1.1 1272 | is-array-buffer: 3.0.2 1273 | is-date-object: 1.0.5 1274 | is-regex: 1.1.4 1275 | is-shared-array-buffer: 1.0.2 1276 | isarray: 2.0.5 1277 | object-is: 1.1.5 1278 | object-keys: 1.1.1 1279 | object.assign: 4.1.4 1280 | regexp.prototype.flags: 1.5.1 1281 | side-channel: 1.0.4 1282 | which-boxed-primitive: 1.0.2 1283 | which-collection: 1.0.1 1284 | which-typed-array: 1.1.11 1285 | dev: true 1286 | 1287 | /deep-is@0.1.4: 1288 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1289 | dev: true 1290 | 1291 | /deepmerge@4.3.1: 1292 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1293 | engines: {node: '>=0.10.0'} 1294 | dev: true 1295 | 1296 | /define-data-property@1.1.0: 1297 | resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} 1298 | engines: {node: '>= 0.4'} 1299 | dependencies: 1300 | get-intrinsic: 1.2.1 1301 | gopd: 1.0.1 1302 | has-property-descriptors: 1.0.0 1303 | dev: true 1304 | 1305 | /define-properties@1.2.1: 1306 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 1307 | engines: {node: '>= 0.4'} 1308 | dependencies: 1309 | define-data-property: 1.1.0 1310 | has-property-descriptors: 1.0.0 1311 | object-keys: 1.1.1 1312 | dev: true 1313 | 1314 | /delayed-stream@1.0.0: 1315 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 1316 | engines: {node: '>=0.4.0'} 1317 | dev: true 1318 | 1319 | /dequal@2.0.3: 1320 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1321 | engines: {node: '>=6'} 1322 | dev: true 1323 | 1324 | /detect-indent@6.1.0: 1325 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 1326 | engines: {node: '>=8'} 1327 | dev: true 1328 | 1329 | /devalue@4.3.2: 1330 | resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} 1331 | dev: true 1332 | 1333 | /diff-sequences@29.6.3: 1334 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 1335 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1336 | dev: true 1337 | 1338 | /dir-glob@3.0.1: 1339 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1340 | engines: {node: '>=8'} 1341 | dependencies: 1342 | path-type: 4.0.0 1343 | dev: true 1344 | 1345 | /doctrine@3.0.0: 1346 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1347 | engines: {node: '>=6.0.0'} 1348 | dependencies: 1349 | esutils: 2.0.3 1350 | dev: true 1351 | 1352 | /dom-accessibility-api@0.5.16: 1353 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} 1354 | dev: true 1355 | 1356 | /domexception@4.0.0: 1357 | resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} 1358 | engines: {node: '>=12'} 1359 | dependencies: 1360 | webidl-conversions: 7.0.0 1361 | dev: true 1362 | 1363 | /entities@4.5.0: 1364 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1365 | engines: {node: '>=0.12'} 1366 | dev: true 1367 | 1368 | /es-get-iterator@1.1.3: 1369 | resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} 1370 | dependencies: 1371 | call-bind: 1.0.2 1372 | get-intrinsic: 1.2.1 1373 | has-symbols: 1.0.3 1374 | is-arguments: 1.1.1 1375 | is-map: 2.0.2 1376 | is-set: 2.0.2 1377 | is-string: 1.0.7 1378 | isarray: 2.0.5 1379 | stop-iteration-iterator: 1.0.0 1380 | dev: true 1381 | 1382 | /es6-promise@3.3.1: 1383 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 1384 | dev: true 1385 | 1386 | /esbuild@0.16.17: 1387 | resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} 1388 | engines: {node: '>=12'} 1389 | hasBin: true 1390 | requiresBuild: true 1391 | optionalDependencies: 1392 | '@esbuild/android-arm': 0.16.17 1393 | '@esbuild/android-arm64': 0.16.17 1394 | '@esbuild/android-x64': 0.16.17 1395 | '@esbuild/darwin-arm64': 0.16.17 1396 | '@esbuild/darwin-x64': 0.16.17 1397 | '@esbuild/freebsd-arm64': 0.16.17 1398 | '@esbuild/freebsd-x64': 0.16.17 1399 | '@esbuild/linux-arm': 0.16.17 1400 | '@esbuild/linux-arm64': 0.16.17 1401 | '@esbuild/linux-ia32': 0.16.17 1402 | '@esbuild/linux-loong64': 0.16.17 1403 | '@esbuild/linux-mips64el': 0.16.17 1404 | '@esbuild/linux-ppc64': 0.16.17 1405 | '@esbuild/linux-riscv64': 0.16.17 1406 | '@esbuild/linux-s390x': 0.16.17 1407 | '@esbuild/linux-x64': 0.16.17 1408 | '@esbuild/netbsd-x64': 0.16.17 1409 | '@esbuild/openbsd-x64': 0.16.17 1410 | '@esbuild/sunos-x64': 0.16.17 1411 | '@esbuild/win32-arm64': 0.16.17 1412 | '@esbuild/win32-ia32': 0.16.17 1413 | '@esbuild/win32-x64': 0.16.17 1414 | dev: true 1415 | 1416 | /escape-string-regexp@1.0.5: 1417 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1418 | engines: {node: '>=0.8.0'} 1419 | dev: true 1420 | 1421 | /escape-string-regexp@4.0.0: 1422 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1423 | engines: {node: '>=10'} 1424 | dev: true 1425 | 1426 | /eslint-compat-utils@0.1.2(eslint@8.35.0): 1427 | resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} 1428 | engines: {node: '>=12'} 1429 | peerDependencies: 1430 | eslint: '>=6.0.0' 1431 | dependencies: 1432 | eslint: 8.35.0 1433 | dev: true 1434 | 1435 | /eslint-config-prettier@8.6.0(eslint@8.35.0): 1436 | resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} 1437 | hasBin: true 1438 | peerDependencies: 1439 | eslint: '>=7.0.0' 1440 | dependencies: 1441 | eslint: 8.35.0 1442 | dev: true 1443 | 1444 | /eslint-plugin-svelte@2.36.0-next.2(eslint@8.35.0)(svelte@4.2.0): 1445 | resolution: {integrity: sha512-CAvGRWAKN4zbkENpI0pxiORSfpRpp5qN+fUZCRKmahb3Axve7WoGvtoy1hzEpz8barNElUFXZ+zauAt421vvVA==} 1446 | engines: {node: ^14.17.0 || >=16.0.0} 1447 | peerDependencies: 1448 | eslint: ^7.0.0 || ^8.0.0-0 1449 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.8 1450 | peerDependenciesMeta: 1451 | svelte: 1452 | optional: true 1453 | dependencies: 1454 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.35.0) 1455 | '@jridgewell/sourcemap-codec': 1.4.15 1456 | debug: 4.3.4 1457 | eslint: 8.35.0 1458 | eslint-compat-utils: 0.1.2(eslint@8.35.0) 1459 | esutils: 2.0.3 1460 | known-css-properties: 0.29.0 1461 | postcss: 8.4.31 1462 | postcss-load-config: 3.1.4(postcss@8.4.31) 1463 | postcss-safe-parser: 6.0.0(postcss@8.4.31) 1464 | postcss-selector-parser: 6.0.13 1465 | semver: 7.5.4 1466 | svelte: 4.2.0 1467 | svelte-eslint-parser: 0.34.0-next.5(svelte@4.2.0) 1468 | transitivePeerDependencies: 1469 | - supports-color 1470 | - ts-node 1471 | dev: true 1472 | 1473 | /eslint-scope@5.1.1: 1474 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1475 | engines: {node: '>=8.0.0'} 1476 | dependencies: 1477 | esrecurse: 4.3.0 1478 | estraverse: 4.3.0 1479 | dev: true 1480 | 1481 | /eslint-scope@7.1.1: 1482 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 1483 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1484 | dependencies: 1485 | esrecurse: 4.3.0 1486 | estraverse: 5.3.0 1487 | dev: true 1488 | 1489 | /eslint-scope@7.2.2: 1490 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1491 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1492 | dependencies: 1493 | esrecurse: 4.3.0 1494 | estraverse: 5.3.0 1495 | dev: true 1496 | 1497 | /eslint-utils@3.0.0(eslint@8.35.0): 1498 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1499 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1500 | peerDependencies: 1501 | eslint: '>=5' 1502 | dependencies: 1503 | eslint: 8.35.0 1504 | eslint-visitor-keys: 2.1.0 1505 | dev: true 1506 | 1507 | /eslint-visitor-keys@2.1.0: 1508 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1509 | engines: {node: '>=10'} 1510 | dev: true 1511 | 1512 | /eslint-visitor-keys@3.3.0: 1513 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 1514 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1515 | dev: true 1516 | 1517 | /eslint-visitor-keys@3.4.3: 1518 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1519 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1520 | dev: true 1521 | 1522 | /eslint@8.35.0: 1523 | resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} 1524 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1525 | hasBin: true 1526 | dependencies: 1527 | '@eslint/eslintrc': 2.0.0 1528 | '@eslint/js': 8.35.0 1529 | '@humanwhocodes/config-array': 0.11.8 1530 | '@humanwhocodes/module-importer': 1.0.1 1531 | '@nodelib/fs.walk': 1.2.8 1532 | ajv: 6.12.6 1533 | chalk: 4.1.2 1534 | cross-spawn: 7.0.3 1535 | debug: 4.3.4 1536 | doctrine: 3.0.0 1537 | escape-string-regexp: 4.0.0 1538 | eslint-scope: 7.1.1 1539 | eslint-utils: 3.0.0(eslint@8.35.0) 1540 | eslint-visitor-keys: 3.3.0 1541 | espree: 9.4.1 1542 | esquery: 1.4.2 1543 | esutils: 2.0.3 1544 | fast-deep-equal: 3.1.3 1545 | file-entry-cache: 6.0.1 1546 | find-up: 5.0.0 1547 | glob-parent: 6.0.2 1548 | globals: 13.20.0 1549 | grapheme-splitter: 1.0.4 1550 | ignore: 5.2.4 1551 | import-fresh: 3.3.0 1552 | imurmurhash: 0.1.4 1553 | is-glob: 4.0.3 1554 | is-path-inside: 3.0.3 1555 | js-sdsl: 4.3.0 1556 | js-yaml: 4.1.0 1557 | json-stable-stringify-without-jsonify: 1.0.1 1558 | levn: 0.4.1 1559 | lodash.merge: 4.6.2 1560 | minimatch: 3.1.2 1561 | natural-compare: 1.4.0 1562 | optionator: 0.9.1 1563 | regexpp: 3.2.0 1564 | strip-ansi: 6.0.1 1565 | strip-json-comments: 3.1.1 1566 | text-table: 0.2.0 1567 | transitivePeerDependencies: 1568 | - supports-color 1569 | dev: true 1570 | 1571 | /esm-env@1.0.0: 1572 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 1573 | dev: true 1574 | 1575 | /espree@9.4.1: 1576 | resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} 1577 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1578 | dependencies: 1579 | acorn: 8.8.2 1580 | acorn-jsx: 5.3.2(acorn@8.8.2) 1581 | eslint-visitor-keys: 3.3.0 1582 | dev: true 1583 | 1584 | /espree@9.6.1: 1585 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1586 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1587 | dependencies: 1588 | acorn: 8.11.2 1589 | acorn-jsx: 5.3.2(acorn@8.11.2) 1590 | eslint-visitor-keys: 3.4.3 1591 | dev: true 1592 | 1593 | /esquery@1.4.2: 1594 | resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==} 1595 | engines: {node: '>=0.10'} 1596 | dependencies: 1597 | estraverse: 5.3.0 1598 | dev: true 1599 | 1600 | /esrecurse@4.3.0: 1601 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1602 | engines: {node: '>=4.0'} 1603 | dependencies: 1604 | estraverse: 5.3.0 1605 | dev: true 1606 | 1607 | /estraverse@4.3.0: 1608 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1609 | engines: {node: '>=4.0'} 1610 | dev: true 1611 | 1612 | /estraverse@5.3.0: 1613 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1614 | engines: {node: '>=4.0'} 1615 | dev: true 1616 | 1617 | /estree-walker@3.0.3: 1618 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1619 | dependencies: 1620 | '@types/estree': 1.0.1 1621 | dev: true 1622 | 1623 | /esutils@2.0.3: 1624 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1625 | engines: {node: '>=0.10.0'} 1626 | dev: true 1627 | 1628 | /fast-deep-equal@3.1.3: 1629 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1630 | dev: true 1631 | 1632 | /fast-glob@3.2.12: 1633 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 1634 | engines: {node: '>=8.6.0'} 1635 | dependencies: 1636 | '@nodelib/fs.stat': 2.0.5 1637 | '@nodelib/fs.walk': 1.2.8 1638 | glob-parent: 5.1.2 1639 | merge2: 1.4.1 1640 | micromatch: 4.0.5 1641 | dev: true 1642 | 1643 | /fast-json-stable-stringify@2.1.0: 1644 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1645 | dev: true 1646 | 1647 | /fast-levenshtein@2.0.6: 1648 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1649 | dev: true 1650 | 1651 | /fastq@1.15.0: 1652 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1653 | dependencies: 1654 | reusify: 1.0.4 1655 | dev: true 1656 | 1657 | /file-entry-cache@6.0.1: 1658 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1659 | engines: {node: ^10.12.0 || >=12.0.0} 1660 | dependencies: 1661 | flat-cache: 3.0.4 1662 | dev: true 1663 | 1664 | /fill-range@7.0.1: 1665 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1666 | engines: {node: '>=8'} 1667 | dependencies: 1668 | to-regex-range: 5.0.1 1669 | dev: true 1670 | 1671 | /find-up@5.0.0: 1672 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1673 | engines: {node: '>=10'} 1674 | dependencies: 1675 | locate-path: 6.0.0 1676 | path-exists: 4.0.0 1677 | dev: true 1678 | 1679 | /flat-cache@3.0.4: 1680 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1681 | engines: {node: ^10.12.0 || >=12.0.0} 1682 | dependencies: 1683 | flatted: 3.2.7 1684 | rimraf: 3.0.2 1685 | dev: true 1686 | 1687 | /flatted@3.2.7: 1688 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1689 | dev: true 1690 | 1691 | /for-each@0.3.3: 1692 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1693 | dependencies: 1694 | is-callable: 1.2.7 1695 | dev: true 1696 | 1697 | /form-data@4.0.0: 1698 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 1699 | engines: {node: '>= 6'} 1700 | dependencies: 1701 | asynckit: 0.4.0 1702 | combined-stream: 1.0.8 1703 | mime-types: 2.1.35 1704 | dev: true 1705 | 1706 | /fs.realpath@1.0.0: 1707 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1708 | dev: true 1709 | 1710 | /fsevents@2.3.3: 1711 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1712 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1713 | os: [darwin] 1714 | requiresBuild: true 1715 | dev: true 1716 | optional: true 1717 | 1718 | /function-bind@1.1.1: 1719 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1720 | dev: true 1721 | 1722 | /functions-have-names@1.2.3: 1723 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1724 | dev: true 1725 | 1726 | /get-func-name@2.0.2: 1727 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 1728 | dev: true 1729 | 1730 | /get-intrinsic@1.2.1: 1731 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1732 | dependencies: 1733 | function-bind: 1.1.1 1734 | has: 1.0.3 1735 | has-proto: 1.0.1 1736 | has-symbols: 1.0.3 1737 | dev: true 1738 | 1739 | /glob-parent@5.1.2: 1740 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1741 | engines: {node: '>= 6'} 1742 | dependencies: 1743 | is-glob: 4.0.3 1744 | dev: true 1745 | 1746 | /glob-parent@6.0.2: 1747 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1748 | engines: {node: '>=10.13.0'} 1749 | dependencies: 1750 | is-glob: 4.0.3 1751 | dev: true 1752 | 1753 | /glob@7.2.3: 1754 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1755 | dependencies: 1756 | fs.realpath: 1.0.0 1757 | inflight: 1.0.6 1758 | inherits: 2.0.4 1759 | minimatch: 3.1.2 1760 | once: 1.4.0 1761 | path-is-absolute: 1.0.1 1762 | dev: true 1763 | 1764 | /glob@8.1.0: 1765 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 1766 | engines: {node: '>=12'} 1767 | dependencies: 1768 | fs.realpath: 1.0.0 1769 | inflight: 1.0.6 1770 | inherits: 2.0.4 1771 | minimatch: 5.1.6 1772 | once: 1.4.0 1773 | dev: true 1774 | 1775 | /globals@13.20.0: 1776 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 1777 | engines: {node: '>=8'} 1778 | dependencies: 1779 | type-fest: 0.20.2 1780 | dev: true 1781 | 1782 | /globalyzer@0.1.0: 1783 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 1784 | dev: true 1785 | 1786 | /globby@11.1.0: 1787 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1788 | engines: {node: '>=10'} 1789 | dependencies: 1790 | array-union: 2.1.0 1791 | dir-glob: 3.0.1 1792 | fast-glob: 3.2.12 1793 | ignore: 5.2.4 1794 | merge2: 1.4.1 1795 | slash: 3.0.0 1796 | dev: true 1797 | 1798 | /globrex@0.1.2: 1799 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1800 | dev: true 1801 | 1802 | /gopd@1.0.1: 1803 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1804 | dependencies: 1805 | get-intrinsic: 1.2.1 1806 | dev: true 1807 | 1808 | /graceful-fs@4.2.11: 1809 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1810 | dev: true 1811 | 1812 | /grapheme-splitter@1.0.4: 1813 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1814 | dev: true 1815 | 1816 | /has-bigints@1.0.2: 1817 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1818 | dev: true 1819 | 1820 | /has-flag@3.0.0: 1821 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1822 | engines: {node: '>=4'} 1823 | dev: true 1824 | 1825 | /has-flag@4.0.0: 1826 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1827 | engines: {node: '>=8'} 1828 | dev: true 1829 | 1830 | /has-property-descriptors@1.0.0: 1831 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 1832 | dependencies: 1833 | get-intrinsic: 1.2.1 1834 | dev: true 1835 | 1836 | /has-proto@1.0.1: 1837 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1838 | engines: {node: '>= 0.4'} 1839 | dev: true 1840 | 1841 | /has-symbols@1.0.3: 1842 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1843 | engines: {node: '>= 0.4'} 1844 | dev: true 1845 | 1846 | /has-tostringtag@1.0.0: 1847 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 1848 | engines: {node: '>= 0.4'} 1849 | dependencies: 1850 | has-symbols: 1.0.3 1851 | dev: true 1852 | 1853 | /has@1.0.3: 1854 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1855 | engines: {node: '>= 0.4.0'} 1856 | dependencies: 1857 | function-bind: 1.1.1 1858 | dev: true 1859 | 1860 | /html-encoding-sniffer@3.0.0: 1861 | resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} 1862 | engines: {node: '>=12'} 1863 | dependencies: 1864 | whatwg-encoding: 2.0.0 1865 | dev: true 1866 | 1867 | /html-escaper@2.0.2: 1868 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1869 | dev: true 1870 | 1871 | /http-proxy-agent@5.0.0: 1872 | resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} 1873 | engines: {node: '>= 6'} 1874 | dependencies: 1875 | '@tootallnate/once': 2.0.0 1876 | agent-base: 6.0.2 1877 | debug: 4.3.4 1878 | transitivePeerDependencies: 1879 | - supports-color 1880 | dev: true 1881 | 1882 | /https-proxy-agent@5.0.1: 1883 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 1884 | engines: {node: '>= 6'} 1885 | dependencies: 1886 | agent-base: 6.0.2 1887 | debug: 4.3.4 1888 | transitivePeerDependencies: 1889 | - supports-color 1890 | dev: true 1891 | 1892 | /i18next-browser-languagedetector@7.1.0: 1893 | resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==} 1894 | dependencies: 1895 | '@babel/runtime': 7.21.0 1896 | dev: true 1897 | 1898 | /i18next-fs-backend@2.2.0: 1899 | resolution: {integrity: sha512-VOPHhdDX0M/csRqEw+9Ectpf6wvTIg1MZDfAHxc3JKnAlJz7fcZSAKAeyDohOq0xuLx57esYpJopIvBaRb0Bag==} 1900 | dev: true 1901 | 1902 | /i18next-http-backend@2.2.2: 1903 | resolution: {integrity: sha512-mJu4ZqzDtBiU3O4GV9AbK5ekEqoDMdMnCl3pkdXmb5b8yoIH//u8FsmIe6C5qXb3teZu+j6VMi20tjUgzeABiw==} 1904 | dependencies: 1905 | cross-fetch: 3.1.6 1906 | transitivePeerDependencies: 1907 | - encoding 1908 | dev: true 1909 | 1910 | /i18next@22.5.1: 1911 | resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} 1912 | dependencies: 1913 | '@babel/runtime': 7.21.0 1914 | dev: true 1915 | 1916 | /iconv-lite@0.6.3: 1917 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1918 | engines: {node: '>=0.10.0'} 1919 | dependencies: 1920 | safer-buffer: 2.1.2 1921 | dev: true 1922 | 1923 | /ignore-walk@5.0.1: 1924 | resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} 1925 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1926 | dependencies: 1927 | minimatch: 5.1.6 1928 | dev: true 1929 | 1930 | /ignore@5.2.4: 1931 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1932 | engines: {node: '>= 4'} 1933 | dev: true 1934 | 1935 | /import-fresh@3.3.0: 1936 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1937 | engines: {node: '>=6'} 1938 | dependencies: 1939 | parent-module: 1.0.1 1940 | resolve-from: 4.0.0 1941 | dev: true 1942 | 1943 | /import-meta-resolve@2.2.1: 1944 | resolution: {integrity: sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==} 1945 | dev: true 1946 | 1947 | /imurmurhash@0.1.4: 1948 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1949 | engines: {node: '>=0.8.19'} 1950 | dev: true 1951 | 1952 | /indent-string@4.0.0: 1953 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1954 | engines: {node: '>=8'} 1955 | dev: true 1956 | 1957 | /inflight@1.0.6: 1958 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1959 | dependencies: 1960 | once: 1.4.0 1961 | wrappy: 1.0.2 1962 | dev: true 1963 | 1964 | /inherits@2.0.4: 1965 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1966 | dev: true 1967 | 1968 | /internal-slot@1.0.5: 1969 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 1970 | engines: {node: '>= 0.4'} 1971 | dependencies: 1972 | get-intrinsic: 1.2.1 1973 | has: 1.0.3 1974 | side-channel: 1.0.4 1975 | dev: true 1976 | 1977 | /intl-parse-accept-language@1.0.0: 1978 | resolution: {integrity: sha512-YFMSV91JNBOSjw1cOfw2tup6hDP7mkz+2AUV7W1L1AM6ntgI75qC1ZeFpjPGMrWp+upmBRTX2fJWQ8c7jsUWpA==} 1979 | engines: {node: '>=14'} 1980 | dev: false 1981 | 1982 | /is-arguments@1.1.1: 1983 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 1984 | engines: {node: '>= 0.4'} 1985 | dependencies: 1986 | call-bind: 1.0.2 1987 | has-tostringtag: 1.0.0 1988 | dev: true 1989 | 1990 | /is-array-buffer@3.0.2: 1991 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 1992 | dependencies: 1993 | call-bind: 1.0.2 1994 | get-intrinsic: 1.2.1 1995 | is-typed-array: 1.1.12 1996 | dev: true 1997 | 1998 | /is-bigint@1.0.4: 1999 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 2000 | dependencies: 2001 | has-bigints: 1.0.2 2002 | dev: true 2003 | 2004 | /is-binary-path@2.1.0: 2005 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 2006 | engines: {node: '>=8'} 2007 | dependencies: 2008 | binary-extensions: 2.2.0 2009 | dev: true 2010 | 2011 | /is-boolean-object@1.1.2: 2012 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 2013 | engines: {node: '>= 0.4'} 2014 | dependencies: 2015 | call-bind: 1.0.2 2016 | has-tostringtag: 1.0.0 2017 | dev: true 2018 | 2019 | /is-callable@1.2.7: 2020 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 2021 | engines: {node: '>= 0.4'} 2022 | dev: true 2023 | 2024 | /is-core-module@2.11.0: 2025 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 2026 | dependencies: 2027 | has: 1.0.3 2028 | dev: true 2029 | 2030 | /is-date-object@1.0.5: 2031 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 2032 | engines: {node: '>= 0.4'} 2033 | dependencies: 2034 | has-tostringtag: 1.0.0 2035 | dev: true 2036 | 2037 | /is-extglob@2.1.1: 2038 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 2039 | engines: {node: '>=0.10.0'} 2040 | dev: true 2041 | 2042 | /is-glob@4.0.3: 2043 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 2044 | engines: {node: '>=0.10.0'} 2045 | dependencies: 2046 | is-extglob: 2.1.1 2047 | dev: true 2048 | 2049 | /is-map@2.0.2: 2050 | resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} 2051 | dev: true 2052 | 2053 | /is-number-object@1.0.7: 2054 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 2055 | engines: {node: '>= 0.4'} 2056 | dependencies: 2057 | has-tostringtag: 1.0.0 2058 | dev: true 2059 | 2060 | /is-number@7.0.0: 2061 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2062 | engines: {node: '>=0.12.0'} 2063 | dev: true 2064 | 2065 | /is-path-inside@3.0.3: 2066 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 2067 | engines: {node: '>=8'} 2068 | dev: true 2069 | 2070 | /is-potential-custom-element-name@1.0.1: 2071 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 2072 | dev: true 2073 | 2074 | /is-reference@3.0.2: 2075 | resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} 2076 | dependencies: 2077 | '@types/estree': 1.0.1 2078 | dev: true 2079 | 2080 | /is-regex@1.1.4: 2081 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 2082 | engines: {node: '>= 0.4'} 2083 | dependencies: 2084 | call-bind: 1.0.2 2085 | has-tostringtag: 1.0.0 2086 | dev: true 2087 | 2088 | /is-set@2.0.2: 2089 | resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} 2090 | dev: true 2091 | 2092 | /is-shared-array-buffer@1.0.2: 2093 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 2094 | dependencies: 2095 | call-bind: 1.0.2 2096 | dev: true 2097 | 2098 | /is-string@1.0.7: 2099 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 2100 | engines: {node: '>= 0.4'} 2101 | dependencies: 2102 | has-tostringtag: 1.0.0 2103 | dev: true 2104 | 2105 | /is-symbol@1.0.4: 2106 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 2107 | engines: {node: '>= 0.4'} 2108 | dependencies: 2109 | has-symbols: 1.0.3 2110 | dev: true 2111 | 2112 | /is-typed-array@1.1.12: 2113 | resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 2114 | engines: {node: '>= 0.4'} 2115 | dependencies: 2116 | which-typed-array: 1.1.11 2117 | dev: true 2118 | 2119 | /is-weakmap@2.0.1: 2120 | resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} 2121 | dev: true 2122 | 2123 | /is-weakset@2.0.2: 2124 | resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} 2125 | dependencies: 2126 | call-bind: 1.0.2 2127 | get-intrinsic: 1.2.1 2128 | dev: true 2129 | 2130 | /isarray@2.0.5: 2131 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 2132 | dev: true 2133 | 2134 | /isexe@2.0.0: 2135 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2136 | dev: true 2137 | 2138 | /istanbul-lib-coverage@3.2.0: 2139 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} 2140 | engines: {node: '>=8'} 2141 | dev: true 2142 | 2143 | /istanbul-lib-report@3.0.1: 2144 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 2145 | engines: {node: '>=10'} 2146 | dependencies: 2147 | istanbul-lib-coverage: 3.2.0 2148 | make-dir: 4.0.0 2149 | supports-color: 7.2.0 2150 | dev: true 2151 | 2152 | /istanbul-lib-source-maps@4.0.1: 2153 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 2154 | engines: {node: '>=10'} 2155 | dependencies: 2156 | debug: 4.3.4 2157 | istanbul-lib-coverage: 3.2.0 2158 | source-map: 0.6.1 2159 | transitivePeerDependencies: 2160 | - supports-color 2161 | dev: true 2162 | 2163 | /istanbul-reports@3.1.6: 2164 | resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} 2165 | engines: {node: '>=8'} 2166 | dependencies: 2167 | html-escaper: 2.0.2 2168 | istanbul-lib-report: 3.0.1 2169 | dev: true 2170 | 2171 | /js-sdsl@4.3.0: 2172 | resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} 2173 | dev: true 2174 | 2175 | /js-tokens@4.0.0: 2176 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2177 | dev: true 2178 | 2179 | /js-yaml@4.1.0: 2180 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2181 | hasBin: true 2182 | dependencies: 2183 | argparse: 2.0.1 2184 | dev: true 2185 | 2186 | /jsdom@22.1.0: 2187 | resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} 2188 | engines: {node: '>=16'} 2189 | peerDependencies: 2190 | canvas: ^2.5.0 2191 | peerDependenciesMeta: 2192 | canvas: 2193 | optional: true 2194 | dependencies: 2195 | abab: 2.0.6 2196 | cssstyle: 3.0.0 2197 | data-urls: 4.0.0 2198 | decimal.js: 10.4.3 2199 | domexception: 4.0.0 2200 | form-data: 4.0.0 2201 | html-encoding-sniffer: 3.0.0 2202 | http-proxy-agent: 5.0.0 2203 | https-proxy-agent: 5.0.1 2204 | is-potential-custom-element-name: 1.0.1 2205 | nwsapi: 2.2.7 2206 | parse5: 7.1.2 2207 | rrweb-cssom: 0.6.0 2208 | saxes: 6.0.0 2209 | symbol-tree: 3.2.4 2210 | tough-cookie: 4.1.3 2211 | w3c-xmlserializer: 4.0.0 2212 | webidl-conversions: 7.0.0 2213 | whatwg-encoding: 2.0.0 2214 | whatwg-mimetype: 3.0.0 2215 | whatwg-url: 12.0.1 2216 | ws: 8.14.2 2217 | xml-name-validator: 4.0.0 2218 | transitivePeerDependencies: 2219 | - bufferutil 2220 | - supports-color 2221 | - utf-8-validate 2222 | dev: true 2223 | 2224 | /json-schema-traverse@0.4.1: 2225 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 2226 | dev: true 2227 | 2228 | /json-stable-stringify-without-jsonify@1.0.1: 2229 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 2230 | dev: true 2231 | 2232 | /jsonc-parser@3.2.0: 2233 | resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 2234 | dev: true 2235 | 2236 | /kleur@4.1.5: 2237 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 2238 | engines: {node: '>=6'} 2239 | dev: true 2240 | 2241 | /known-css-properties@0.29.0: 2242 | resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} 2243 | dev: true 2244 | 2245 | /levn@0.4.1: 2246 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2247 | engines: {node: '>= 0.8.0'} 2248 | dependencies: 2249 | prelude-ls: 1.2.1 2250 | type-check: 0.4.0 2251 | dev: true 2252 | 2253 | /lilconfig@2.1.0: 2254 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 2255 | engines: {node: '>=10'} 2256 | dev: true 2257 | 2258 | /local-pkg@0.4.3: 2259 | resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 2260 | engines: {node: '>=14'} 2261 | dev: true 2262 | 2263 | /locate-character@3.0.0: 2264 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 2265 | dev: true 2266 | 2267 | /locate-path@6.0.0: 2268 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 2269 | engines: {node: '>=10'} 2270 | dependencies: 2271 | p-locate: 5.0.0 2272 | dev: true 2273 | 2274 | /lodash.merge@4.6.2: 2275 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2276 | dev: true 2277 | 2278 | /lodash@4.17.21: 2279 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2280 | dev: true 2281 | 2282 | /loupe@2.3.6: 2283 | resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} 2284 | dependencies: 2285 | get-func-name: 2.0.2 2286 | dev: true 2287 | 2288 | /lower-case@2.0.2: 2289 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 2290 | dependencies: 2291 | tslib: 2.5.0 2292 | dev: true 2293 | 2294 | /lru-cache@6.0.0: 2295 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2296 | engines: {node: '>=10'} 2297 | dependencies: 2298 | yallist: 4.0.0 2299 | dev: true 2300 | 2301 | /lz-string@1.5.0: 2302 | resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} 2303 | hasBin: true 2304 | dev: true 2305 | 2306 | /magic-string@0.27.0: 2307 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} 2308 | engines: {node: '>=12'} 2309 | dependencies: 2310 | '@jridgewell/sourcemap-codec': 1.4.15 2311 | dev: true 2312 | 2313 | /magic-string@0.30.0: 2314 | resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} 2315 | engines: {node: '>=12'} 2316 | dependencies: 2317 | '@jridgewell/sourcemap-codec': 1.4.14 2318 | dev: true 2319 | 2320 | /magic-string@0.30.3: 2321 | resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} 2322 | engines: {node: '>=12'} 2323 | dependencies: 2324 | '@jridgewell/sourcemap-codec': 1.4.15 2325 | dev: true 2326 | 2327 | /magic-string@0.30.4: 2328 | resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==} 2329 | engines: {node: '>=12'} 2330 | dependencies: 2331 | '@jridgewell/sourcemap-codec': 1.4.15 2332 | dev: true 2333 | 2334 | /make-dir@4.0.0: 2335 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 2336 | engines: {node: '>=10'} 2337 | dependencies: 2338 | semver: 7.5.4 2339 | dev: true 2340 | 2341 | /mdn-data@2.0.30: 2342 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 2343 | dev: true 2344 | 2345 | /merge2@1.4.1: 2346 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2347 | engines: {node: '>= 8'} 2348 | dev: true 2349 | 2350 | /micromatch@4.0.5: 2351 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2352 | engines: {node: '>=8.6'} 2353 | dependencies: 2354 | braces: 3.0.2 2355 | picomatch: 2.3.1 2356 | dev: true 2357 | 2358 | /mime-db@1.52.0: 2359 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2360 | engines: {node: '>= 0.6'} 2361 | dev: true 2362 | 2363 | /mime-types@2.1.35: 2364 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2365 | engines: {node: '>= 0.6'} 2366 | dependencies: 2367 | mime-db: 1.52.0 2368 | dev: true 2369 | 2370 | /mime@3.0.0: 2371 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 2372 | engines: {node: '>=10.0.0'} 2373 | hasBin: true 2374 | dev: true 2375 | 2376 | /min-indent@1.0.1: 2377 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 2378 | engines: {node: '>=4'} 2379 | dev: true 2380 | 2381 | /minimatch@3.1.2: 2382 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2383 | dependencies: 2384 | brace-expansion: 1.1.11 2385 | dev: true 2386 | 2387 | /minimatch@5.1.6: 2388 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 2389 | engines: {node: '>=10'} 2390 | dependencies: 2391 | brace-expansion: 2.0.1 2392 | dev: true 2393 | 2394 | /minimist@1.2.8: 2395 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 2396 | dev: true 2397 | 2398 | /mkdirp@0.5.6: 2399 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 2400 | hasBin: true 2401 | dependencies: 2402 | minimist: 1.2.8 2403 | dev: true 2404 | 2405 | /mlly@1.4.2: 2406 | resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} 2407 | dependencies: 2408 | acorn: 8.10.0 2409 | pathe: 1.1.1 2410 | pkg-types: 1.0.3 2411 | ufo: 1.3.1 2412 | dev: true 2413 | 2414 | /mri@1.2.0: 2415 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 2416 | engines: {node: '>=4'} 2417 | dev: true 2418 | 2419 | /mrmime@1.0.1: 2420 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 2421 | engines: {node: '>=10'} 2422 | dev: true 2423 | 2424 | /ms@2.1.2: 2425 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2426 | dev: true 2427 | 2428 | /nanoid@3.3.4: 2429 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 2430 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2431 | hasBin: true 2432 | dev: true 2433 | 2434 | /nanoid@3.3.7: 2435 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 2436 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2437 | hasBin: true 2438 | dev: true 2439 | 2440 | /natural-compare-lite@1.4.0: 2441 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 2442 | dev: true 2443 | 2444 | /natural-compare@1.4.0: 2445 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2446 | dev: true 2447 | 2448 | /no-case@3.0.4: 2449 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 2450 | dependencies: 2451 | lower-case: 2.0.2 2452 | tslib: 2.5.0 2453 | dev: true 2454 | 2455 | /node-fetch@2.7.0: 2456 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 2457 | engines: {node: 4.x || >=6.0.0} 2458 | peerDependencies: 2459 | encoding: ^0.1.0 2460 | peerDependenciesMeta: 2461 | encoding: 2462 | optional: true 2463 | dependencies: 2464 | whatwg-url: 5.0.0 2465 | dev: true 2466 | 2467 | /normalize-path@3.0.0: 2468 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2469 | engines: {node: '>=0.10.0'} 2470 | dev: true 2471 | 2472 | /npm-bundled@2.0.1: 2473 | resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} 2474 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2475 | dependencies: 2476 | npm-normalize-package-bin: 2.0.0 2477 | dev: true 2478 | 2479 | /npm-normalize-package-bin@2.0.0: 2480 | resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} 2481 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2482 | dev: true 2483 | 2484 | /npm-packlist@5.1.3: 2485 | resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} 2486 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2487 | hasBin: true 2488 | dependencies: 2489 | glob: 8.1.0 2490 | ignore-walk: 5.0.1 2491 | npm-bundled: 2.0.1 2492 | npm-normalize-package-bin: 2.0.0 2493 | dev: true 2494 | 2495 | /nwsapi@2.2.7: 2496 | resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} 2497 | dev: true 2498 | 2499 | /object-inspect@1.12.3: 2500 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 2501 | dev: true 2502 | 2503 | /object-is@1.1.5: 2504 | resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} 2505 | engines: {node: '>= 0.4'} 2506 | dependencies: 2507 | call-bind: 1.0.2 2508 | define-properties: 1.2.1 2509 | dev: true 2510 | 2511 | /object-keys@1.1.1: 2512 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 2513 | engines: {node: '>= 0.4'} 2514 | dev: true 2515 | 2516 | /object.assign@4.1.4: 2517 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 2518 | engines: {node: '>= 0.4'} 2519 | dependencies: 2520 | call-bind: 1.0.2 2521 | define-properties: 1.2.1 2522 | has-symbols: 1.0.3 2523 | object-keys: 1.1.1 2524 | dev: true 2525 | 2526 | /once@1.4.0: 2527 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2528 | dependencies: 2529 | wrappy: 1.0.2 2530 | dev: true 2531 | 2532 | /optionator@0.9.1: 2533 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 2534 | engines: {node: '>= 0.8.0'} 2535 | dependencies: 2536 | deep-is: 0.1.4 2537 | fast-levenshtein: 2.0.6 2538 | levn: 0.4.1 2539 | prelude-ls: 1.2.1 2540 | type-check: 0.4.0 2541 | word-wrap: 1.2.3 2542 | dev: true 2543 | 2544 | /p-limit@3.1.0: 2545 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2546 | engines: {node: '>=10'} 2547 | dependencies: 2548 | yocto-queue: 0.1.0 2549 | dev: true 2550 | 2551 | /p-limit@4.0.0: 2552 | resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 2553 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2554 | dependencies: 2555 | yocto-queue: 1.0.0 2556 | dev: true 2557 | 2558 | /p-locate@5.0.0: 2559 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2560 | engines: {node: '>=10'} 2561 | dependencies: 2562 | p-limit: 3.1.0 2563 | dev: true 2564 | 2565 | /parent-module@1.0.1: 2566 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2567 | engines: {node: '>=6'} 2568 | dependencies: 2569 | callsites: 3.1.0 2570 | dev: true 2571 | 2572 | /parse5@7.1.2: 2573 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 2574 | dependencies: 2575 | entities: 4.5.0 2576 | dev: true 2577 | 2578 | /pascal-case@3.1.2: 2579 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 2580 | dependencies: 2581 | no-case: 3.0.4 2582 | tslib: 2.5.0 2583 | dev: true 2584 | 2585 | /path-exists@4.0.0: 2586 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2587 | engines: {node: '>=8'} 2588 | dev: true 2589 | 2590 | /path-is-absolute@1.0.1: 2591 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2592 | engines: {node: '>=0.10.0'} 2593 | dev: true 2594 | 2595 | /path-key@3.1.1: 2596 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2597 | engines: {node: '>=8'} 2598 | dev: true 2599 | 2600 | /path-parse@1.0.7: 2601 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2602 | dev: true 2603 | 2604 | /path-type@4.0.0: 2605 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2606 | engines: {node: '>=8'} 2607 | dev: true 2608 | 2609 | /pathe@1.1.1: 2610 | resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} 2611 | dev: true 2612 | 2613 | /pathval@1.1.1: 2614 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 2615 | dev: true 2616 | 2617 | /periscopic@3.1.0: 2618 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 2619 | dependencies: 2620 | '@types/estree': 1.0.1 2621 | estree-walker: 3.0.3 2622 | is-reference: 3.0.2 2623 | dev: true 2624 | 2625 | /picocolors@1.0.0: 2626 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2627 | dev: true 2628 | 2629 | /picomatch@2.3.1: 2630 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2631 | engines: {node: '>=8.6'} 2632 | dev: true 2633 | 2634 | /pkg-types@1.0.3: 2635 | resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 2636 | dependencies: 2637 | jsonc-parser: 3.2.0 2638 | mlly: 1.4.2 2639 | pathe: 1.1.1 2640 | dev: true 2641 | 2642 | /postcss-load-config@3.1.4(postcss@8.4.31): 2643 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 2644 | engines: {node: '>= 10'} 2645 | peerDependencies: 2646 | postcss: '>=8.0.9' 2647 | ts-node: '>=9.0.0' 2648 | peerDependenciesMeta: 2649 | postcss: 2650 | optional: true 2651 | ts-node: 2652 | optional: true 2653 | dependencies: 2654 | lilconfig: 2.1.0 2655 | postcss: 8.4.31 2656 | yaml: 1.10.2 2657 | dev: true 2658 | 2659 | /postcss-safe-parser@6.0.0(postcss@8.4.31): 2660 | resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} 2661 | engines: {node: '>=12.0'} 2662 | peerDependencies: 2663 | postcss: ^8.3.3 2664 | dependencies: 2665 | postcss: 8.4.31 2666 | dev: true 2667 | 2668 | /postcss-scss@4.0.9(postcss@8.4.31): 2669 | resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} 2670 | engines: {node: '>=12.0'} 2671 | peerDependencies: 2672 | postcss: ^8.4.29 2673 | dependencies: 2674 | postcss: 8.4.31 2675 | dev: true 2676 | 2677 | /postcss-selector-parser@6.0.13: 2678 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} 2679 | engines: {node: '>=4'} 2680 | dependencies: 2681 | cssesc: 3.0.0 2682 | util-deprecate: 1.0.2 2683 | dev: true 2684 | 2685 | /postcss@8.4.21: 2686 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 2687 | engines: {node: ^10 || ^12 || >=14} 2688 | dependencies: 2689 | nanoid: 3.3.4 2690 | picocolors: 1.0.0 2691 | source-map-js: 1.0.2 2692 | dev: true 2693 | 2694 | /postcss@8.4.31: 2695 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 2696 | engines: {node: ^10 || ^12 || >=14} 2697 | dependencies: 2698 | nanoid: 3.3.7 2699 | picocolors: 1.0.0 2700 | source-map-js: 1.0.2 2701 | dev: true 2702 | 2703 | /prelude-ls@1.2.1: 2704 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2705 | engines: {node: '>= 0.8.0'} 2706 | dev: true 2707 | 2708 | /prettier-plugin-svelte@3.1.2(prettier@3.1.0)(svelte@4.2.0): 2709 | resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==} 2710 | peerDependencies: 2711 | prettier: ^3.0.0 2712 | svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 2713 | dependencies: 2714 | prettier: 3.1.0 2715 | svelte: 4.2.0 2716 | dev: true 2717 | 2718 | /prettier@3.1.0: 2719 | resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} 2720 | engines: {node: '>=14'} 2721 | hasBin: true 2722 | dev: true 2723 | 2724 | /pretty-format@27.5.1: 2725 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} 2726 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2727 | dependencies: 2728 | ansi-regex: 5.0.1 2729 | ansi-styles: 5.2.0 2730 | react-is: 17.0.2 2731 | dev: true 2732 | 2733 | /pretty-format@29.7.0: 2734 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 2735 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2736 | dependencies: 2737 | '@jest/schemas': 29.6.3 2738 | ansi-styles: 5.2.0 2739 | react-is: 18.2.0 2740 | dev: true 2741 | 2742 | /psl@1.9.0: 2743 | resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} 2744 | dev: true 2745 | 2746 | /publint@0.1.9: 2747 | resolution: {integrity: sha512-O53y7vbePxuGFmEjgcrafMSlDpOJwOkj8YdexOt7yWlv7SB3rXoT3mHknyMJ3lf2UFH5Bmt6tnIkHcOTR6dEoA==} 2748 | engines: {node: '>=16'} 2749 | hasBin: true 2750 | dependencies: 2751 | npm-packlist: 5.1.3 2752 | picocolors: 1.0.0 2753 | sade: 1.8.1 2754 | dev: true 2755 | 2756 | /punycode@2.3.0: 2757 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 2758 | engines: {node: '>=6'} 2759 | dev: true 2760 | 2761 | /querystringify@2.2.0: 2762 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 2763 | dev: true 2764 | 2765 | /queue-microtask@1.2.3: 2766 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2767 | dev: true 2768 | 2769 | /react-is@17.0.2: 2770 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 2771 | dev: true 2772 | 2773 | /react-is@18.2.0: 2774 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 2775 | dev: true 2776 | 2777 | /readdirp@3.6.0: 2778 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2779 | engines: {node: '>=8.10.0'} 2780 | dependencies: 2781 | picomatch: 2.3.1 2782 | dev: true 2783 | 2784 | /redent@3.0.0: 2785 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 2786 | engines: {node: '>=8'} 2787 | dependencies: 2788 | indent-string: 4.0.0 2789 | strip-indent: 3.0.0 2790 | dev: true 2791 | 2792 | /regenerator-runtime@0.13.11: 2793 | resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} 2794 | dev: true 2795 | 2796 | /regexp.prototype.flags@1.5.1: 2797 | resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} 2798 | engines: {node: '>= 0.4'} 2799 | dependencies: 2800 | call-bind: 1.0.2 2801 | define-properties: 1.2.1 2802 | set-function-name: 2.0.1 2803 | dev: true 2804 | 2805 | /regexpp@3.2.0: 2806 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2807 | engines: {node: '>=8'} 2808 | dev: true 2809 | 2810 | /requires-port@1.0.0: 2811 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 2812 | dev: true 2813 | 2814 | /resolve-from@4.0.0: 2815 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2816 | engines: {node: '>=4'} 2817 | dev: true 2818 | 2819 | /resolve@1.22.1: 2820 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 2821 | hasBin: true 2822 | dependencies: 2823 | is-core-module: 2.11.0 2824 | path-parse: 1.0.7 2825 | supports-preserve-symlinks-flag: 1.0.0 2826 | dev: true 2827 | 2828 | /reusify@1.0.4: 2829 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2830 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2831 | dev: true 2832 | 2833 | /rimraf@2.7.1: 2834 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 2835 | hasBin: true 2836 | dependencies: 2837 | glob: 7.2.3 2838 | dev: true 2839 | 2840 | /rimraf@3.0.2: 2841 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2842 | hasBin: true 2843 | dependencies: 2844 | glob: 7.2.3 2845 | dev: true 2846 | 2847 | /rollup@3.17.3: 2848 | resolution: {integrity: sha512-p5LaCXiiOL/wrOkj8djsIDFmyU9ysUxcyW+EKRLHb6TKldJzXpImjcRSR+vgo09DBdofGcOoLOsRyxxG2n5/qQ==} 2849 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 2850 | hasBin: true 2851 | optionalDependencies: 2852 | fsevents: 2.3.3 2853 | dev: true 2854 | 2855 | /rrweb-cssom@0.6.0: 2856 | resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} 2857 | dev: true 2858 | 2859 | /run-parallel@1.2.0: 2860 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2861 | dependencies: 2862 | queue-microtask: 1.2.3 2863 | dev: true 2864 | 2865 | /sade@1.8.1: 2866 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 2867 | engines: {node: '>=6'} 2868 | dependencies: 2869 | mri: 1.2.0 2870 | dev: true 2871 | 2872 | /safer-buffer@2.1.2: 2873 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2874 | dev: true 2875 | 2876 | /sander@0.5.1: 2877 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 2878 | dependencies: 2879 | es6-promise: 3.3.1 2880 | graceful-fs: 4.2.11 2881 | mkdirp: 0.5.6 2882 | rimraf: 2.7.1 2883 | dev: true 2884 | 2885 | /saxes@6.0.0: 2886 | resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 2887 | engines: {node: '>=v12.22.7'} 2888 | dependencies: 2889 | xmlchars: 2.2.0 2890 | dev: true 2891 | 2892 | /semver@7.3.8: 2893 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 2894 | engines: {node: '>=10'} 2895 | hasBin: true 2896 | dependencies: 2897 | lru-cache: 6.0.0 2898 | dev: true 2899 | 2900 | /semver@7.5.4: 2901 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2902 | engines: {node: '>=10'} 2903 | hasBin: true 2904 | dependencies: 2905 | lru-cache: 6.0.0 2906 | dev: true 2907 | 2908 | /set-cookie-parser@2.6.0: 2909 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 2910 | dev: true 2911 | 2912 | /set-function-name@2.0.1: 2913 | resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} 2914 | engines: {node: '>= 0.4'} 2915 | dependencies: 2916 | define-data-property: 1.1.0 2917 | functions-have-names: 1.2.3 2918 | has-property-descriptors: 1.0.0 2919 | dev: true 2920 | 2921 | /shebang-command@2.0.0: 2922 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2923 | engines: {node: '>=8'} 2924 | dependencies: 2925 | shebang-regex: 3.0.0 2926 | dev: true 2927 | 2928 | /shebang-regex@3.0.0: 2929 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2930 | engines: {node: '>=8'} 2931 | dev: true 2932 | 2933 | /side-channel@1.0.4: 2934 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2935 | dependencies: 2936 | call-bind: 1.0.2 2937 | get-intrinsic: 1.2.1 2938 | object-inspect: 1.12.3 2939 | dev: true 2940 | 2941 | /siginfo@2.0.0: 2942 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2943 | dev: true 2944 | 2945 | /sirv@2.0.2: 2946 | resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} 2947 | engines: {node: '>= 10'} 2948 | dependencies: 2949 | '@polka/url': 1.0.0-next.21 2950 | mrmime: 1.0.1 2951 | totalist: 3.0.0 2952 | dev: true 2953 | 2954 | /slash@3.0.0: 2955 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2956 | engines: {node: '>=8'} 2957 | dev: true 2958 | 2959 | /sorcery@0.11.0: 2960 | resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} 2961 | hasBin: true 2962 | dependencies: 2963 | '@jridgewell/sourcemap-codec': 1.4.15 2964 | buffer-crc32: 0.2.13 2965 | minimist: 1.2.8 2966 | sander: 0.5.1 2967 | dev: true 2968 | 2969 | /source-map-js@1.0.2: 2970 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2971 | engines: {node: '>=0.10.0'} 2972 | dev: true 2973 | 2974 | /source-map@0.6.1: 2975 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2976 | engines: {node: '>=0.10.0'} 2977 | dev: true 2978 | 2979 | /stackback@0.0.2: 2980 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 2981 | dev: true 2982 | 2983 | /std-env@3.4.3: 2984 | resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} 2985 | dev: true 2986 | 2987 | /stop-iteration-iterator@1.0.0: 2988 | resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} 2989 | engines: {node: '>= 0.4'} 2990 | dependencies: 2991 | internal-slot: 1.0.5 2992 | dev: true 2993 | 2994 | /streamsearch@1.1.0: 2995 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 2996 | engines: {node: '>=10.0.0'} 2997 | dev: true 2998 | 2999 | /strip-ansi@6.0.1: 3000 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3001 | engines: {node: '>=8'} 3002 | dependencies: 3003 | ansi-regex: 5.0.1 3004 | dev: true 3005 | 3006 | /strip-indent@3.0.0: 3007 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 3008 | engines: {node: '>=8'} 3009 | dependencies: 3010 | min-indent: 1.0.1 3011 | dev: true 3012 | 3013 | /strip-json-comments@3.1.1: 3014 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 3015 | engines: {node: '>=8'} 3016 | dev: true 3017 | 3018 | /strip-literal@1.3.0: 3019 | resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} 3020 | dependencies: 3021 | acorn: 8.10.0 3022 | dev: true 3023 | 3024 | /supports-color@5.5.0: 3025 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 3026 | engines: {node: '>=4'} 3027 | dependencies: 3028 | has-flag: 3.0.0 3029 | dev: true 3030 | 3031 | /supports-color@7.2.0: 3032 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 3033 | engines: {node: '>=8'} 3034 | dependencies: 3035 | has-flag: 4.0.0 3036 | dev: true 3037 | 3038 | /supports-preserve-symlinks-flag@1.0.0: 3039 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 3040 | engines: {node: '>= 0.4'} 3041 | dev: true 3042 | 3043 | /svelte-check@3.5.2(postcss@8.4.31)(svelte@4.2.0): 3044 | resolution: {integrity: sha512-5a/YWbiH4c+AqAUP+0VneiV5bP8YOk9JL3jwvN+k2PEPLgpu85bjQc5eE67+eIZBBwUEJzmO3I92OqKcqbp3fw==} 3045 | hasBin: true 3046 | peerDependencies: 3047 | svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 3048 | dependencies: 3049 | '@jridgewell/trace-mapping': 0.3.17 3050 | chokidar: 3.5.3 3051 | fast-glob: 3.2.12 3052 | import-fresh: 3.3.0 3053 | picocolors: 1.0.0 3054 | sade: 1.8.1 3055 | svelte: 4.2.0 3056 | svelte-preprocess: 5.0.4(postcss@8.4.31)(svelte@4.2.0)(typescript@5.2.2) 3057 | typescript: 5.2.2 3058 | transitivePeerDependencies: 3059 | - '@babel/core' 3060 | - coffeescript 3061 | - less 3062 | - postcss 3063 | - postcss-load-config 3064 | - pug 3065 | - sass 3066 | - stylus 3067 | - sugarss 3068 | dev: true 3069 | 3070 | /svelte-eslint-parser@0.34.0-next.5(svelte@4.2.0): 3071 | resolution: {integrity: sha512-Q8vcpmPv6hiqLsk6uHBngt3CzT5VuXMW/6YmztxqHDrYkMBfyOsr3gBJSuKp+cdMrn7IhVSet4NGJX1nOXz5Kw==} 3072 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 3073 | peerDependencies: 3074 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.10 3075 | peerDependenciesMeta: 3076 | svelte: 3077 | optional: true 3078 | dependencies: 3079 | eslint-scope: 7.2.2 3080 | eslint-visitor-keys: 3.4.3 3081 | espree: 9.6.1 3082 | postcss: 8.4.31 3083 | postcss-scss: 4.0.9(postcss@8.4.31) 3084 | svelte: 4.2.0 3085 | dev: true 3086 | 3087 | /svelte-hmr@0.15.3(svelte@4.2.0): 3088 | resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} 3089 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 3090 | peerDependencies: 3091 | svelte: ^3.19.0 || ^4.0.0 3092 | dependencies: 3093 | svelte: 4.2.0 3094 | dev: true 3095 | 3096 | /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.0)(typescript@5.2.2): 3097 | resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} 3098 | engines: {node: '>= 14.10.0'} 3099 | requiresBuild: true 3100 | peerDependencies: 3101 | '@babel/core': ^7.10.2 3102 | coffeescript: ^2.5.1 3103 | less: ^3.11.3 || ^4.0.0 3104 | postcss: ^7 || ^8 3105 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 3106 | pug: ^3.0.0 3107 | sass: ^1.26.8 3108 | stylus: ^0.55.0 3109 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 3110 | svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 3111 | typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' 3112 | peerDependenciesMeta: 3113 | '@babel/core': 3114 | optional: true 3115 | coffeescript: 3116 | optional: true 3117 | less: 3118 | optional: true 3119 | postcss: 3120 | optional: true 3121 | postcss-load-config: 3122 | optional: true 3123 | pug: 3124 | optional: true 3125 | sass: 3126 | optional: true 3127 | stylus: 3128 | optional: true 3129 | sugarss: 3130 | optional: true 3131 | typescript: 3132 | optional: true 3133 | dependencies: 3134 | '@types/pug': 2.0.7 3135 | detect-indent: 6.1.0 3136 | magic-string: 0.27.0 3137 | postcss: 8.4.31 3138 | sorcery: 0.11.0 3139 | strip-indent: 3.0.0 3140 | svelte: 4.2.0 3141 | typescript: 5.2.2 3142 | dev: true 3143 | 3144 | /svelte2tsx@0.6.22(svelte@4.2.0)(typescript@4.9.5): 3145 | resolution: {integrity: sha512-eFCfz0juaWeanbwGeQV21kPMwH3LKhfrUYRy1PqRmlieuHvJs8VeK7CaoHJdpBZWCXba2cltHVdywJmwOGhbww==} 3146 | peerDependencies: 3147 | svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 3148 | typescript: ^4.9.4 || ^5.0.0 3149 | dependencies: 3150 | dedent-js: 1.0.1 3151 | pascal-case: 3.1.2 3152 | svelte: 4.2.0 3153 | typescript: 4.9.5 3154 | dev: true 3155 | 3156 | /svelte@4.2.0: 3157 | resolution: {integrity: sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==} 3158 | engines: {node: '>=16'} 3159 | dependencies: 3160 | '@ampproject/remapping': 2.2.1 3161 | '@jridgewell/sourcemap-codec': 1.4.15 3162 | '@jridgewell/trace-mapping': 0.3.19 3163 | acorn: 8.10.0 3164 | aria-query: 5.3.0 3165 | axobject-query: 3.2.1 3166 | code-red: 1.0.4 3167 | css-tree: 2.3.1 3168 | estree-walker: 3.0.3 3169 | is-reference: 3.0.2 3170 | locate-character: 3.0.0 3171 | magic-string: 0.30.0 3172 | periscopic: 3.1.0 3173 | dev: true 3174 | 3175 | /symbol-tree@3.2.4: 3176 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 3177 | dev: true 3178 | 3179 | /test-exclude@6.0.0: 3180 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 3181 | engines: {node: '>=8'} 3182 | dependencies: 3183 | '@istanbuljs/schema': 0.1.3 3184 | glob: 7.2.3 3185 | minimatch: 3.1.2 3186 | dev: true 3187 | 3188 | /text-table@0.2.0: 3189 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 3190 | dev: true 3191 | 3192 | /tiny-glob@0.2.9: 3193 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 3194 | dependencies: 3195 | globalyzer: 0.1.0 3196 | globrex: 0.1.2 3197 | dev: true 3198 | 3199 | /tinybench@2.5.1: 3200 | resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} 3201 | dev: true 3202 | 3203 | /tinypool@0.7.0: 3204 | resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} 3205 | engines: {node: '>=14.0.0'} 3206 | dev: true 3207 | 3208 | /tinyspy@2.2.0: 3209 | resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} 3210 | engines: {node: '>=14.0.0'} 3211 | dev: true 3212 | 3213 | /to-regex-range@5.0.1: 3214 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3215 | engines: {node: '>=8.0'} 3216 | dependencies: 3217 | is-number: 7.0.0 3218 | dev: true 3219 | 3220 | /totalist@3.0.0: 3221 | resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} 3222 | engines: {node: '>=6'} 3223 | dev: true 3224 | 3225 | /tough-cookie@4.1.3: 3226 | resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} 3227 | engines: {node: '>=6'} 3228 | dependencies: 3229 | psl: 1.9.0 3230 | punycode: 2.3.0 3231 | universalify: 0.2.0 3232 | url-parse: 1.5.10 3233 | dev: true 3234 | 3235 | /tr46@0.0.3: 3236 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 3237 | dev: true 3238 | 3239 | /tr46@4.1.1: 3240 | resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} 3241 | engines: {node: '>=14'} 3242 | dependencies: 3243 | punycode: 2.3.0 3244 | dev: true 3245 | 3246 | /tslib@1.14.1: 3247 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 3248 | dev: true 3249 | 3250 | /tslib@2.5.0: 3251 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 3252 | dev: true 3253 | 3254 | /tsutils@3.21.0(typescript@4.9.5): 3255 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 3256 | engines: {node: '>= 6'} 3257 | peerDependencies: 3258 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 3259 | dependencies: 3260 | tslib: 1.14.1 3261 | typescript: 4.9.5 3262 | dev: true 3263 | 3264 | /type-check@0.4.0: 3265 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 3266 | engines: {node: '>= 0.8.0'} 3267 | dependencies: 3268 | prelude-ls: 1.2.1 3269 | dev: true 3270 | 3271 | /type-detect@4.0.8: 3272 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 3273 | engines: {node: '>=4'} 3274 | dev: true 3275 | 3276 | /type-fest@0.20.2: 3277 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 3278 | engines: {node: '>=10'} 3279 | dev: true 3280 | 3281 | /typescript@4.9.5: 3282 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 3283 | engines: {node: '>=4.2.0'} 3284 | hasBin: true 3285 | dev: true 3286 | 3287 | /typescript@5.2.2: 3288 | resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} 3289 | engines: {node: '>=14.17'} 3290 | hasBin: true 3291 | dev: true 3292 | 3293 | /ufo@1.3.1: 3294 | resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} 3295 | dev: true 3296 | 3297 | /undici@5.23.0: 3298 | resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} 3299 | engines: {node: '>=14.0'} 3300 | dependencies: 3301 | busboy: 1.6.0 3302 | dev: true 3303 | 3304 | /universalify@0.2.0: 3305 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 3306 | engines: {node: '>= 4.0.0'} 3307 | dev: true 3308 | 3309 | /uri-js@4.4.1: 3310 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 3311 | dependencies: 3312 | punycode: 2.3.0 3313 | dev: true 3314 | 3315 | /url-parse@1.5.10: 3316 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 3317 | dependencies: 3318 | querystringify: 2.2.0 3319 | requires-port: 1.0.0 3320 | dev: true 3321 | 3322 | /util-deprecate@1.0.2: 3323 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 3324 | dev: true 3325 | 3326 | /v8-to-istanbul@9.1.3: 3327 | resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} 3328 | engines: {node: '>=10.12.0'} 3329 | dependencies: 3330 | '@jridgewell/trace-mapping': 0.3.19 3331 | '@types/istanbul-lib-coverage': 2.0.4 3332 | convert-source-map: 2.0.0 3333 | dev: true 3334 | 3335 | /vite-node@0.34.6(@types/node@20.8.3): 3336 | resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} 3337 | engines: {node: '>=v14.18.0'} 3338 | hasBin: true 3339 | dependencies: 3340 | cac: 6.7.14 3341 | debug: 4.3.4 3342 | mlly: 1.4.2 3343 | pathe: 1.1.1 3344 | picocolors: 1.0.0 3345 | vite: 4.1.4(@types/node@20.8.3) 3346 | transitivePeerDependencies: 3347 | - '@types/node' 3348 | - less 3349 | - sass 3350 | - stylus 3351 | - sugarss 3352 | - supports-color 3353 | - terser 3354 | dev: true 3355 | 3356 | /vite@4.1.4(@types/node@20.8.3): 3357 | resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} 3358 | engines: {node: ^14.18.0 || >=16.0.0} 3359 | hasBin: true 3360 | peerDependencies: 3361 | '@types/node': '>= 14' 3362 | less: '*' 3363 | sass: '*' 3364 | stylus: '*' 3365 | sugarss: '*' 3366 | terser: ^5.4.0 3367 | peerDependenciesMeta: 3368 | '@types/node': 3369 | optional: true 3370 | less: 3371 | optional: true 3372 | sass: 3373 | optional: true 3374 | stylus: 3375 | optional: true 3376 | sugarss: 3377 | optional: true 3378 | terser: 3379 | optional: true 3380 | dependencies: 3381 | '@types/node': 20.8.3 3382 | esbuild: 0.16.17 3383 | postcss: 8.4.21 3384 | resolve: 1.22.1 3385 | rollup: 3.17.3 3386 | optionalDependencies: 3387 | fsevents: 2.3.3 3388 | dev: true 3389 | 3390 | /vitefu@0.2.4(vite@4.1.4): 3391 | resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} 3392 | peerDependencies: 3393 | vite: ^3.0.0 || ^4.0.0 3394 | peerDependenciesMeta: 3395 | vite: 3396 | optional: true 3397 | dependencies: 3398 | vite: 4.1.4(@types/node@20.8.3) 3399 | dev: true 3400 | 3401 | /vitest@0.34.6(jsdom@22.1.0): 3402 | resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} 3403 | engines: {node: '>=v14.18.0'} 3404 | hasBin: true 3405 | peerDependencies: 3406 | '@edge-runtime/vm': '*' 3407 | '@vitest/browser': '*' 3408 | '@vitest/ui': '*' 3409 | happy-dom: '*' 3410 | jsdom: '*' 3411 | playwright: '*' 3412 | safaridriver: '*' 3413 | webdriverio: '*' 3414 | peerDependenciesMeta: 3415 | '@edge-runtime/vm': 3416 | optional: true 3417 | '@vitest/browser': 3418 | optional: true 3419 | '@vitest/ui': 3420 | optional: true 3421 | happy-dom: 3422 | optional: true 3423 | jsdom: 3424 | optional: true 3425 | playwright: 3426 | optional: true 3427 | safaridriver: 3428 | optional: true 3429 | webdriverio: 3430 | optional: true 3431 | dependencies: 3432 | '@types/chai': 4.3.6 3433 | '@types/chai-subset': 1.3.3 3434 | '@types/node': 20.8.3 3435 | '@vitest/expect': 0.34.6 3436 | '@vitest/runner': 0.34.6 3437 | '@vitest/snapshot': 0.34.6 3438 | '@vitest/spy': 0.34.6 3439 | '@vitest/utils': 0.34.6 3440 | acorn: 8.10.0 3441 | acorn-walk: 8.2.0 3442 | cac: 6.7.14 3443 | chai: 4.3.10 3444 | debug: 4.3.4 3445 | jsdom: 22.1.0 3446 | local-pkg: 0.4.3 3447 | magic-string: 0.30.4 3448 | pathe: 1.1.1 3449 | picocolors: 1.0.0 3450 | std-env: 3.4.3 3451 | strip-literal: 1.3.0 3452 | tinybench: 2.5.1 3453 | tinypool: 0.7.0 3454 | vite: 4.1.4(@types/node@20.8.3) 3455 | vite-node: 0.34.6(@types/node@20.8.3) 3456 | why-is-node-running: 2.2.2 3457 | transitivePeerDependencies: 3458 | - less 3459 | - sass 3460 | - stylus 3461 | - sugarss 3462 | - supports-color 3463 | - terser 3464 | dev: true 3465 | 3466 | /w3c-xmlserializer@4.0.0: 3467 | resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} 3468 | engines: {node: '>=14'} 3469 | dependencies: 3470 | xml-name-validator: 4.0.0 3471 | dev: true 3472 | 3473 | /webidl-conversions@3.0.1: 3474 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 3475 | dev: true 3476 | 3477 | /webidl-conversions@7.0.0: 3478 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 3479 | engines: {node: '>=12'} 3480 | dev: true 3481 | 3482 | /whatwg-encoding@2.0.0: 3483 | resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} 3484 | engines: {node: '>=12'} 3485 | dependencies: 3486 | iconv-lite: 0.6.3 3487 | dev: true 3488 | 3489 | /whatwg-mimetype@3.0.0: 3490 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 3491 | engines: {node: '>=12'} 3492 | dev: true 3493 | 3494 | /whatwg-url@12.0.1: 3495 | resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} 3496 | engines: {node: '>=14'} 3497 | dependencies: 3498 | tr46: 4.1.1 3499 | webidl-conversions: 7.0.0 3500 | dev: true 3501 | 3502 | /whatwg-url@5.0.0: 3503 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 3504 | dependencies: 3505 | tr46: 0.0.3 3506 | webidl-conversions: 3.0.1 3507 | dev: true 3508 | 3509 | /which-boxed-primitive@1.0.2: 3510 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 3511 | dependencies: 3512 | is-bigint: 1.0.4 3513 | is-boolean-object: 1.1.2 3514 | is-number-object: 1.0.7 3515 | is-string: 1.0.7 3516 | is-symbol: 1.0.4 3517 | dev: true 3518 | 3519 | /which-collection@1.0.1: 3520 | resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} 3521 | dependencies: 3522 | is-map: 2.0.2 3523 | is-set: 2.0.2 3524 | is-weakmap: 2.0.1 3525 | is-weakset: 2.0.2 3526 | dev: true 3527 | 3528 | /which-typed-array@1.1.11: 3529 | resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} 3530 | engines: {node: '>= 0.4'} 3531 | dependencies: 3532 | available-typed-arrays: 1.0.5 3533 | call-bind: 1.0.2 3534 | for-each: 0.3.3 3535 | gopd: 1.0.1 3536 | has-tostringtag: 1.0.0 3537 | dev: true 3538 | 3539 | /which@2.0.2: 3540 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3541 | engines: {node: '>= 8'} 3542 | hasBin: true 3543 | dependencies: 3544 | isexe: 2.0.0 3545 | dev: true 3546 | 3547 | /why-is-node-running@2.2.2: 3548 | resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 3549 | engines: {node: '>=8'} 3550 | hasBin: true 3551 | dependencies: 3552 | siginfo: 2.0.0 3553 | stackback: 0.0.2 3554 | dev: true 3555 | 3556 | /word-wrap@1.2.3: 3557 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 3558 | engines: {node: '>=0.10.0'} 3559 | dev: true 3560 | 3561 | /wrappy@1.0.2: 3562 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 3563 | dev: true 3564 | 3565 | /ws@8.14.2: 3566 | resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} 3567 | engines: {node: '>=10.0.0'} 3568 | peerDependencies: 3569 | bufferutil: ^4.0.1 3570 | utf-8-validate: '>=5.0.2' 3571 | peerDependenciesMeta: 3572 | bufferutil: 3573 | optional: true 3574 | utf-8-validate: 3575 | optional: true 3576 | dev: true 3577 | 3578 | /xml-name-validator@4.0.0: 3579 | resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 3580 | engines: {node: '>=12'} 3581 | dev: true 3582 | 3583 | /xmlchars@2.2.0: 3584 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 3585 | dev: true 3586 | 3587 | /yallist@4.0.0: 3588 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 3589 | dev: true 3590 | 3591 | /yaml@1.10.2: 3592 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 3593 | engines: {node: '>= 6'} 3594 | dev: true 3595 | 3596 | /yocto-queue@0.1.0: 3597 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3598 | engines: {node: '>=10'} 3599 | dev: true 3600 | 3601 | /yocto-queue@1.0.0: 3602 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 3603 | engines: {node: '>=12.20'} 3604 | dev: true 3605 | --------------------------------------------------------------------------------