├── src ├── index.ts ├── utils.ts └── store.ts ├── .npmignore ├── .prettierrc ├── .gitignore ├── jest.config.cjs ├── rollup.config.mjs ├── tsconfig.json ├── LICENSE ├── package.json ├── tests ├── utils.spec.ts └── store.spec.ts ├── README.md └── pnpm-lock.yaml /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './store'; 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | * 2 | !dist/**/* 3 | !node_modules/* 4 | package.json 5 | package-lock.json 6 | LICENSE -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "printWidth": 80, 4 | "proseWrap": "always", 5 | "singleQuote": true, 6 | "trailingComma": "es5" 7 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # NPM logs and reports 2 | logs 3 | *.log 4 | npm-debug.log* 5 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 6 | 7 | # Dependencies and build output 8 | node_modules/ 9 | /dist/ 10 | /coverage/ 11 | 12 | # Editor and system files 13 | .idea/ 14 | .vscode/ 15 | .DS_Store 16 | -------------------------------------------------------------------------------- /jest.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ 2 | module.exports = { 3 | rootDir: __dirname, 4 | 5 | // Mocking 6 | clearMocks: true, 7 | 8 | // Coverage 9 | collectCoverage: true, 10 | collectCoverageFrom: ['src/**/*.ts'], 11 | coverageDirectory: 'coverage', 12 | coveragePathIgnorePatterns: ['node_modules/', 'src/index.ts'], 13 | coverageReporters: ['json', 'text', 'lcov'], 14 | 15 | // Environment and runtime 16 | testEnvironment: 'jsdom', 17 | testMatch: ['/tests/**/*.spec.ts'], 18 | moduleNameMapper: { 19 | '^pinia-cached-store$': '/src', 20 | }, 21 | transform: { 22 | '^.+\\.tsx?$': '@sucrase/jest-plugin', 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript'; 2 | import terser from '@rollup/plugin-terser'; 3 | 4 | export default { 5 | input: 'src/index.ts', 6 | output: [ 7 | { 8 | dir: 'dist', 9 | format: 'es', 10 | sourcemap: true, 11 | }, 12 | { 13 | file: 'dist/index.min.js', 14 | format: 'es', 15 | sourcemap: true, 16 | plugins: [terser()], 17 | }, 18 | { 19 | file: 'dist/index.cjs.js', 20 | format: 'cjs', 21 | sourcemap: true, 22 | }, 23 | ], 24 | external: ['vue', 'pinia', 'json-stable-stringify'], 25 | plugins: [ 26 | typescript({ 27 | sourceMap: true, 28 | declaration: true, 29 | declarationMap: true, 30 | }), 31 | ], 32 | }; 33 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src/**/*.ts"], 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": ".", 6 | "outDir": "dist", 7 | "sourceMap": false, 8 | "noEmit": true, 9 | 10 | "paths": { 11 | "pinia-cached-store": ["src"] 12 | }, 13 | 14 | "target": "esnext", 15 | "module": "esnext", 16 | "moduleResolution": "node", 17 | "allowJs": false, 18 | "skipLibCheck": true, 19 | 20 | "noUnusedLocals": true, 21 | "strictNullChecks": true, 22 | "noImplicitAny": true, 23 | "noImplicitThis": true, 24 | "noImplicitReturns": false, 25 | "strict": true, 26 | "isolatedModules": true, 27 | 28 | "experimentalDecorators": true, 29 | "resolveJsonModule": true, 30 | "esModuleInterop": true, 31 | "removeComments": false, 32 | "jsx": "preserve", 33 | "lib": ["esnext", "dom"], 34 | "types": ["node", "jest"] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 iWelt AG 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pinia-cached-store", 3 | "version": "0.7.0", 4 | "description": "Pinia store extension that allows transparent caching of state in local storage.", 5 | "main": "./dist/index.cjs.js", 6 | "module": "./dist/index.js", 7 | "types": "./dist/src/index.d.ts", 8 | "exports": { 9 | ".": { 10 | "import": "./dist/index.js", 11 | "require": "./dist/index.cjs.js" 12 | }, 13 | "./package.json": "./package.json" 14 | }, 15 | "type": "module", 16 | "scripts": { 17 | "build": "rimraf dist && rollup -c rollup.config.mjs", 18 | "test": "jest" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/iWeltAG/pinia-cached-store.git" 23 | }, 24 | "keywords": [ 25 | "vue", 26 | "store", 27 | "pinia", 28 | "typescript", 29 | "localstorage" 30 | ], 31 | "author": "iWelt AG", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/iWeltAG/pinia-cached-store/issues" 35 | }, 36 | "homepage": "https://github.com/iWeltAG/pinia-cached-store#readme", 37 | "devDependencies": { 38 | "@rollup/plugin-terser": "^0.4.4", 39 | "@rollup/plugin-typescript": "^11.1.6", 40 | "@sucrase/jest-plugin": "^3.0.0", 41 | "@types/jest": "^29.5.14", 42 | "@types/node": "^22.13.10", 43 | "jest": "^29.7.0", 44 | "jest-environment-jsdom": "^29.7.0", 45 | "pinia": "^3.0.1", 46 | "prettier": "^3.5.3", 47 | "rimraf": "^6.0.1", 48 | "rollup": "^4.35.0", 49 | "tslib": "^2.8.1", 50 | "typescript": "^5.8.2", 51 | "vue": "^3.5.13" 52 | }, 53 | "peerDependencies": { 54 | "pinia": "^3.0.0", 55 | "typescript": "^5.0.4", 56 | "vue": "^3.5.0" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /tests/utils.spec.ts: -------------------------------------------------------------------------------- 1 | import { encode, decode, objectRepresentation } from '../src/utils'; 2 | 3 | describe('string encoding and decoding', () => { 4 | describe('matches base64-encoded input values', () => { 5 | // This test makes sure that our encode() method yields the same result as 6 | // just calling btoa() on the input. This is because that was the prior 7 | // implementation before unicode support and we don't want to invalidate 8 | // all the caches that already exist. 9 | for (const input of [ 10 | 'Hello', 11 | { hello: 'world' }, 12 | 'The show must go on', 13 | 'Never gonna give you up, 98127389516928375619872635987!!!!', 14 | '', 15 | ]) { 16 | const jsonInput = JSON.stringify(input); 17 | 18 | it(`for '${input}'`, () => { 19 | expect(encode(input)).toBe(btoa(jsonInput)); 20 | expect(decode(btoa(jsonInput))).toStrictEqual(input); 21 | expect(decode(encode(input))).toStrictEqual(input); 22 | }); 23 | } 24 | }); 25 | 26 | describe('works for unicode input', () => { 27 | for (const input of [ 28 | '💀💀💀 Aarrrrr Pirates! 💀💀💀', 29 | '☸☹☺☻☼☾☿', 30 | { theThing: '"`' }, 31 | { whooo: 'Şar' }, 32 | ]) { 33 | it(`'${input}'`, () => { 34 | expect(decode(encode(input))).toStrictEqual(input); 35 | }); 36 | } 37 | }); 38 | }); 39 | 40 | describe('object representation', () => { 41 | it('is different for a few examples', () => { 42 | const objects = [ 43 | { input: 'nothing' }, 44 | { value: 5 }, 45 | { value: 4 }, 46 | { this: { goes: { a: { bit: { deeper: true } } } } }, 47 | { everything: 'nothing', someone: 'no one' }, 48 | { a: 1, b: 2, c: 3, d: 17, e: 5, f: 6 }, 49 | ]; 50 | const objectRepresentations = objects.map(objectRepresentation); 51 | expect(new Set(objectRepresentations).size).toBe(objects.length); 52 | }); 53 | 54 | it('is the same regardless of order', () => { 55 | expect( 56 | new Set( 57 | [ 58 | { first: 1, second: 2, third: 3 }, 59 | { second: 2, third: 3, first: 1 }, 60 | { third: 3, first: 1, second: 2 }, 61 | { first: 1, third: 3, second: 2 }, 62 | { second: 2, first: 1, third: 3 }, 63 | { third: 3, second: 2, first: 1 }, 64 | ].map(objectRepresentation) 65 | ).size 66 | ).toBe(1); 67 | 68 | expect( 69 | new Set( 70 | [ 71 | { this: { goes: true, for: false }, deeper: { things: 'too' } }, 72 | { this: { for: false, goes: true }, deeper: { things: 'too' } }, 73 | { deeper: { things: 'too' }, this: { goes: true, for: false } }, 74 | { deeper: { things: 'too' }, this: { for: false, goes: true } }, 75 | ].map(objectRepresentation) 76 | ).size 77 | ).toBe(1); 78 | }); 79 | }); 80 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Encode an object to Base64 representation. 3 | * 4 | * @param data The object to encode. 5 | */ 6 | export function encode(data: unknown): string { 7 | // Even strings are encoded in JSON form (with quotes) so they can be parsed 8 | // accordingly again later. 9 | const dataString = JSON.stringify(data); 10 | 11 | try { 12 | return btoa(dataString); 13 | } catch { 14 | // btoa() may fail if the input contains code points with values above 0xff. 15 | // In that case, we need to convert the JavaScript UTF-16 string into a 16 | // string that has only 8-bit code points. See here on MDN: 17 | // https://developer.mozilla.org/en-US/docs/Web/API/btoa#unicode_strings 18 | const charCodes = new Uint16Array(dataString.length); 19 | for (let i = 0; i < charCodes.length; i++) { 20 | charCodes[i] = dataString.charCodeAt(i); 21 | } 22 | const bytes = new Uint8Array(charCodes.buffer); 23 | let binaryString = ''; 24 | for (let i = 0; i < bytes.byteLength; i++) { 25 | binaryString += String.fromCharCode(bytes[i]); 26 | } 27 | console.log(dataString); 28 | console.log(binaryString); 29 | 30 | // `binaryString` now contains the same content as `dataString` but each 31 | // code point is split up into two characters. This effectively makes the 32 | // string twice as long (because it is still stored in UTF-16), but with the 33 | // property that no character has values larger than 255. For example, an 34 | // input '\x1234\x5678' would now be converted into the string 35 | // '\x0012\x0034\x0056\x0078'. The latter is a valid input for btoa() now 36 | // because of the aforementioned property. In order for decoding to become 37 | // easier, the output is marked with an exclamation mark so we know we need 38 | // to do the unicode conversion again (the extra character doesn't really 39 | // matter because the output is twice as long as it needs to be anyway). 40 | return '!' + btoa(binaryString); 41 | } 42 | } 43 | 44 | /** 45 | * Decode an object's Base64 representation. 46 | * 47 | * @param data The string to decode. 48 | */ 49 | export function decode(data: string): T { 50 | let dataString = ''; 51 | 52 | // See the comments in encode() for more details here. In short: if the input 53 | // starts with an exclamation mark, the decoded data contains unicode 54 | // codepoints over 255, which need to be handled specially because ECMAScript 55 | // can't cope with them when encoding base64 for some reason. 56 | if (data.startsWith('!')) { 57 | const binaryString = atob(data.substring(1)); 58 | 59 | const bytes = new Uint8Array(binaryString.length); 60 | for (let i = 0; i < bytes.length; i++) { 61 | bytes[i] = binaryString.charCodeAt(i); 62 | } 63 | const charCodes = new Uint16Array(bytes.buffer); 64 | 65 | for (let i = 0; i < charCodes.length; i++) { 66 | dataString += String.fromCharCode(charCodes[i]); 67 | } 68 | } else { 69 | dataString = atob(data); 70 | } 71 | 72 | return JSON.parse(dataString) as T; 73 | } 74 | 75 | /** 76 | * Encode a given object into a string representation that can be used for 77 | * addressing cache entries. 78 | * 79 | * Currently, this is basically `btoa(JSON.stringify(options))`, although it is 80 | * guaranteed to be stable regarding property order - so two objects like 81 | * `{a: 1, b: 2}` and `{b: 2, a: 1}` will produce the same representation. 82 | * Further, while the current implementation is in fact reversible for most 83 | * inputs, this property is not guaranteed. 84 | * 85 | * @param input The object to encode. 86 | */ 87 | export function objectRepresentation(input: unknown): string { 88 | // In this first pass we use JSON.stringify to recursively get all keys we 89 | // encounter, so that they can be sorted later when we actually encode the 90 | // object for real. 91 | const keys = new Set(); 92 | JSON.stringify(input, (key, value) => { 93 | keys.add(key); 94 | return value; 95 | }); 96 | 97 | const jsonString = JSON.stringify(input, Array.from(keys).sort()); 98 | return encode(jsonString); 99 | } 100 | -------------------------------------------------------------------------------- /src/store.ts: -------------------------------------------------------------------------------- 1 | import { 2 | DefineStoreOptions, 3 | PiniaCustomProperties, 4 | StateTree, 5 | StoreDefinition, 6 | _GettersTree, 7 | _StoreWithGetters, 8 | _StoreWithState, 9 | defineStore, 10 | } from 'pinia'; 11 | import { Ref, UnwrapRef } from 'vue'; 12 | 13 | import { decode, encode, objectRepresentation } from './utils'; 14 | 15 | const DEFAULT_MAX_AGE = 86400000; 16 | 17 | // This type function returns - given a state interface - all the keys that have 18 | // a boolean value. 19 | export type ExtractBooleanStateKeys = { 20 | [K in keyof State]: State[K] extends boolean | Ref ? K : never; 21 | }[keyof State]; 22 | 23 | export interface CachedStateTree extends StateTree { 24 | computedCacheKey?: string; 25 | } 26 | 27 | export interface CachingOptions< 28 | State extends CachedStateTree, 29 | RefreshPayload = void 30 | > { 31 | /** 32 | * Custom prefix to use for all local storage entries. 33 | * 34 | * This can be used to improve separation when using many different cached 35 | * stores. The default value is `store`. 36 | */ 37 | keyPrefix?: string; 38 | 39 | /** 40 | * Whether to use a different key for each set of refresh options. 41 | * 42 | * When this is truthy, multiple `$load()` calls (which will internally use 43 | * the defined `refresh` method) with different options each use a different 44 | * cache key. This is useful in situations where multiple independent sets of 45 | * data should be cached. When this option is falsy, the entire store will use 46 | * the same key. 47 | * 48 | * Note: when this is falsy, only the first set of refresh options will 49 | * effectively be valid because subsequent `$load()` calls will use the cache, 50 | * even if completely different options are given. Only when the cache is 51 | * stale will they be used again. 52 | * 53 | * The default value is `true`. 54 | */ 55 | refreshSpecificKey?: boolean; 56 | 57 | /** 58 | * Age (in milliseconds) after which cached data is considered stale. If 59 | * data is older that this value, fresh content will be requested even if 60 | * the cache is actually populated. 61 | */ 62 | maxAge?: number; 63 | 64 | /** 65 | * Custom callback for checking if store data is still valid. 66 | * 67 | * If provided, this function will be called before already cached data is 68 | * loaded from the store. If a falsy value is returned here, the data will be 69 | * discarded and will be fetched again. 70 | * 71 | * @param data The state that is in the cache and could be loaded. 72 | * @returns `true` when the state object passed in as `data` is valid, `false` 73 | * otherwise. 74 | */ 75 | checkValidity?: ( 76 | data: UnwrapRef, 77 | payload: RefreshPayload 78 | ) => boolean; 79 | 80 | /** 81 | * This option can be used to add a property to the state that shows whether 82 | * the store is currently loading data. It should be set to the name of an 83 | * existing (boolean) option in the state. The caching framework will then 84 | * automatically update the value when loading data. 85 | */ 86 | loadingKey?: ExtractBooleanStateKeys; 87 | 88 | /** 89 | * Storage object to use. By default, this is `window.localStorage`. 90 | */ 91 | storage?: Storage | null; 92 | } 93 | 94 | export interface CachedStoreOptions< 95 | Id extends string, 96 | State extends CachedStateTree, 97 | Getters extends _GettersTree, 98 | RefreshOptions, 99 | RefreshPayload = void 100 | > extends Omit, 'state'> { 101 | // We override the original state to make sure it's non-optional. 102 | state: () => State; 103 | // It isn't allowed to define your own actions (yet). 104 | actions?: never; 105 | 106 | /** 107 | * Refresh function to populate the store with new data. 108 | * 109 | * This function should be implemented to query current, up-to-date 110 | * information from the backend and set it in the store (using `this`). 111 | * 112 | * @param options Contextual information about which data to fetch. 113 | * @param payload Arbitrary secondary payload. 114 | */ 115 | refresh( 116 | this: UnwrapRef & 117 | // We intentionally don't expose CachedStoreResultingActions here, because 118 | // that would probably introduce recursion and there isn't really a good 119 | // reason to do that here. 120 | _StoreWithState & 121 | _StoreWithGetters & 122 | PiniaCustomProperties, 123 | options: RefreshOptions, 124 | payload: RefreshPayload 125 | ): Promise; 126 | 127 | caching?: CachingOptions; 128 | } 129 | 130 | export interface CachedStoreResultingActions { 131 | /** 132 | * Populate the store with data matching a given key. 133 | * 134 | * When called, this action will do look at the provided options set and do 135 | * one of the following: 136 | * 137 | * - If a matching, valid cache entry for the provided options is found, it 138 | * will be loaded. 139 | * - Otherwise `refresh()` will be called which will fill the store with data 140 | * (which normally comes from some remote endpoint). Then, this data is 141 | * cached in local storage so subsequent calls with the same parameter can 142 | * be handled locally. 143 | * 144 | * The `options` parameter has two purposes: first, it serves as the cache 145 | * key. That means that this object is used to determine whether the resulting 146 | * state of a previous `$load()` call can be used without needing to refetch 147 | * new data. It also allows a user to pass information to `refresh()` about the 148 | * current context, for example a user ID. 149 | * 150 | * @param options Contextual information used by the fetching function to get 151 | * the correct data. This is also used as a caching key. 152 | * @param payload Arbitrary payload to pass on. This argument does not factor 153 | * in to the caching key calculation. 154 | */ 155 | $load(options: RefreshOptions, payload: RefreshPayload): Promise; 156 | 157 | /** 158 | * Write the current state to the cache. 159 | * 160 | * This will happen automatically, so you probably won't need to call this 161 | * method yourself. 162 | */ 163 | $flushCache(): void; 164 | 165 | /** 166 | * Clear this store's local cache. 167 | * 168 | * This will clear cached data for any option sets that match the store's ID. 169 | * It will also reset that store to the initial state. That means a subsequent 170 | * `$load()` will be necessary. 171 | */ 172 | $clearCache(): void; 173 | } 174 | 175 | export interface CacheData { 176 | state: UnwrapRef; 177 | timestamp: number; 178 | } 179 | 180 | export function defineCachedStore< 181 | Id extends string, 182 | State extends CachedStateTree, 183 | Getters extends _GettersTree, 184 | RefreshOptions, 185 | RefreshPayload = void 186 | >( 187 | options: CachedStoreOptions< 188 | Id, 189 | State, 190 | Getters, 191 | RefreshOptions, 192 | RefreshPayload 193 | > 194 | ): StoreDefinition< 195 | Id, 196 | State, 197 | Getters, 198 | CachedStoreResultingActions 199 | > { 200 | const cachingOptions = options.caching ?? {}; 201 | // Note that the default storage (when undefined is set) evaluates to 202 | // localStorage, but the user can still set it to null. 203 | const storage = 204 | cachingOptions.storage === undefined 205 | ? window.localStorage 206 | : cachingOptions.storage; 207 | const refresh = options.refresh; 208 | 209 | if ( 210 | cachingOptions?.loadingKey && 211 | (cachingOptions.loadingKey === 'computedCacheKey' || 212 | typeof options.state()[cachingOptions.loadingKey] !== 'boolean') 213 | ) { 214 | throw Error('Failed to initialize store: invalid loading key'); 215 | } 216 | 217 | return defineStore(options.id, { 218 | ...options, 219 | 220 | actions: { 221 | async $load( 222 | refreshOptions: RefreshOptions, 223 | refreshPayload: RefreshPayload 224 | ) { 225 | this.$reset(); 226 | 227 | const setLoadingKey = (value: boolean) => { 228 | if (cachingOptions?.loadingKey) { 229 | this.$patch({ 230 | [cachingOptions.loadingKey]: value, 231 | } as Partial); 232 | } 233 | }; 234 | 235 | const cacheKeySuffix = 236 | cachingOptions?.refreshSpecificKey ?? true 237 | ? objectRepresentation(refreshOptions) 238 | : '0'; 239 | this.computedCacheKey = [ 240 | cachingOptions?.keyPrefix ?? 'store', 241 | options.id, 242 | cacheKeySuffix, 243 | ].join('-'); 244 | 245 | const getExistingCacheData = () => { 246 | if (!this.computedCacheKey) { 247 | return null; 248 | } 249 | // Using || instead of ?? here to also catch empty storage entries. 250 | const rawCacheData = storage?.getItem(this.computedCacheKey) || null; 251 | if (rawCacheData === null) { 252 | return null; 253 | } 254 | try { 255 | const data = decode>(rawCacheData); 256 | if (!isFinite(data.timestamp) || typeof data.state !== 'object') { 257 | return null; 258 | } 259 | 260 | // Check whether the data is expired. 261 | if ( 262 | data.timestamp < 263 | Date.now() - (cachingOptions?.maxAge ?? DEFAULT_MAX_AGE) 264 | ) { 265 | return null; 266 | } 267 | 268 | // If given, use the user-provided validity check function. 269 | if ( 270 | cachingOptions?.checkValidity && 271 | !cachingOptions.checkValidity(data.state, refreshPayload) 272 | ) { 273 | return null; 274 | } 275 | 276 | return data; 277 | } catch (error) { 278 | return null; 279 | } 280 | }; 281 | 282 | const existingCacheData = getExistingCacheData(); 283 | if (existingCacheData !== null) { 284 | this.$patch(existingCacheData.state); 285 | setLoadingKey(false); 286 | return; 287 | } 288 | 289 | try { 290 | setLoadingKey(true); 291 | await refresh.call(this, refreshOptions, refreshPayload); 292 | } catch (error: any) { 293 | storage?.removeItem(this.computedCacheKey as string); 294 | setLoadingKey(false); 295 | throw Error( 296 | `Error while refreshing cache ${options.id}` + 297 | (error.message ? `: ${error.message}` : '.') 298 | ); 299 | } 300 | 301 | this.$flushCache(); 302 | setLoadingKey(false); 303 | }, 304 | 305 | $flushCache() { 306 | if (!this.computedCacheKey) { 307 | return; 308 | } 309 | const newCacheData: CacheData = { 310 | state: this.$state, 311 | timestamp: Date.now(), 312 | }; 313 | storage?.setItem(this.computedCacheKey as string, encode(newCacheData)); 314 | }, 315 | 316 | $clearCache() { 317 | for (const key of Object.keys(storage ?? {})) { 318 | if ( 319 | key.startsWith( 320 | `${cachingOptions?.keyPrefix ?? 'store'}-${options.id}-` 321 | ) 322 | ) { 323 | storage?.removeItem(key); 324 | } 325 | } 326 | this.$reset(); 327 | }, 328 | }, 329 | }); 330 | } 331 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cached Pinia Stores 2 | 3 | This module defines a factory function that creates read-only 4 | [Pinia](https://pinia.esm.dev/) stores which automatically copy their state to 5 | local storage and can load it from there, omitting the need for subsequent 6 | refetches. The pattern enables a lightweight dataloading system with a global 7 | cache, somewhat similar to what 8 | [React Query](https://react-query.tanstack.com/), 9 | [Apollo](https://www.apollographql.com/docs/react/caching/overview/) or other 10 | libraries provide. Another use case is to cache expensive calculations in a 11 | store. These can then be re-instantiated quickly when the page gets refreshed 12 | without needing to recompute. 13 | 14 | As an example of the second aforementioned use case, the following store 15 | calculates Pi to a given precision and stores the value: 16 | 17 | ```typescript 18 | import { defineCachedStore } from 'pinia-cached-store'; 19 | 20 | const usePiStore = defineCachedStore({ 21 | id: 'pi', 22 | 23 | state: () => ({ 24 | value: 3.14, 25 | }), 26 | 27 | async refresh({ iterations }) { 28 | // This is a simple (and pretty inefficient) Monte Carlo algorithm that 29 | // estimates Pi. A fixed number of points is randomly distributed inside the 30 | // square from the origin to [1,1]. We check how many of these points fall 31 | // into the corresponding quarter-circle and use that to calculate pi. 32 | let hits = 0; 33 | for (let i = 0; i < iterations; i++) { 34 | const x = Math.random(); 35 | const y = Math.random(); 36 | if (x * x + y * y <= 1) { 37 | hits += 1; 38 | } 39 | } 40 | // For the quarter-circle's area A: 41 | // A = pi (since r=1) 42 | // A / 4 = hits / iterations 43 | this.value = (4 * hits) / iterations; 44 | }, 45 | }); 46 | ``` 47 | 48 | Later in our app, the store can be used like this: 49 | 50 | ```typescript 51 | const pi = usePiStore(); 52 | // Make sure you are in an async function. Also, feel free to play around with 53 | // this paramter and get different values: 54 | await pi.$load({ iterations: 99999 }); 55 | 56 | // Somewhere else: 57 | const doublePi = pi.value * 2; 58 | // Or in templates: 59 | // Pi: {{ pi.value }} 60 | ``` 61 | 62 | > Note that since a cached store is read-only, it is no longer possible to 63 | > define actions. That means the store's sole purpose is to merely reflect data 64 | > on a backend or store the output of some computation – the source of truth 65 | > will never be the store itself. Using 66 | > [getters](https://pinia.esm.dev/core-concepts/getters.html) (computed 67 | > properties) is fine, though. 68 | 69 | ## Installation 70 | 71 | Install the package as follows: 72 | 73 | ```shell 74 | npm install --save-dev pinia-cached-store 75 | # or 76 | yarn add --dev pinia-cached-store 77 | ``` 78 | 79 | Both Vue and Pinia 2 should also be installed as dependencies in your project. 80 | 81 | ## Usage 82 | 83 | For this guide, we will look at the following example store. It takes the name 84 | of a Pizza dish as an input and stores all the required ingredients for making 85 | it. A cached store is defined much like a 86 | [regular Pinia store](https://pinia.esm.dev/core-concepts/#defining-a-store), 87 | and any options can be here as well, except for `actions`, since caching makes a 88 | store read-only. For completeness' sake, we will directly define it in 89 | Typescript. Here is the code for the complete store definition: 90 | 91 | ```typescript 92 | import { defineCachedStore } from 'pinia-cached-store'; 93 | import pizzaApi from 'awesome-pizza-place'; 94 | 95 | // Users of the store will pass these options when initializing it. We can use 96 | // them to pass around information relevant to what data we want to fetch. 97 | // As another example, a store containing customer data would take something 98 | // like the customer's ID in this options object. 99 | interface PizzaRefreshOptions { 100 | name: string; 101 | extraCheese?: boolean; 102 | } 103 | 104 | export const usePizzaStore = defineCachedStore({ 105 | id: 'pizza', 106 | 107 | state: () => ({ 108 | toppings: [] as string[], 109 | sauce: null as string | null, 110 | cheese: false as boolean | 'extra', 111 | }), 112 | 113 | async refresh({ name, extraCheese }: PizzaRefreshOptions) { 114 | this.$state = await pizzaApi.getPizzaByName(name); 115 | if (this.cheese && extraCheese) { 116 | this.cheese = 'extra'; 117 | } 118 | }, 119 | }); 120 | ``` 121 | 122 | ### The refresh callback 123 | 124 | A cached store must define an asynchronous function named `refresh` in the top 125 | level. Although it looks and feels like an action, it is explicitly _not_ placed 126 | inside the `actions` object, and you won't be able to call it directly later, 127 | either. The purpose of this function is to populate the state with the correct 128 | data when a user requests it. You must define exactly one argument to this 129 | function, which are the options that you will receive from the user (see 130 | [the _using_ section](#using-the-store) below). This will only be called when 131 | the cache doesn't already contain an entry for the requested options, so you 132 | don't need to do any cache checking here. 133 | 134 | Using `this` works exactly the same way as it would inside an action. That means 135 | that you can use methods like 136 | [\$patch](https://pinia.esm.dev/core-concepts/state.html#mutating-the-state) to 137 | overwrite (parts of) the state, as well as setting `this.$state` directly. 138 | Setting individual keys in the state also works as expected. 139 | 140 | ### Using the store 141 | 142 | Once the store is created, you can use it just like any other Pinia store. By 143 | default, cache-enabled stores are created from the `state()` function in their 144 | definition. You can then use the `$load` action to populate the state with data, 145 | depending on what you currently need. This method takes the exact same parameter 146 | object you defined for `refresh` and will update the state accordingly: 147 | 148 | ```typescript 149 | // Inside setup() of a component: 150 | const pizza = usePizzaStore(); 151 | 152 | onMounted(async () => { 153 | await pizza.$load({ pizzaName: 'hawaii' }); 154 | }); 155 | ``` 156 | 157 | Multiple `$load()` calls (either consecutively or after a page refresh) will 158 | prioritize cached content. Cache entries are considered applicable if they were 159 | created from the same options object as the current call: 160 | 161 | ```typescript 162 | // This will call refresh() with our objects object: 163 | await pizza.$load({ pizzaName: 'hawaii' }); 164 | // Here, refresh() is called again, since we have a new options object: 165 | await pizza.$load({ pizzaName: 'hawaii', extraCheese: true }); 166 | // Again, this will call refresh(): 167 | await pizza.$load({ pizzaName: 'hawaii' }); 168 | // Since this object was passed before, this is loaded from cache: 169 | await pizza.$load({ extraCheese: true, pizzaName: 'hawaii' }); 170 | ``` 171 | 172 | #### Cache clearing 173 | 174 | To remove all entries from local storage corresponding a store, call the 175 | `$clearCache` action. Since this will reset the store to the initial state (the 176 | one returned by the `state` function in the store's definition), you probably 177 | want to load some data again afterwards: 178 | 179 | ```typescript 180 | pizza.$clearCache(); 181 | await pizza.$load({ pizzaName: 'margherita' }); 182 | ``` 183 | 184 | Note that this will only clear that specific store's cache — those of other 185 | stores are left untouched. 186 | 187 | ### Manual cache writes and SSR 188 | 189 | Every cached store has a `$flushCache` method which you can call if you would 190 | like to force the cache to be written to storage. You don't need to do this when 191 | calling `$load`, but there might be other circumstances. 192 | 193 | For example, in an SSR environment like Nuxt you might want to calculate the 194 | store's content on the server and store it in the client's local storage while 195 | hydrating. You can use this snippet to start: 196 | 197 | ```typescript 198 | const useComplicatedStore = defineCachedStore({ 199 | id: 'magic', 200 | 201 | caching: { 202 | // Don't write to a cache while performing SSR. You'll need to check your 203 | // SSR framework's docs to find out how to check if SSR is currently 204 | // running. 205 | storage: import.meta.env.SSR ? null : window.localStorage, 206 | }, 207 | 208 | state: () => ({ value: 1 }), 209 | 210 | async refresh() { 211 | this.value = calculateValue(); 212 | }, 213 | 214 | // Don't just copy this, read the note below. 215 | hydrate(storeState, initialState) { 216 | this.$flushCache(); 217 | }, 218 | }); 219 | ``` 220 | 221 | Note that you might not even need `hydrate`. If the store is pre-filled from 222 | rendering server-side, there isn't really a need to blindly copy that data to 223 | the user's local storage. An exception to this suggestion would be if you 224 | `$load()` different values into the store during the lifecycle of you app. In 225 | that case it might be beneficial to cache the server-rendered dataset on the 226 | client as well. 227 | 228 | You might also want to check out 229 | [Vue's hydration guide](https://ssr.vuejs.org/guide/hydration.html), 230 | [the corresponding Pinia guide](https://pinia.vuejs.org/ssr/), and 231 | [the docs on Pinia's `hydrate` option](https://pinia.vuejs.org/api/interfaces/pinia.DefineStoreOptions.html#hydrate). 232 | 233 | #### Secondary payloads 234 | 235 | The `$load` method accepts a second argument which will be passed verbatim to 236 | your `refresh` method. You can use this to provide data when refreshing that is 237 | not factored in when calculating a key for caching. Since caches are stored 238 | under a key that depends on what you pass as the first argument, you need to use 239 | the second payload if you have data that isn't part of the state key. This 240 | payload is also passed to `checkValidity`, if provided. 241 | 242 | As an example, we could rewrite the pi store from above to use this argument for 243 | the number of iterations. That way we only get one local storage entry if we 244 | call it multiple times (this time with TypeScript): 245 | 246 | ```typescript 247 | import { defineCachedStore } from 'pinia-cached-store'; 248 | 249 | const usePiStore = defineCachedStore({ 250 | id: 'pi', 251 | 252 | state: () => ({ 253 | value: 3.14, 254 | iterations: 0, 255 | }), 256 | 257 | async refresh(options: {}, iterations: number) { 258 | this.value = thePiAlgorithmFromAbove(iterations); 259 | this.iterations = iterations; 260 | }, 261 | 262 | caching: { 263 | checkValidity(data: { iterations: number }, requestedIterations: number) { 264 | // Only recalculate when more iterations are requested: 265 | return iterations >= requestedIterations; 266 | }, 267 | }, 268 | }); 269 | ``` 270 | 271 | When calling the store now, a recalculation will only be performed if the number 272 | of iterations requested is higher than that from the last calculation. Further, 273 | local storage will only contain one entry for this store. 274 | 275 | ### Caching options 276 | 277 | The object passed to the store factory function may also contain a set of 278 | options to control the caching behaviour: 279 | 280 | ```typescript 281 | export const store = defineCachedStore({ 282 | // ... 283 | 284 | caching: { 285 | keyPrefix: 'myStore', 286 | }, 287 | }); 288 | ``` 289 | 290 | Following options are supported (all are optional): 291 | 292 | - **keyPrefix** — By default, cache entries are stored into local storage 293 | entries named `store` followed by the store ID and a base64 representation of 294 | the provided options. This option can be used to change that prefix to 295 | something else. 296 | - **refreshSpecificKey** — Set this to `false` to use one cache key for the 297 | entire store. By default (`true`), different cache entries are created 298 | depending on the options which `$load` is called with (as described in the 299 | guide above). Note that disabling this behaviour will effectively invalidate 300 | options you give to `$load` in a second call because then the cache will be 301 | used instead (which may have been populated with other arguments). 302 | - **maxAge** — This is the maximum age a cache entry may have before it is 303 | considered stale and needs to be refetched. Provide this as a number, in 304 | milliseconds (the default is 86400000, or a day). 305 | - **checkValidity** — In addition to `maxAge`, this option can be used to modify 306 | how existing cache entries get loaded. It is set to a function that receives 307 | the (old) data and returns either `true` or `false`, depending on whether it 308 | should be loaded or discarded and refetched. 309 | - **loadingKey** — Set this to the name of a boolean property defined in `state` 310 | and it will automatically be set to `true` when loading starts. After loading 311 | is finished (with or without errors), it will be set back to `false`. The 312 | property will not be created, it needs to exist in the state already. 313 | - **storage** — Use this option to use a different 314 | [Storage](https://developer.mozilla.org/en-US/docs/Web/API/Storage) object to 315 | save the cache. By default, the browser's local storage is used. Make sure to 316 | handle SSR somehow if you set this option. If you set this to `null`, no 317 | storage is used and the cache is effectively bypassed. 318 | 319 | You can get final caching key that is actually used from the stores' 320 | `computedCacheKey` property. It is set after calling `$load`. 321 | 322 | ### Error handling 323 | 324 | For error logging / handling, you can use Pinia's 325 | [subscription mechanism](https://pinia.esm.dev/core-concepts/actions.html#subscribing-to-actions). 326 | Using a subscription, you can perform additional actions before and after the 327 | load process runs: 328 | 329 | ```typescript 330 | let isLoading = false; 331 | 332 | store.$onAction(({ name, after, onError }) => { 333 | if (name !== '$load') return; 334 | 335 | isLoading = true; 336 | 337 | after(() => (isLoading = false)); 338 | onError((error) => { 339 | isLoading = false; 340 | console.warn(`Error while loading store: ${error}`); 341 | }); 342 | }); 343 | ``` 344 | 345 | See the aforementioned documentation for more details. In particular, note that 346 | the subscription lives as long as the component it was created in. Further, 347 | `$onAction` returns a function that can be used to manually terminate the 348 | subscription if necessary. 349 | 350 | ## License 351 | 352 | [MIT](https://github.com/iWeltAG/pinia-cached-store/LICENSE) 353 | -------------------------------------------------------------------------------- /tests/store.spec.ts: -------------------------------------------------------------------------------- 1 | import { createPinia, setActivePinia } from 'pinia'; 2 | import { defineCachedStore, CachingOptions } from 'pinia-cached-store'; 3 | import { encode } from '../src/utils'; 4 | import { watch } from 'vue'; 5 | 6 | beforeEach(() => { 7 | setActivePinia(createPinia()); 8 | localStorage.clear(); 9 | }); 10 | 11 | // This testing store saves exactly one value which is calculated from the input 12 | // argument. 13 | function useCalculatingStore( 14 | calculate: (input: number) => number, 15 | id: string = 'calculator', 16 | options: CachingOptions<{ value: number }> | undefined = undefined 17 | ) { 18 | const useStore = defineCachedStore({ 19 | id, 20 | 21 | state: () => ({ value: 0 }), 22 | 23 | async refresh({ input }: { input: number }) { 24 | this.value = calculate(input); 25 | }, 26 | 27 | caching: options, 28 | }); 29 | return useStore(); 30 | } 31 | 32 | describe('a simple store', () => { 33 | it('correctly performs caching', async () => { 34 | const calculate = jest.fn((input: number) => 2 * input); 35 | const store = useCalculatingStore(calculate); 36 | 37 | expect(Object.keys(localStorage)).toHaveLength(0); 38 | expect(store.value).toBe(0); 39 | 40 | await store.$load({ input: 4 }); 41 | expect(store.value).toBe(8); 42 | expect(Object.keys(localStorage)).toHaveLength(1); 43 | expect(calculate).toBeCalledTimes(1); 44 | 45 | await store.$load({ input: 5 }); 46 | expect(store.value).toBe(10); 47 | expect(Object.keys(localStorage)).toHaveLength(2); 48 | expect(calculate).toBeCalledTimes(2); 49 | 50 | // Now we should hit the cache. 51 | await store.$load({ input: 4 }); 52 | expect(store.value).toBe(8); 53 | expect(Object.keys(localStorage)).toHaveLength(2); 54 | expect(calculate).toBeCalledTimes(2); 55 | 56 | Object.keys(localStorage).forEach((key) => 57 | expect(key).toContain(store.$id) 58 | ); 59 | }); 60 | 61 | it('resets both store and cache', async () => { 62 | const store = useCalculatingStore((input: number) => input + 3); 63 | 64 | await store.$load({ input: -4 }); 65 | await store.$load({ input: -9 }); 66 | await store.$load({ input: 123 }); 67 | expect(store.value).toBe(126); 68 | expect(Object.keys(localStorage)).toHaveLength(3); 69 | 70 | store.$reset(); 71 | expect(store.value).toBe(0); 72 | 73 | await store.$load({ input: 99 }); 74 | expect(store.value).toBe(102); 75 | expect(Object.keys(localStorage)).toHaveLength(4); 76 | 77 | store.$clearCache(); 78 | expect(store.value).toBe(0); 79 | expect(Object.keys(localStorage)).toHaveLength(0); 80 | }); 81 | 82 | it('transparently resets when refresh errors', async () => { 83 | const calculate = jest 84 | .fn() 85 | .mockImplementationOnce((input: number) => input) 86 | .mockImplementationOnce(() => { 87 | throw Error(); 88 | }); 89 | const store = useCalculatingStore(calculate); 90 | 91 | await store.$load({ input: 2 }); 92 | expect(store.value).toBe(2); 93 | 94 | await expect(store.$load({ input: 4 })).rejects.toThrow( 95 | 'Error while refreshing cache' 96 | ); 97 | expect(store.value).toBe(0); 98 | }); 99 | 100 | it('reloads when the cache expires', async () => { 101 | const calculate = jest.fn((input: number) => input * input); 102 | const store = useCalculatingStore(calculate); 103 | 104 | await store.$load({ input: 5 }); 105 | await store.$load({ input: 5 }); 106 | expect(calculate).toBeCalledTimes(1); 107 | 108 | // Move three days into the future 109 | const fakeDate = Date.now() + 1000 * 60 * 60 * 24 * 3; 110 | jest.spyOn(Date, 'now').mockImplementation(() => fakeDate); 111 | 112 | await store.$load({ input: 5 }); 113 | expect(calculate).toBeCalledTimes(2); 114 | }); 115 | 116 | it('ignores invalid cache states', async () => { 117 | const calculate = jest.fn((input: number) => input % 12); 118 | const store = useCalculatingStore(calculate); 119 | 120 | await store.$load({ input: 24 }); 121 | expect(calculate).toBeCalledTimes(1); 122 | 123 | expect(Object.keys(localStorage)).toHaveLength(1); 124 | const cacheKey = Object.keys(localStorage)[0]; 125 | 126 | localStorage.setItem(cacheKey, 'this is invalid base64 !§$%&/()=?'); 127 | await store.$load({ input: 24 }); 128 | expect(calculate).toBeCalledTimes(2); 129 | 130 | localStorage.setItem(cacheKey, encode({ timestamp: 0, state: undefined })); 131 | await store.$load({ input: 24 }); 132 | expect(calculate).toBeCalledTimes(3); 133 | 134 | localStorage.setItem( 135 | cacheKey, 136 | encode({ timestamp: null, state: { value: 2 } }) 137 | ); 138 | await store.$load({ input: 24 }); 139 | expect(calculate).toBeCalledTimes(4); 140 | }); 141 | 142 | it('accepts 2-byte unicode characters as id', async () => { 143 | const store = useCalculatingStore((input: number) => input, '☸☹☺☻☼☾☿'); 144 | // Load, reset and load again to make sure we are both reading and writing 145 | // to the cache: 146 | await store.$load({ input: 1 }); 147 | store.$reset(); 148 | await store.$load({ input: 1 }); 149 | expect(store.value).toBe(1); 150 | }); 151 | 152 | it('encodes 2-byte unicode characters when caching', async () => { 153 | const useStore = defineCachedStore({ 154 | id: 'theStore', 155 | state: () => ({ 156 | greeting: 'Hello there, general Kenobi!', 157 | }), 158 | async refresh({}: any) { 159 | this.greeting = '💀💀💀 Aarrrrr Pirates! 💀💀💀'; 160 | }, 161 | }); 162 | const store = useStore(); 163 | 164 | // Similarly to the last test, we make sure the cache is both read from and 165 | // written to here: 166 | await store.$load({}); 167 | store.$reset(); 168 | expect(store.greeting).toContain('Kenobi'); 169 | await store.$load({}); 170 | expect(store.greeting).toContain('Pirates'); 171 | }); 172 | 173 | it('works without a storage engine', async () => { 174 | const calculate = jest.fn((input: number) => 2 * input); 175 | const store = useCalculatingStore(calculate, 'backendless', { 176 | storage: null, 177 | }); 178 | 179 | await store.$load({ input: 1 }); 180 | expect(store.value).toBe(2); 181 | expect(calculate).toBeCalledTimes(1); 182 | 183 | await store.$load({ input: 2 }); 184 | expect(store.value).toBe(4); 185 | expect(calculate).toBeCalledTimes(2); 186 | 187 | await store.$load({ input: 1 }); 188 | expect(store.value).toBe(2); 189 | expect(calculate).toBeCalledTimes(3); 190 | }); 191 | }); 192 | 193 | describe('multiple stores', () => { 194 | it('only clear their own cache', async () => { 195 | const firstStore = useCalculatingStore((input: number) => input, 'first'); 196 | const secondStore = useCalculatingStore( 197 | (input: number) => -1 * input, 198 | 'second' 199 | ); 200 | 201 | await firstStore.$load({ input: 17 }); 202 | await firstStore.$load({ input: 76 }); 203 | await secondStore.$load({ input: 24 }); 204 | await secondStore.$load({ input: -4 }); 205 | expect(Object.keys(localStorage)).toHaveLength(4); 206 | 207 | secondStore.$clearCache(); 208 | expect(secondStore.value).toBe(0); 209 | expect(Object.keys(localStorage)).toHaveLength(2); 210 | for (const key of Object.keys(localStorage)) { 211 | expect(key).toContain('first'); 212 | expect(key).not.toContain('second'); 213 | } 214 | }); 215 | }); 216 | 217 | describe('non-specific cache keys', () => { 218 | it('share a cache', async () => { 219 | const store = useCalculatingStore( 220 | (input: number) => input / 3, 221 | 'calculator', 222 | { refreshSpecificKey: false } 223 | ); 224 | 225 | await store.$load({ input: 3 }); 226 | await store.$load({ input: 4 }); 227 | await store.$load({ input: 5 }); 228 | // The example doesn't really make sense here because we said .$load() with 229 | // a value of 5 (so our store should now have 5/3), but in reality we are 230 | // expecting the first value we loaded because the store uses a single cache 231 | // key. 232 | expect(store.value).toBe(1); // From 3 / 3 233 | expect(Object.keys(localStorage)).toHaveLength(1); 234 | 235 | store.$clearCache(); 236 | await store.$load({ input: 6 }); 237 | expect(store.value).toBe(2); // From 6 / 3 238 | expect(Object.keys(localStorage)).toHaveLength(1); 239 | }); 240 | }); 241 | 242 | describe('custom validity checks', () => { 243 | it('are evaluated', async () => { 244 | const calculate = jest.fn((input: number) => input); 245 | const store = useCalculatingStore(calculate, 'calculator', { 246 | checkValidity(data) { 247 | // Use the value 1 to simulate an invalid cache which needs to be 248 | // refetched. 249 | if (data.value == 1) { 250 | return false; 251 | } 252 | return true; 253 | }, 254 | }); 255 | 256 | await store.$load({ input: 1 }); 257 | expect(calculate).toBeCalledTimes(1); 258 | await store.$load({ input: 1 }); 259 | // Should have been called again, because we said that the existing value 260 | // is invalid. 261 | expect(calculate).toBeCalledTimes(2); 262 | 263 | await store.$load({ input: 2 }); 264 | expect(calculate).toBeCalledTimes(3); 265 | await store.$load({ input: 2 }); 266 | // The second value should have been loaded from cache as expected. 267 | expect(calculate).toBeCalledTimes(3); 268 | }); 269 | }); 270 | 271 | describe('loading keys', () => { 272 | it('are set correctly when loading', async () => { 273 | const calculate = jest.fn(() => 2); 274 | const useStore = defineCachedStore({ 275 | id: 'loading', 276 | state: () => ({ loading: false, value: 0 }), 277 | async refresh(options: {}) { 278 | expect(this.loading).toBe(true); 279 | this.value = calculate(); 280 | }, 281 | caching: { 282 | loadingKey: 'loading', 283 | }, 284 | }); 285 | const store = useStore(); 286 | 287 | // This watcher is used to test reactivity of the loading key value. 288 | let loadingValues: boolean[] = []; 289 | watch( 290 | store.$state, 291 | (value) => { 292 | loadingValues.push(value.loading); 293 | }, 294 | { deep: true } 295 | ); 296 | 297 | expect(store.loading).toBe(false); 298 | expect(store.value).toBe(0); 299 | await store.$load({}); 300 | expect(store.loading).toBe(false); 301 | expect(store.value).toBe(2); 302 | expect(calculate).toBeCalledTimes(1); 303 | // We require the reactive loading key to go from false - true - false. 304 | // For the first value we don't get a watcher callback though, because 305 | // it's the initial value. 306 | expect(loadingValues.length).toBeGreaterThanOrEqual(2); 307 | expect(loadingValues).toContain(true); 308 | expect(loadingValues[loadingValues.length - 1]).toBe(false); 309 | 310 | // Make sure the loading property is also set when stuff isn't refreshed and 311 | // only loaded from the cache. 312 | expect(store.loading).toBe(false); 313 | await store.$load({}); 314 | expect(store.loading).toBe(false); 315 | expect(calculate).toBeCalledTimes(1); 316 | // Here, we only expect a 'false' event because refresh() wasn't called. 317 | expect(loadingValues.length).toBeGreaterThanOrEqual(1); 318 | expect(loadingValues[loadingValues.length - 1]).toBe(false); 319 | }); 320 | 321 | it('are set correctly when an error occurs', async () => { 322 | const useStore = defineCachedStore({ 323 | id: 'loading', 324 | state: () => ({ loading: false, value: 0 }), 325 | async refresh(options: {}) { 326 | expect(this.loading).toBe(true); 327 | throw Error(); 328 | }, 329 | caching: { 330 | loadingKey: 'loading', 331 | }, 332 | }); 333 | const store = useStore(); 334 | 335 | expect(store.loading).toBe(false); 336 | await expect(store.$load({})).rejects.toThrow( 337 | 'Error while refreshing cache' 338 | ); 339 | expect(store.loading).toBe(false); 340 | }); 341 | 342 | it('refuse to initialize on invalid configurations', () => { 343 | expect(() => { 344 | defineCachedStore({ 345 | id: 'loading', 346 | state: () => ({ loading: false, value: 0 }), 347 | async refresh(options: {}) {}, 348 | caching: { 349 | // By not ignoring but expecting an error, we inherently also kind of 350 | // test that the typing system for the loadingKey option works. 351 | // @ts-expect-error 352 | loadingKey: 'value', 353 | }, 354 | }); 355 | }).toThrow('invalid loading key'); 356 | }); 357 | }); 358 | 359 | describe('secondary payload', () => { 360 | it('is passed on to the refresh method', async () => { 361 | const useStore = defineCachedStore({ 362 | id: 'payload', 363 | state: () => ({ value: 0 }), 364 | async refresh(options: {}, argument: number) { 365 | expect(argument).toBe(5); 366 | }, 367 | }); 368 | const store = useStore(); 369 | 370 | await store.$load({}, 5); 371 | }); 372 | 373 | it('is not used for caching key', async () => { 374 | const useStore = defineCachedStore({ 375 | id: 'payload', 376 | state: () => ({ value: 0 }), 377 | async refresh(options: { factor: number }, argument: number) { 378 | this.value = options.factor * argument; 379 | }, 380 | }); 381 | const store = useStore(); 382 | 383 | await store.$load({ factor: 2 }, 4); 384 | expect(store.value).toBe(8); 385 | 386 | store.$reset(); 387 | await store.$load({ factor: 2 }, 10); 388 | // This is actually expected to be 8 (not 20), because we now already have 389 | // a value for '{ factor: 2 }' in the cache: 390 | expect(store.value).toBe(8); 391 | 392 | expect(Object.keys(localStorage)).toHaveLength(1); 393 | localStorage.clear(); 394 | 395 | await store.$load({ factor: 2 }, 10); 396 | expect(store.value).toBe(20); 397 | }); 398 | 399 | it('is passed to the validity check', async () => { 400 | const calculate = jest.fn( 401 | (factor: number, argument: number) => factor * argument 402 | ); 403 | 404 | // This example basically negates the need for a second argument, but it 405 | // tests the feature nonetheless: 406 | const useStore = defineCachedStore({ 407 | id: 'payload', 408 | state: () => ({ value: 0, argument: 0 }), 409 | async refresh(options: { factor: number }, argument: number) { 410 | this.value = calculate(options.factor, argument); 411 | this.argument = argument; 412 | }, 413 | caching: { 414 | checkValidity(data, argument) { 415 | return data.argument == argument; 416 | }, 417 | }, 418 | }); 419 | const store = useStore(); 420 | 421 | await store.$load({ factor: 2 }, 4); 422 | await store.$load({ factor: 2 }, 7); 423 | expect(calculate).toBeCalledTimes(2); 424 | }); 425 | }); 426 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@rollup/plugin-terser': 12 | specifier: ^0.4.4 13 | version: 0.4.4(rollup@4.35.0) 14 | '@rollup/plugin-typescript': 15 | specifier: ^11.1.6 16 | version: 11.1.6(rollup@4.35.0)(tslib@2.8.1)(typescript@5.8.2) 17 | '@sucrase/jest-plugin': 18 | specifier: ^3.0.0 19 | version: 3.0.0(jest@29.7.0(@types/node@22.13.10))(sucrase@3.35.0) 20 | '@types/jest': 21 | specifier: ^29.5.14 22 | version: 29.5.14 23 | '@types/node': 24 | specifier: ^22.13.10 25 | version: 22.13.10 26 | jest: 27 | specifier: ^29.7.0 28 | version: 29.7.0(@types/node@22.13.10) 29 | jest-environment-jsdom: 30 | specifier: ^29.7.0 31 | version: 29.7.0 32 | pinia: 33 | specifier: ^3.0.1 34 | version: 3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)) 35 | prettier: 36 | specifier: ^3.5.3 37 | version: 3.5.3 38 | rimraf: 39 | specifier: ^6.0.1 40 | version: 6.0.1 41 | rollup: 42 | specifier: ^4.35.0 43 | version: 4.35.0 44 | tslib: 45 | specifier: ^2.8.1 46 | version: 2.8.1 47 | typescript: 48 | specifier: ^5.8.2 49 | version: 5.8.2 50 | vue: 51 | specifier: ^3.5.13 52 | version: 3.5.13(typescript@5.8.2) 53 | 54 | packages: 55 | 56 | '@ampproject/remapping@2.3.0': 57 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 58 | engines: {node: '>=6.0.0'} 59 | 60 | '@babel/code-frame@7.26.2': 61 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 62 | engines: {node: '>=6.9.0'} 63 | 64 | '@babel/compat-data@7.26.8': 65 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 66 | engines: {node: '>=6.9.0'} 67 | 68 | '@babel/core@7.26.9': 69 | resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} 70 | engines: {node: '>=6.9.0'} 71 | 72 | '@babel/generator@7.26.9': 73 | resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} 74 | engines: {node: '>=6.9.0'} 75 | 76 | '@babel/helper-compilation-targets@7.26.5': 77 | resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} 78 | engines: {node: '>=6.9.0'} 79 | 80 | '@babel/helper-module-imports@7.25.9': 81 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 82 | engines: {node: '>=6.9.0'} 83 | 84 | '@babel/helper-module-transforms@7.26.0': 85 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 86 | engines: {node: '>=6.9.0'} 87 | peerDependencies: 88 | '@babel/core': ^7.0.0 89 | 90 | '@babel/helper-plugin-utils@7.26.5': 91 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 92 | engines: {node: '>=6.9.0'} 93 | 94 | '@babel/helper-string-parser@7.25.9': 95 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 96 | engines: {node: '>=6.9.0'} 97 | 98 | '@babel/helper-validator-identifier@7.25.9': 99 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 100 | engines: {node: '>=6.9.0'} 101 | 102 | '@babel/helper-validator-option@7.25.9': 103 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 104 | engines: {node: '>=6.9.0'} 105 | 106 | '@babel/helpers@7.26.9': 107 | resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} 108 | engines: {node: '>=6.9.0'} 109 | 110 | '@babel/parser@7.26.9': 111 | resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} 112 | engines: {node: '>=6.0.0'} 113 | hasBin: true 114 | 115 | '@babel/plugin-syntax-async-generators@7.8.4': 116 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 117 | peerDependencies: 118 | '@babel/core': ^7.0.0-0 119 | 120 | '@babel/plugin-syntax-bigint@7.8.3': 121 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 122 | peerDependencies: 123 | '@babel/core': ^7.0.0-0 124 | 125 | '@babel/plugin-syntax-class-properties@7.12.13': 126 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 127 | peerDependencies: 128 | '@babel/core': ^7.0.0-0 129 | 130 | '@babel/plugin-syntax-class-static-block@7.14.5': 131 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 132 | engines: {node: '>=6.9.0'} 133 | peerDependencies: 134 | '@babel/core': ^7.0.0-0 135 | 136 | '@babel/plugin-syntax-import-attributes@7.26.0': 137 | resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} 138 | engines: {node: '>=6.9.0'} 139 | peerDependencies: 140 | '@babel/core': ^7.0.0-0 141 | 142 | '@babel/plugin-syntax-import-meta@7.10.4': 143 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 144 | peerDependencies: 145 | '@babel/core': ^7.0.0-0 146 | 147 | '@babel/plugin-syntax-json-strings@7.8.3': 148 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 149 | peerDependencies: 150 | '@babel/core': ^7.0.0-0 151 | 152 | '@babel/plugin-syntax-jsx@7.25.9': 153 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 154 | engines: {node: '>=6.9.0'} 155 | peerDependencies: 156 | '@babel/core': ^7.0.0-0 157 | 158 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 159 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 160 | peerDependencies: 161 | '@babel/core': ^7.0.0-0 162 | 163 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 164 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 165 | peerDependencies: 166 | '@babel/core': ^7.0.0-0 167 | 168 | '@babel/plugin-syntax-numeric-separator@7.10.4': 169 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 170 | peerDependencies: 171 | '@babel/core': ^7.0.0-0 172 | 173 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 174 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 175 | peerDependencies: 176 | '@babel/core': ^7.0.0-0 177 | 178 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 179 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 180 | peerDependencies: 181 | '@babel/core': ^7.0.0-0 182 | 183 | '@babel/plugin-syntax-optional-chaining@7.8.3': 184 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 185 | peerDependencies: 186 | '@babel/core': ^7.0.0-0 187 | 188 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 189 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 190 | engines: {node: '>=6.9.0'} 191 | peerDependencies: 192 | '@babel/core': ^7.0.0-0 193 | 194 | '@babel/plugin-syntax-top-level-await@7.14.5': 195 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 196 | engines: {node: '>=6.9.0'} 197 | peerDependencies: 198 | '@babel/core': ^7.0.0-0 199 | 200 | '@babel/plugin-syntax-typescript@7.25.9': 201 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 202 | engines: {node: '>=6.9.0'} 203 | peerDependencies: 204 | '@babel/core': ^7.0.0-0 205 | 206 | '@babel/template@7.26.9': 207 | resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} 208 | engines: {node: '>=6.9.0'} 209 | 210 | '@babel/traverse@7.26.9': 211 | resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} 212 | engines: {node: '>=6.9.0'} 213 | 214 | '@babel/types@7.26.9': 215 | resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} 216 | engines: {node: '>=6.9.0'} 217 | 218 | '@bcoe/v8-coverage@0.2.3': 219 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 220 | 221 | '@isaacs/cliui@8.0.2': 222 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 223 | engines: {node: '>=12'} 224 | 225 | '@istanbuljs/load-nyc-config@1.1.0': 226 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 227 | engines: {node: '>=8'} 228 | 229 | '@istanbuljs/schema@0.1.3': 230 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 231 | engines: {node: '>=8'} 232 | 233 | '@jest/console@29.7.0': 234 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 235 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 236 | 237 | '@jest/core@29.7.0': 238 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 239 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 240 | peerDependencies: 241 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 242 | peerDependenciesMeta: 243 | node-notifier: 244 | optional: true 245 | 246 | '@jest/environment@29.7.0': 247 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 248 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 249 | 250 | '@jest/expect-utils@29.7.0': 251 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 252 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 253 | 254 | '@jest/expect@29.7.0': 255 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 256 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 257 | 258 | '@jest/fake-timers@29.7.0': 259 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 260 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 261 | 262 | '@jest/globals@29.7.0': 263 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 264 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 265 | 266 | '@jest/reporters@29.7.0': 267 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 268 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 269 | peerDependencies: 270 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 271 | peerDependenciesMeta: 272 | node-notifier: 273 | optional: true 274 | 275 | '@jest/schemas@29.6.3': 276 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 277 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 278 | 279 | '@jest/source-map@29.6.3': 280 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 281 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 282 | 283 | '@jest/test-result@29.7.0': 284 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 285 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 286 | 287 | '@jest/test-sequencer@29.7.0': 288 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 289 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 290 | 291 | '@jest/transform@29.7.0': 292 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 293 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 294 | 295 | '@jest/types@29.6.3': 296 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 297 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 298 | 299 | '@jridgewell/gen-mapping@0.3.8': 300 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 301 | engines: {node: '>=6.0.0'} 302 | 303 | '@jridgewell/resolve-uri@3.1.2': 304 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 305 | engines: {node: '>=6.0.0'} 306 | 307 | '@jridgewell/set-array@1.2.1': 308 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 309 | engines: {node: '>=6.0.0'} 310 | 311 | '@jridgewell/source-map@0.3.6': 312 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 313 | 314 | '@jridgewell/sourcemap-codec@1.5.0': 315 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 316 | 317 | '@jridgewell/trace-mapping@0.3.25': 318 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 319 | 320 | '@pkgjs/parseargs@0.11.0': 321 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 322 | engines: {node: '>=14'} 323 | 324 | '@rollup/plugin-terser@0.4.4': 325 | resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} 326 | engines: {node: '>=14.0.0'} 327 | peerDependencies: 328 | rollup: ^2.0.0||^3.0.0||^4.0.0 329 | peerDependenciesMeta: 330 | rollup: 331 | optional: true 332 | 333 | '@rollup/plugin-typescript@11.1.6': 334 | resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} 335 | engines: {node: '>=14.0.0'} 336 | peerDependencies: 337 | rollup: ^2.14.0||^3.0.0||^4.0.0 338 | tslib: '*' 339 | typescript: '>=3.7.0' 340 | peerDependenciesMeta: 341 | rollup: 342 | optional: true 343 | tslib: 344 | optional: true 345 | 346 | '@rollup/pluginutils@5.1.4': 347 | resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 348 | engines: {node: '>=14.0.0'} 349 | peerDependencies: 350 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 351 | peerDependenciesMeta: 352 | rollup: 353 | optional: true 354 | 355 | '@rollup/rollup-android-arm-eabi@4.35.0': 356 | resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} 357 | cpu: [arm] 358 | os: [android] 359 | 360 | '@rollup/rollup-android-arm64@4.35.0': 361 | resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==} 362 | cpu: [arm64] 363 | os: [android] 364 | 365 | '@rollup/rollup-darwin-arm64@4.35.0': 366 | resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==} 367 | cpu: [arm64] 368 | os: [darwin] 369 | 370 | '@rollup/rollup-darwin-x64@4.35.0': 371 | resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==} 372 | cpu: [x64] 373 | os: [darwin] 374 | 375 | '@rollup/rollup-freebsd-arm64@4.35.0': 376 | resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==} 377 | cpu: [arm64] 378 | os: [freebsd] 379 | 380 | '@rollup/rollup-freebsd-x64@4.35.0': 381 | resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==} 382 | cpu: [x64] 383 | os: [freebsd] 384 | 385 | '@rollup/rollup-linux-arm-gnueabihf@4.35.0': 386 | resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==} 387 | cpu: [arm] 388 | os: [linux] 389 | 390 | '@rollup/rollup-linux-arm-musleabihf@4.35.0': 391 | resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==} 392 | cpu: [arm] 393 | os: [linux] 394 | 395 | '@rollup/rollup-linux-arm64-gnu@4.35.0': 396 | resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==} 397 | cpu: [arm64] 398 | os: [linux] 399 | 400 | '@rollup/rollup-linux-arm64-musl@4.35.0': 401 | resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==} 402 | cpu: [arm64] 403 | os: [linux] 404 | 405 | '@rollup/rollup-linux-loongarch64-gnu@4.35.0': 406 | resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==} 407 | cpu: [loong64] 408 | os: [linux] 409 | 410 | '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': 411 | resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==} 412 | cpu: [ppc64] 413 | os: [linux] 414 | 415 | '@rollup/rollup-linux-riscv64-gnu@4.35.0': 416 | resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==} 417 | cpu: [riscv64] 418 | os: [linux] 419 | 420 | '@rollup/rollup-linux-s390x-gnu@4.35.0': 421 | resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==} 422 | cpu: [s390x] 423 | os: [linux] 424 | 425 | '@rollup/rollup-linux-x64-gnu@4.35.0': 426 | resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==} 427 | cpu: [x64] 428 | os: [linux] 429 | 430 | '@rollup/rollup-linux-x64-musl@4.35.0': 431 | resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==} 432 | cpu: [x64] 433 | os: [linux] 434 | 435 | '@rollup/rollup-win32-arm64-msvc@4.35.0': 436 | resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==} 437 | cpu: [arm64] 438 | os: [win32] 439 | 440 | '@rollup/rollup-win32-ia32-msvc@4.35.0': 441 | resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==} 442 | cpu: [ia32] 443 | os: [win32] 444 | 445 | '@rollup/rollup-win32-x64-msvc@4.35.0': 446 | resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==} 447 | cpu: [x64] 448 | os: [win32] 449 | 450 | '@sinclair/typebox@0.27.8': 451 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 452 | 453 | '@sinonjs/commons@3.0.1': 454 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 455 | 456 | '@sinonjs/fake-timers@10.3.0': 457 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 458 | 459 | '@sucrase/jest-plugin@3.0.0': 460 | resolution: {integrity: sha512-VRY6YKYImVWiRg1H3Yu24hwB1UPJDSDR62R/n+lOHR3+yDrfHEIAoddJivblMYN6U3vD+ndfTSrecZ9Jl+iGNw==} 461 | peerDependencies: 462 | jest: '>=27' 463 | sucrase: '>=3.25.0' 464 | 465 | '@tootallnate/once@2.0.0': 466 | resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 467 | engines: {node: '>= 10'} 468 | 469 | '@types/babel__core@7.20.5': 470 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 471 | 472 | '@types/babel__generator@7.6.8': 473 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 474 | 475 | '@types/babel__template@7.4.4': 476 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 477 | 478 | '@types/babel__traverse@7.20.6': 479 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 480 | 481 | '@types/estree@1.0.6': 482 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 483 | 484 | '@types/graceful-fs@4.1.9': 485 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 486 | 487 | '@types/istanbul-lib-coverage@2.0.6': 488 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 489 | 490 | '@types/istanbul-lib-report@3.0.3': 491 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 492 | 493 | '@types/istanbul-reports@3.0.4': 494 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 495 | 496 | '@types/jest@29.5.14': 497 | resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} 498 | 499 | '@types/jsdom@20.0.1': 500 | resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} 501 | 502 | '@types/node@22.13.10': 503 | resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} 504 | 505 | '@types/stack-utils@2.0.3': 506 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 507 | 508 | '@types/tough-cookie@4.0.5': 509 | resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} 510 | 511 | '@types/yargs-parser@21.0.3': 512 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 513 | 514 | '@types/yargs@17.0.33': 515 | resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} 516 | 517 | '@vue/compiler-core@3.5.13': 518 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 519 | 520 | '@vue/compiler-dom@3.5.13': 521 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 522 | 523 | '@vue/compiler-sfc@3.5.13': 524 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 525 | 526 | '@vue/compiler-ssr@3.5.13': 527 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 528 | 529 | '@vue/devtools-api@7.7.2': 530 | resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==} 531 | 532 | '@vue/devtools-kit@7.7.2': 533 | resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==} 534 | 535 | '@vue/devtools-shared@7.7.2': 536 | resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==} 537 | 538 | '@vue/reactivity@3.5.13': 539 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 540 | 541 | '@vue/runtime-core@3.5.13': 542 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 543 | 544 | '@vue/runtime-dom@3.5.13': 545 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 546 | 547 | '@vue/server-renderer@3.5.13': 548 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 549 | peerDependencies: 550 | vue: 3.5.13 551 | 552 | '@vue/shared@3.5.13': 553 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 554 | 555 | abab@2.0.6: 556 | resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 557 | deprecated: Use your platform's native atob() and btoa() methods instead 558 | 559 | acorn-globals@7.0.1: 560 | resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} 561 | 562 | acorn-walk@8.3.4: 563 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 564 | engines: {node: '>=0.4.0'} 565 | 566 | acorn@8.14.1: 567 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 568 | engines: {node: '>=0.4.0'} 569 | hasBin: true 570 | 571 | agent-base@6.0.2: 572 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 573 | engines: {node: '>= 6.0.0'} 574 | 575 | ansi-escapes@4.3.2: 576 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 577 | engines: {node: '>=8'} 578 | 579 | ansi-regex@5.0.1: 580 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 581 | engines: {node: '>=8'} 582 | 583 | ansi-regex@6.1.0: 584 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 585 | engines: {node: '>=12'} 586 | 587 | ansi-styles@4.3.0: 588 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 589 | engines: {node: '>=8'} 590 | 591 | ansi-styles@5.2.0: 592 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 593 | engines: {node: '>=10'} 594 | 595 | ansi-styles@6.2.1: 596 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 597 | engines: {node: '>=12'} 598 | 599 | any-promise@1.3.0: 600 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 601 | 602 | anymatch@3.1.3: 603 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 604 | engines: {node: '>= 8'} 605 | 606 | argparse@1.0.10: 607 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 608 | 609 | asynckit@0.4.0: 610 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 611 | 612 | babel-jest@29.7.0: 613 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 614 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 615 | peerDependencies: 616 | '@babel/core': ^7.8.0 617 | 618 | babel-plugin-istanbul@6.1.1: 619 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 620 | engines: {node: '>=8'} 621 | 622 | babel-plugin-jest-hoist@29.6.3: 623 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 624 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 625 | 626 | babel-preset-current-node-syntax@1.1.0: 627 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 628 | peerDependencies: 629 | '@babel/core': ^7.0.0 630 | 631 | babel-preset-jest@29.6.3: 632 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 633 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 634 | peerDependencies: 635 | '@babel/core': ^7.0.0 636 | 637 | balanced-match@1.0.2: 638 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 639 | 640 | birpc@0.2.19: 641 | resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} 642 | 643 | brace-expansion@1.1.11: 644 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 645 | 646 | brace-expansion@2.0.1: 647 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 648 | 649 | braces@3.0.3: 650 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 651 | engines: {node: '>=8'} 652 | 653 | browserslist@4.24.4: 654 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 655 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 656 | hasBin: true 657 | 658 | bser@2.1.1: 659 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 660 | 661 | buffer-from@1.1.2: 662 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 663 | 664 | call-bind-apply-helpers@1.0.2: 665 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 666 | engines: {node: '>= 0.4'} 667 | 668 | callsites@3.1.0: 669 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 670 | engines: {node: '>=6'} 671 | 672 | camelcase@5.3.1: 673 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 674 | engines: {node: '>=6'} 675 | 676 | camelcase@6.3.0: 677 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 678 | engines: {node: '>=10'} 679 | 680 | caniuse-lite@1.0.30001703: 681 | resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==} 682 | 683 | chalk@4.1.2: 684 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 685 | engines: {node: '>=10'} 686 | 687 | char-regex@1.0.2: 688 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 689 | engines: {node: '>=10'} 690 | 691 | ci-info@3.9.0: 692 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 693 | engines: {node: '>=8'} 694 | 695 | cjs-module-lexer@1.4.3: 696 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 697 | 698 | cliui@8.0.1: 699 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 700 | engines: {node: '>=12'} 701 | 702 | co@4.6.0: 703 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 704 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 705 | 706 | collect-v8-coverage@1.0.2: 707 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 708 | 709 | color-convert@2.0.1: 710 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 711 | engines: {node: '>=7.0.0'} 712 | 713 | color-name@1.1.4: 714 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 715 | 716 | combined-stream@1.0.8: 717 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 718 | engines: {node: '>= 0.8'} 719 | 720 | commander@2.20.3: 721 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 722 | 723 | commander@4.1.1: 724 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 725 | engines: {node: '>= 6'} 726 | 727 | concat-map@0.0.1: 728 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 729 | 730 | convert-source-map@2.0.0: 731 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 732 | 733 | copy-anything@3.0.5: 734 | resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} 735 | engines: {node: '>=12.13'} 736 | 737 | create-jest@29.7.0: 738 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 739 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 740 | hasBin: true 741 | 742 | cross-spawn@7.0.6: 743 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 744 | engines: {node: '>= 8'} 745 | 746 | cssom@0.3.8: 747 | resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} 748 | 749 | cssom@0.5.0: 750 | resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} 751 | 752 | cssstyle@2.3.0: 753 | resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} 754 | engines: {node: '>=8'} 755 | 756 | csstype@3.1.3: 757 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 758 | 759 | data-urls@3.0.2: 760 | resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} 761 | engines: {node: '>=12'} 762 | 763 | debug@4.4.0: 764 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 765 | engines: {node: '>=6.0'} 766 | peerDependencies: 767 | supports-color: '*' 768 | peerDependenciesMeta: 769 | supports-color: 770 | optional: true 771 | 772 | decimal.js@10.5.0: 773 | resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} 774 | 775 | dedent@1.5.3: 776 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 777 | peerDependencies: 778 | babel-plugin-macros: ^3.1.0 779 | peerDependenciesMeta: 780 | babel-plugin-macros: 781 | optional: true 782 | 783 | deepmerge@4.3.1: 784 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 785 | engines: {node: '>=0.10.0'} 786 | 787 | delayed-stream@1.0.0: 788 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 789 | engines: {node: '>=0.4.0'} 790 | 791 | detect-newline@3.1.0: 792 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 793 | engines: {node: '>=8'} 794 | 795 | diff-sequences@29.6.3: 796 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 797 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 798 | 799 | domexception@4.0.0: 800 | resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} 801 | engines: {node: '>=12'} 802 | deprecated: Use your platform's native DOMException instead 803 | 804 | dunder-proto@1.0.1: 805 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 806 | engines: {node: '>= 0.4'} 807 | 808 | eastasianwidth@0.2.0: 809 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 810 | 811 | electron-to-chromium@1.5.114: 812 | resolution: {integrity: sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA==} 813 | 814 | emittery@0.13.1: 815 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 816 | engines: {node: '>=12'} 817 | 818 | emoji-regex@8.0.0: 819 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 820 | 821 | emoji-regex@9.2.2: 822 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 823 | 824 | entities@4.5.0: 825 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 826 | engines: {node: '>=0.12'} 827 | 828 | error-ex@1.3.2: 829 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 830 | 831 | es-define-property@1.0.1: 832 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 833 | engines: {node: '>= 0.4'} 834 | 835 | es-errors@1.3.0: 836 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 837 | engines: {node: '>= 0.4'} 838 | 839 | es-object-atoms@1.1.1: 840 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 841 | engines: {node: '>= 0.4'} 842 | 843 | es-set-tostringtag@2.1.0: 844 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 845 | engines: {node: '>= 0.4'} 846 | 847 | escalade@3.2.0: 848 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 849 | engines: {node: '>=6'} 850 | 851 | escape-string-regexp@2.0.0: 852 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 853 | engines: {node: '>=8'} 854 | 855 | escodegen@2.1.0: 856 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} 857 | engines: {node: '>=6.0'} 858 | hasBin: true 859 | 860 | esprima@4.0.1: 861 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 862 | engines: {node: '>=4'} 863 | hasBin: true 864 | 865 | estraverse@5.3.0: 866 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 867 | engines: {node: '>=4.0'} 868 | 869 | estree-walker@2.0.2: 870 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 871 | 872 | esutils@2.0.3: 873 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 874 | engines: {node: '>=0.10.0'} 875 | 876 | execa@5.1.1: 877 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 878 | engines: {node: '>=10'} 879 | 880 | exit@0.1.2: 881 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 882 | engines: {node: '>= 0.8.0'} 883 | 884 | expect@29.7.0: 885 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 886 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 887 | 888 | fast-json-stable-stringify@2.1.0: 889 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 890 | 891 | fb-watchman@2.0.2: 892 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 893 | 894 | fill-range@7.1.1: 895 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 896 | engines: {node: '>=8'} 897 | 898 | find-up@4.1.0: 899 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 900 | engines: {node: '>=8'} 901 | 902 | foreground-child@3.3.1: 903 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 904 | engines: {node: '>=14'} 905 | 906 | form-data@4.0.2: 907 | resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} 908 | engines: {node: '>= 6'} 909 | 910 | fs.realpath@1.0.0: 911 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 912 | 913 | fsevents@2.3.3: 914 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 915 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 916 | os: [darwin] 917 | 918 | function-bind@1.1.2: 919 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 920 | 921 | gensync@1.0.0-beta.2: 922 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 923 | engines: {node: '>=6.9.0'} 924 | 925 | get-caller-file@2.0.5: 926 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 927 | engines: {node: 6.* || 8.* || >= 10.*} 928 | 929 | get-intrinsic@1.3.0: 930 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 931 | engines: {node: '>= 0.4'} 932 | 933 | get-package-type@0.1.0: 934 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 935 | engines: {node: '>=8.0.0'} 936 | 937 | get-proto@1.0.1: 938 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 939 | engines: {node: '>= 0.4'} 940 | 941 | get-stream@6.0.1: 942 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 943 | engines: {node: '>=10'} 944 | 945 | glob@10.4.5: 946 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 947 | hasBin: true 948 | 949 | glob@11.0.1: 950 | resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} 951 | engines: {node: 20 || >=22} 952 | hasBin: true 953 | 954 | glob@7.2.3: 955 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 956 | deprecated: Glob versions prior to v9 are no longer supported 957 | 958 | globals@11.12.0: 959 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 960 | engines: {node: '>=4'} 961 | 962 | gopd@1.2.0: 963 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 964 | engines: {node: '>= 0.4'} 965 | 966 | graceful-fs@4.2.11: 967 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 968 | 969 | has-flag@4.0.0: 970 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 971 | engines: {node: '>=8'} 972 | 973 | has-symbols@1.1.0: 974 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 975 | engines: {node: '>= 0.4'} 976 | 977 | has-tostringtag@1.0.2: 978 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 979 | engines: {node: '>= 0.4'} 980 | 981 | hasown@2.0.2: 982 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 983 | engines: {node: '>= 0.4'} 984 | 985 | hookable@5.5.3: 986 | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} 987 | 988 | html-encoding-sniffer@3.0.0: 989 | resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} 990 | engines: {node: '>=12'} 991 | 992 | html-escaper@2.0.2: 993 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 994 | 995 | http-proxy-agent@5.0.0: 996 | resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} 997 | engines: {node: '>= 6'} 998 | 999 | https-proxy-agent@5.0.1: 1000 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 1001 | engines: {node: '>= 6'} 1002 | 1003 | human-signals@2.1.0: 1004 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1005 | engines: {node: '>=10.17.0'} 1006 | 1007 | iconv-lite@0.6.3: 1008 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1009 | engines: {node: '>=0.10.0'} 1010 | 1011 | import-local@3.2.0: 1012 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 1013 | engines: {node: '>=8'} 1014 | hasBin: true 1015 | 1016 | imurmurhash@0.1.4: 1017 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1018 | engines: {node: '>=0.8.19'} 1019 | 1020 | inflight@1.0.6: 1021 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1022 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 1023 | 1024 | inherits@2.0.4: 1025 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1026 | 1027 | is-arrayish@0.2.1: 1028 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1029 | 1030 | is-core-module@2.16.1: 1031 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1032 | engines: {node: '>= 0.4'} 1033 | 1034 | is-fullwidth-code-point@3.0.0: 1035 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1036 | engines: {node: '>=8'} 1037 | 1038 | is-generator-fn@2.1.0: 1039 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1040 | engines: {node: '>=6'} 1041 | 1042 | is-number@7.0.0: 1043 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1044 | engines: {node: '>=0.12.0'} 1045 | 1046 | is-potential-custom-element-name@1.0.1: 1047 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 1048 | 1049 | is-stream@2.0.1: 1050 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1051 | engines: {node: '>=8'} 1052 | 1053 | is-what@4.1.16: 1054 | resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 1055 | engines: {node: '>=12.13'} 1056 | 1057 | isexe@2.0.0: 1058 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1059 | 1060 | istanbul-lib-coverage@3.2.2: 1061 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1062 | engines: {node: '>=8'} 1063 | 1064 | istanbul-lib-instrument@5.2.1: 1065 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1066 | engines: {node: '>=8'} 1067 | 1068 | istanbul-lib-instrument@6.0.3: 1069 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 1070 | engines: {node: '>=10'} 1071 | 1072 | istanbul-lib-report@3.0.1: 1073 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1074 | engines: {node: '>=10'} 1075 | 1076 | istanbul-lib-source-maps@4.0.1: 1077 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1078 | engines: {node: '>=10'} 1079 | 1080 | istanbul-reports@3.1.7: 1081 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1082 | engines: {node: '>=8'} 1083 | 1084 | jackspeak@3.4.3: 1085 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1086 | 1087 | jackspeak@4.1.0: 1088 | resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} 1089 | engines: {node: 20 || >=22} 1090 | 1091 | jest-changed-files@29.7.0: 1092 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 1093 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1094 | 1095 | jest-circus@29.7.0: 1096 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 1097 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1098 | 1099 | jest-cli@29.7.0: 1100 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 1101 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1102 | hasBin: true 1103 | peerDependencies: 1104 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1105 | peerDependenciesMeta: 1106 | node-notifier: 1107 | optional: true 1108 | 1109 | jest-config@29.7.0: 1110 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 1111 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1112 | peerDependencies: 1113 | '@types/node': '*' 1114 | ts-node: '>=9.0.0' 1115 | peerDependenciesMeta: 1116 | '@types/node': 1117 | optional: true 1118 | ts-node: 1119 | optional: true 1120 | 1121 | jest-diff@29.7.0: 1122 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 1123 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1124 | 1125 | jest-docblock@29.7.0: 1126 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 1127 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1128 | 1129 | jest-each@29.7.0: 1130 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 1131 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1132 | 1133 | jest-environment-jsdom@29.7.0: 1134 | resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} 1135 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1136 | peerDependencies: 1137 | canvas: ^2.5.0 1138 | peerDependenciesMeta: 1139 | canvas: 1140 | optional: true 1141 | 1142 | jest-environment-node@29.7.0: 1143 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 1144 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1145 | 1146 | jest-get-type@29.6.3: 1147 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 1148 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1149 | 1150 | jest-haste-map@29.7.0: 1151 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 1152 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1153 | 1154 | jest-leak-detector@29.7.0: 1155 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 1156 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1157 | 1158 | jest-matcher-utils@29.7.0: 1159 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 1160 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1161 | 1162 | jest-message-util@29.7.0: 1163 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 1164 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1165 | 1166 | jest-mock@29.7.0: 1167 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 1168 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1169 | 1170 | jest-pnp-resolver@1.2.3: 1171 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 1172 | engines: {node: '>=6'} 1173 | peerDependencies: 1174 | jest-resolve: '*' 1175 | peerDependenciesMeta: 1176 | jest-resolve: 1177 | optional: true 1178 | 1179 | jest-regex-util@29.6.3: 1180 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 1181 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1182 | 1183 | jest-resolve-dependencies@29.7.0: 1184 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 1185 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1186 | 1187 | jest-resolve@29.7.0: 1188 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 1189 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1190 | 1191 | jest-runner@29.7.0: 1192 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 1193 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1194 | 1195 | jest-runtime@29.7.0: 1196 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 1197 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1198 | 1199 | jest-snapshot@29.7.0: 1200 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 1201 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1202 | 1203 | jest-util@29.7.0: 1204 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 1205 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1206 | 1207 | jest-validate@29.7.0: 1208 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 1209 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1210 | 1211 | jest-watcher@29.7.0: 1212 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 1213 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1214 | 1215 | jest-worker@29.7.0: 1216 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 1217 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1218 | 1219 | jest@29.7.0: 1220 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 1221 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1222 | hasBin: true 1223 | peerDependencies: 1224 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1225 | peerDependenciesMeta: 1226 | node-notifier: 1227 | optional: true 1228 | 1229 | js-tokens@4.0.0: 1230 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1231 | 1232 | js-yaml@3.14.1: 1233 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1234 | hasBin: true 1235 | 1236 | jsdom@20.0.3: 1237 | resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} 1238 | engines: {node: '>=14'} 1239 | peerDependencies: 1240 | canvas: ^2.5.0 1241 | peerDependenciesMeta: 1242 | canvas: 1243 | optional: true 1244 | 1245 | jsesc@3.1.0: 1246 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1247 | engines: {node: '>=6'} 1248 | hasBin: true 1249 | 1250 | json-parse-even-better-errors@2.3.1: 1251 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1252 | 1253 | json5@2.2.3: 1254 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1255 | engines: {node: '>=6'} 1256 | hasBin: true 1257 | 1258 | kleur@3.0.3: 1259 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1260 | engines: {node: '>=6'} 1261 | 1262 | leven@3.1.0: 1263 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1264 | engines: {node: '>=6'} 1265 | 1266 | lines-and-columns@1.2.4: 1267 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1268 | 1269 | locate-path@5.0.0: 1270 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1271 | engines: {node: '>=8'} 1272 | 1273 | lru-cache@10.4.3: 1274 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1275 | 1276 | lru-cache@11.0.2: 1277 | resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} 1278 | engines: {node: 20 || >=22} 1279 | 1280 | lru-cache@5.1.1: 1281 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1282 | 1283 | magic-string@0.30.17: 1284 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1285 | 1286 | make-dir@4.0.0: 1287 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1288 | engines: {node: '>=10'} 1289 | 1290 | makeerror@1.0.12: 1291 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 1292 | 1293 | math-intrinsics@1.1.0: 1294 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1295 | engines: {node: '>= 0.4'} 1296 | 1297 | merge-stream@2.0.0: 1298 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1299 | 1300 | micromatch@4.0.8: 1301 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1302 | engines: {node: '>=8.6'} 1303 | 1304 | mime-db@1.52.0: 1305 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1306 | engines: {node: '>= 0.6'} 1307 | 1308 | mime-types@2.1.35: 1309 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1310 | engines: {node: '>= 0.6'} 1311 | 1312 | mimic-fn@2.1.0: 1313 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1314 | engines: {node: '>=6'} 1315 | 1316 | minimatch@10.0.1: 1317 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 1318 | engines: {node: 20 || >=22} 1319 | 1320 | minimatch@3.1.2: 1321 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1322 | 1323 | minimatch@9.0.5: 1324 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1325 | engines: {node: '>=16 || 14 >=14.17'} 1326 | 1327 | minipass@7.1.2: 1328 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1329 | engines: {node: '>=16 || 14 >=14.17'} 1330 | 1331 | mitt@3.0.1: 1332 | resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} 1333 | 1334 | ms@2.1.3: 1335 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1336 | 1337 | mz@2.7.0: 1338 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1339 | 1340 | nanoid@3.3.9: 1341 | resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} 1342 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1343 | hasBin: true 1344 | 1345 | natural-compare@1.4.0: 1346 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1347 | 1348 | node-int64@0.4.0: 1349 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 1350 | 1351 | node-releases@2.0.19: 1352 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1353 | 1354 | normalize-path@3.0.0: 1355 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1356 | engines: {node: '>=0.10.0'} 1357 | 1358 | npm-run-path@4.0.1: 1359 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1360 | engines: {node: '>=8'} 1361 | 1362 | nwsapi@2.2.18: 1363 | resolution: {integrity: sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==} 1364 | 1365 | object-assign@4.1.1: 1366 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1367 | engines: {node: '>=0.10.0'} 1368 | 1369 | once@1.4.0: 1370 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1371 | 1372 | onetime@5.1.2: 1373 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1374 | engines: {node: '>=6'} 1375 | 1376 | p-limit@2.3.0: 1377 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1378 | engines: {node: '>=6'} 1379 | 1380 | p-limit@3.1.0: 1381 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1382 | engines: {node: '>=10'} 1383 | 1384 | p-locate@4.1.0: 1385 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1386 | engines: {node: '>=8'} 1387 | 1388 | p-try@2.2.0: 1389 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1390 | engines: {node: '>=6'} 1391 | 1392 | package-json-from-dist@1.0.1: 1393 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1394 | 1395 | parse-json@5.2.0: 1396 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1397 | engines: {node: '>=8'} 1398 | 1399 | parse5@7.2.1: 1400 | resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 1401 | 1402 | path-exists@4.0.0: 1403 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1404 | engines: {node: '>=8'} 1405 | 1406 | path-is-absolute@1.0.1: 1407 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1408 | engines: {node: '>=0.10.0'} 1409 | 1410 | path-key@3.1.1: 1411 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1412 | engines: {node: '>=8'} 1413 | 1414 | path-parse@1.0.7: 1415 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1416 | 1417 | path-scurry@1.11.1: 1418 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1419 | engines: {node: '>=16 || 14 >=14.18'} 1420 | 1421 | path-scurry@2.0.0: 1422 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 1423 | engines: {node: 20 || >=22} 1424 | 1425 | perfect-debounce@1.0.0: 1426 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 1427 | 1428 | picocolors@1.1.1: 1429 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1430 | 1431 | picomatch@2.3.1: 1432 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1433 | engines: {node: '>=8.6'} 1434 | 1435 | picomatch@4.0.2: 1436 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1437 | engines: {node: '>=12'} 1438 | 1439 | pinia@3.0.1: 1440 | resolution: {integrity: sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==} 1441 | peerDependencies: 1442 | typescript: '>=4.4.4' 1443 | vue: ^2.7.0 || ^3.5.11 1444 | peerDependenciesMeta: 1445 | typescript: 1446 | optional: true 1447 | 1448 | pirates@4.0.6: 1449 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1450 | engines: {node: '>= 6'} 1451 | 1452 | pkg-dir@4.2.0: 1453 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1454 | engines: {node: '>=8'} 1455 | 1456 | postcss@8.5.3: 1457 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1458 | engines: {node: ^10 || ^12 || >=14} 1459 | 1460 | prettier@3.5.3: 1461 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1462 | engines: {node: '>=14'} 1463 | hasBin: true 1464 | 1465 | pretty-format@29.7.0: 1466 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1467 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1468 | 1469 | prompts@2.4.2: 1470 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1471 | engines: {node: '>= 6'} 1472 | 1473 | psl@1.15.0: 1474 | resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} 1475 | 1476 | punycode@2.3.1: 1477 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1478 | engines: {node: '>=6'} 1479 | 1480 | pure-rand@6.1.0: 1481 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 1482 | 1483 | querystringify@2.2.0: 1484 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 1485 | 1486 | randombytes@2.1.0: 1487 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1488 | 1489 | react-is@18.3.1: 1490 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 1491 | 1492 | require-directory@2.1.1: 1493 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1494 | engines: {node: '>=0.10.0'} 1495 | 1496 | requires-port@1.0.0: 1497 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 1498 | 1499 | resolve-cwd@3.0.0: 1500 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1501 | engines: {node: '>=8'} 1502 | 1503 | resolve-from@5.0.0: 1504 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1505 | engines: {node: '>=8'} 1506 | 1507 | resolve.exports@2.0.3: 1508 | resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} 1509 | engines: {node: '>=10'} 1510 | 1511 | resolve@1.22.10: 1512 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1513 | engines: {node: '>= 0.4'} 1514 | hasBin: true 1515 | 1516 | rfdc@1.4.1: 1517 | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 1518 | 1519 | rimraf@6.0.1: 1520 | resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} 1521 | engines: {node: 20 || >=22} 1522 | hasBin: true 1523 | 1524 | rollup@4.35.0: 1525 | resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} 1526 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1527 | hasBin: true 1528 | 1529 | safe-buffer@5.2.1: 1530 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1531 | 1532 | safer-buffer@2.1.2: 1533 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1534 | 1535 | saxes@6.0.0: 1536 | resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 1537 | engines: {node: '>=v12.22.7'} 1538 | 1539 | semver@6.3.1: 1540 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1541 | hasBin: true 1542 | 1543 | semver@7.7.1: 1544 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1545 | engines: {node: '>=10'} 1546 | hasBin: true 1547 | 1548 | serialize-javascript@6.0.2: 1549 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1550 | 1551 | shebang-command@2.0.0: 1552 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1553 | engines: {node: '>=8'} 1554 | 1555 | shebang-regex@3.0.0: 1556 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1557 | engines: {node: '>=8'} 1558 | 1559 | signal-exit@3.0.7: 1560 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1561 | 1562 | signal-exit@4.1.0: 1563 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1564 | engines: {node: '>=14'} 1565 | 1566 | sisteransi@1.0.5: 1567 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1568 | 1569 | slash@3.0.0: 1570 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1571 | engines: {node: '>=8'} 1572 | 1573 | smob@1.5.0: 1574 | resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} 1575 | 1576 | source-map-js@1.2.1: 1577 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1578 | engines: {node: '>=0.10.0'} 1579 | 1580 | source-map-support@0.5.13: 1581 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1582 | 1583 | source-map-support@0.5.21: 1584 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1585 | 1586 | source-map@0.6.1: 1587 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1588 | engines: {node: '>=0.10.0'} 1589 | 1590 | speakingurl@14.0.1: 1591 | resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} 1592 | engines: {node: '>=0.10.0'} 1593 | 1594 | sprintf-js@1.0.3: 1595 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1596 | 1597 | stack-utils@2.0.6: 1598 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1599 | engines: {node: '>=10'} 1600 | 1601 | string-length@4.0.2: 1602 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1603 | engines: {node: '>=10'} 1604 | 1605 | string-width@4.2.3: 1606 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1607 | engines: {node: '>=8'} 1608 | 1609 | string-width@5.1.2: 1610 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1611 | engines: {node: '>=12'} 1612 | 1613 | strip-ansi@6.0.1: 1614 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1615 | engines: {node: '>=8'} 1616 | 1617 | strip-ansi@7.1.0: 1618 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1619 | engines: {node: '>=12'} 1620 | 1621 | strip-bom@4.0.0: 1622 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1623 | engines: {node: '>=8'} 1624 | 1625 | strip-final-newline@2.0.0: 1626 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1627 | engines: {node: '>=6'} 1628 | 1629 | strip-json-comments@3.1.1: 1630 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1631 | engines: {node: '>=8'} 1632 | 1633 | sucrase@3.35.0: 1634 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1635 | engines: {node: '>=16 || 14 >=14.17'} 1636 | hasBin: true 1637 | 1638 | superjson@2.2.2: 1639 | resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} 1640 | engines: {node: '>=16'} 1641 | 1642 | supports-color@7.2.0: 1643 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1644 | engines: {node: '>=8'} 1645 | 1646 | supports-color@8.1.1: 1647 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1648 | engines: {node: '>=10'} 1649 | 1650 | supports-preserve-symlinks-flag@1.0.0: 1651 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1652 | engines: {node: '>= 0.4'} 1653 | 1654 | symbol-tree@3.2.4: 1655 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 1656 | 1657 | terser@5.39.0: 1658 | resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} 1659 | engines: {node: '>=10'} 1660 | hasBin: true 1661 | 1662 | test-exclude@6.0.0: 1663 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1664 | engines: {node: '>=8'} 1665 | 1666 | thenify-all@1.6.0: 1667 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1668 | engines: {node: '>=0.8'} 1669 | 1670 | thenify@3.3.1: 1671 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1672 | 1673 | tmpl@1.0.5: 1674 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1675 | 1676 | to-regex-range@5.0.1: 1677 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1678 | engines: {node: '>=8.0'} 1679 | 1680 | tough-cookie@4.1.4: 1681 | resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} 1682 | engines: {node: '>=6'} 1683 | 1684 | tr46@3.0.0: 1685 | resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} 1686 | engines: {node: '>=12'} 1687 | 1688 | ts-interface-checker@0.1.13: 1689 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1690 | 1691 | tslib@2.8.1: 1692 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1693 | 1694 | type-detect@4.0.8: 1695 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1696 | engines: {node: '>=4'} 1697 | 1698 | type-fest@0.21.3: 1699 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1700 | engines: {node: '>=10'} 1701 | 1702 | typescript@5.8.2: 1703 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 1704 | engines: {node: '>=14.17'} 1705 | hasBin: true 1706 | 1707 | undici-types@6.20.0: 1708 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1709 | 1710 | universalify@0.2.0: 1711 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 1712 | engines: {node: '>= 4.0.0'} 1713 | 1714 | update-browserslist-db@1.1.3: 1715 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1716 | hasBin: true 1717 | peerDependencies: 1718 | browserslist: '>= 4.21.0' 1719 | 1720 | url-parse@1.5.10: 1721 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 1722 | 1723 | v8-to-istanbul@9.3.0: 1724 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 1725 | engines: {node: '>=10.12.0'} 1726 | 1727 | vue@3.5.13: 1728 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 1729 | peerDependencies: 1730 | typescript: '*' 1731 | peerDependenciesMeta: 1732 | typescript: 1733 | optional: true 1734 | 1735 | w3c-xmlserializer@4.0.0: 1736 | resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} 1737 | engines: {node: '>=14'} 1738 | 1739 | walker@1.0.8: 1740 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1741 | 1742 | webidl-conversions@7.0.0: 1743 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 1744 | engines: {node: '>=12'} 1745 | 1746 | whatwg-encoding@2.0.0: 1747 | resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} 1748 | engines: {node: '>=12'} 1749 | 1750 | whatwg-mimetype@3.0.0: 1751 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 1752 | engines: {node: '>=12'} 1753 | 1754 | whatwg-url@11.0.0: 1755 | resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} 1756 | engines: {node: '>=12'} 1757 | 1758 | which@2.0.2: 1759 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1760 | engines: {node: '>= 8'} 1761 | hasBin: true 1762 | 1763 | wrap-ansi@7.0.0: 1764 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1765 | engines: {node: '>=10'} 1766 | 1767 | wrap-ansi@8.1.0: 1768 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1769 | engines: {node: '>=12'} 1770 | 1771 | wrappy@1.0.2: 1772 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1773 | 1774 | write-file-atomic@4.0.2: 1775 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1776 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1777 | 1778 | ws@8.18.1: 1779 | resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} 1780 | engines: {node: '>=10.0.0'} 1781 | peerDependencies: 1782 | bufferutil: ^4.0.1 1783 | utf-8-validate: '>=5.0.2' 1784 | peerDependenciesMeta: 1785 | bufferutil: 1786 | optional: true 1787 | utf-8-validate: 1788 | optional: true 1789 | 1790 | xml-name-validator@4.0.0: 1791 | resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 1792 | engines: {node: '>=12'} 1793 | 1794 | xmlchars@2.2.0: 1795 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 1796 | 1797 | y18n@5.0.8: 1798 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1799 | engines: {node: '>=10'} 1800 | 1801 | yallist@3.1.1: 1802 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1803 | 1804 | yargs-parser@21.1.1: 1805 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1806 | engines: {node: '>=12'} 1807 | 1808 | yargs@17.7.2: 1809 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1810 | engines: {node: '>=12'} 1811 | 1812 | yocto-queue@0.1.0: 1813 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1814 | engines: {node: '>=10'} 1815 | 1816 | snapshots: 1817 | 1818 | '@ampproject/remapping@2.3.0': 1819 | dependencies: 1820 | '@jridgewell/gen-mapping': 0.3.8 1821 | '@jridgewell/trace-mapping': 0.3.25 1822 | 1823 | '@babel/code-frame@7.26.2': 1824 | dependencies: 1825 | '@babel/helper-validator-identifier': 7.25.9 1826 | js-tokens: 4.0.0 1827 | picocolors: 1.1.1 1828 | 1829 | '@babel/compat-data@7.26.8': {} 1830 | 1831 | '@babel/core@7.26.9': 1832 | dependencies: 1833 | '@ampproject/remapping': 2.3.0 1834 | '@babel/code-frame': 7.26.2 1835 | '@babel/generator': 7.26.9 1836 | '@babel/helper-compilation-targets': 7.26.5 1837 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) 1838 | '@babel/helpers': 7.26.9 1839 | '@babel/parser': 7.26.9 1840 | '@babel/template': 7.26.9 1841 | '@babel/traverse': 7.26.9 1842 | '@babel/types': 7.26.9 1843 | convert-source-map: 2.0.0 1844 | debug: 4.4.0 1845 | gensync: 1.0.0-beta.2 1846 | json5: 2.2.3 1847 | semver: 6.3.1 1848 | transitivePeerDependencies: 1849 | - supports-color 1850 | 1851 | '@babel/generator@7.26.9': 1852 | dependencies: 1853 | '@babel/parser': 7.26.9 1854 | '@babel/types': 7.26.9 1855 | '@jridgewell/gen-mapping': 0.3.8 1856 | '@jridgewell/trace-mapping': 0.3.25 1857 | jsesc: 3.1.0 1858 | 1859 | '@babel/helper-compilation-targets@7.26.5': 1860 | dependencies: 1861 | '@babel/compat-data': 7.26.8 1862 | '@babel/helper-validator-option': 7.25.9 1863 | browserslist: 4.24.4 1864 | lru-cache: 5.1.1 1865 | semver: 6.3.1 1866 | 1867 | '@babel/helper-module-imports@7.25.9': 1868 | dependencies: 1869 | '@babel/traverse': 7.26.9 1870 | '@babel/types': 7.26.9 1871 | transitivePeerDependencies: 1872 | - supports-color 1873 | 1874 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': 1875 | dependencies: 1876 | '@babel/core': 7.26.9 1877 | '@babel/helper-module-imports': 7.25.9 1878 | '@babel/helper-validator-identifier': 7.25.9 1879 | '@babel/traverse': 7.26.9 1880 | transitivePeerDependencies: 1881 | - supports-color 1882 | 1883 | '@babel/helper-plugin-utils@7.26.5': {} 1884 | 1885 | '@babel/helper-string-parser@7.25.9': {} 1886 | 1887 | '@babel/helper-validator-identifier@7.25.9': {} 1888 | 1889 | '@babel/helper-validator-option@7.25.9': {} 1890 | 1891 | '@babel/helpers@7.26.9': 1892 | dependencies: 1893 | '@babel/template': 7.26.9 1894 | '@babel/types': 7.26.9 1895 | 1896 | '@babel/parser@7.26.9': 1897 | dependencies: 1898 | '@babel/types': 7.26.9 1899 | 1900 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9)': 1901 | dependencies: 1902 | '@babel/core': 7.26.9 1903 | '@babel/helper-plugin-utils': 7.26.5 1904 | 1905 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.9)': 1906 | dependencies: 1907 | '@babel/core': 7.26.9 1908 | '@babel/helper-plugin-utils': 7.26.5 1909 | 1910 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.9)': 1911 | dependencies: 1912 | '@babel/core': 7.26.9 1913 | '@babel/helper-plugin-utils': 7.26.5 1914 | 1915 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.9)': 1916 | dependencies: 1917 | '@babel/core': 7.26.9 1918 | '@babel/helper-plugin-utils': 7.26.5 1919 | 1920 | '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.9)': 1921 | dependencies: 1922 | '@babel/core': 7.26.9 1923 | '@babel/helper-plugin-utils': 7.26.5 1924 | 1925 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9)': 1926 | dependencies: 1927 | '@babel/core': 7.26.9 1928 | '@babel/helper-plugin-utils': 7.26.5 1929 | 1930 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.9)': 1931 | dependencies: 1932 | '@babel/core': 7.26.9 1933 | '@babel/helper-plugin-utils': 7.26.5 1934 | 1935 | '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.9)': 1936 | dependencies: 1937 | '@babel/core': 7.26.9 1938 | '@babel/helper-plugin-utils': 7.26.5 1939 | 1940 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.9)': 1941 | dependencies: 1942 | '@babel/core': 7.26.9 1943 | '@babel/helper-plugin-utils': 7.26.5 1944 | 1945 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.9)': 1946 | dependencies: 1947 | '@babel/core': 7.26.9 1948 | '@babel/helper-plugin-utils': 7.26.5 1949 | 1950 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.9)': 1951 | dependencies: 1952 | '@babel/core': 7.26.9 1953 | '@babel/helper-plugin-utils': 7.26.5 1954 | 1955 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.9)': 1956 | dependencies: 1957 | '@babel/core': 7.26.9 1958 | '@babel/helper-plugin-utils': 7.26.5 1959 | 1960 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.9)': 1961 | dependencies: 1962 | '@babel/core': 7.26.9 1963 | '@babel/helper-plugin-utils': 7.26.5 1964 | 1965 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.9)': 1966 | dependencies: 1967 | '@babel/core': 7.26.9 1968 | '@babel/helper-plugin-utils': 7.26.5 1969 | 1970 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.9)': 1971 | dependencies: 1972 | '@babel/core': 7.26.9 1973 | '@babel/helper-plugin-utils': 7.26.5 1974 | 1975 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.9)': 1976 | dependencies: 1977 | '@babel/core': 7.26.9 1978 | '@babel/helper-plugin-utils': 7.26.5 1979 | 1980 | '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.9)': 1981 | dependencies: 1982 | '@babel/core': 7.26.9 1983 | '@babel/helper-plugin-utils': 7.26.5 1984 | 1985 | '@babel/template@7.26.9': 1986 | dependencies: 1987 | '@babel/code-frame': 7.26.2 1988 | '@babel/parser': 7.26.9 1989 | '@babel/types': 7.26.9 1990 | 1991 | '@babel/traverse@7.26.9': 1992 | dependencies: 1993 | '@babel/code-frame': 7.26.2 1994 | '@babel/generator': 7.26.9 1995 | '@babel/parser': 7.26.9 1996 | '@babel/template': 7.26.9 1997 | '@babel/types': 7.26.9 1998 | debug: 4.4.0 1999 | globals: 11.12.0 2000 | transitivePeerDependencies: 2001 | - supports-color 2002 | 2003 | '@babel/types@7.26.9': 2004 | dependencies: 2005 | '@babel/helper-string-parser': 7.25.9 2006 | '@babel/helper-validator-identifier': 7.25.9 2007 | 2008 | '@bcoe/v8-coverage@0.2.3': {} 2009 | 2010 | '@isaacs/cliui@8.0.2': 2011 | dependencies: 2012 | string-width: 5.1.2 2013 | string-width-cjs: string-width@4.2.3 2014 | strip-ansi: 7.1.0 2015 | strip-ansi-cjs: strip-ansi@6.0.1 2016 | wrap-ansi: 8.1.0 2017 | wrap-ansi-cjs: wrap-ansi@7.0.0 2018 | 2019 | '@istanbuljs/load-nyc-config@1.1.0': 2020 | dependencies: 2021 | camelcase: 5.3.1 2022 | find-up: 4.1.0 2023 | get-package-type: 0.1.0 2024 | js-yaml: 3.14.1 2025 | resolve-from: 5.0.0 2026 | 2027 | '@istanbuljs/schema@0.1.3': {} 2028 | 2029 | '@jest/console@29.7.0': 2030 | dependencies: 2031 | '@jest/types': 29.6.3 2032 | '@types/node': 22.13.10 2033 | chalk: 4.1.2 2034 | jest-message-util: 29.7.0 2035 | jest-util: 29.7.0 2036 | slash: 3.0.0 2037 | 2038 | '@jest/core@29.7.0': 2039 | dependencies: 2040 | '@jest/console': 29.7.0 2041 | '@jest/reporters': 29.7.0 2042 | '@jest/test-result': 29.7.0 2043 | '@jest/transform': 29.7.0 2044 | '@jest/types': 29.6.3 2045 | '@types/node': 22.13.10 2046 | ansi-escapes: 4.3.2 2047 | chalk: 4.1.2 2048 | ci-info: 3.9.0 2049 | exit: 0.1.2 2050 | graceful-fs: 4.2.11 2051 | jest-changed-files: 29.7.0 2052 | jest-config: 29.7.0(@types/node@22.13.10) 2053 | jest-haste-map: 29.7.0 2054 | jest-message-util: 29.7.0 2055 | jest-regex-util: 29.6.3 2056 | jest-resolve: 29.7.0 2057 | jest-resolve-dependencies: 29.7.0 2058 | jest-runner: 29.7.0 2059 | jest-runtime: 29.7.0 2060 | jest-snapshot: 29.7.0 2061 | jest-util: 29.7.0 2062 | jest-validate: 29.7.0 2063 | jest-watcher: 29.7.0 2064 | micromatch: 4.0.8 2065 | pretty-format: 29.7.0 2066 | slash: 3.0.0 2067 | strip-ansi: 6.0.1 2068 | transitivePeerDependencies: 2069 | - babel-plugin-macros 2070 | - supports-color 2071 | - ts-node 2072 | 2073 | '@jest/environment@29.7.0': 2074 | dependencies: 2075 | '@jest/fake-timers': 29.7.0 2076 | '@jest/types': 29.6.3 2077 | '@types/node': 22.13.10 2078 | jest-mock: 29.7.0 2079 | 2080 | '@jest/expect-utils@29.7.0': 2081 | dependencies: 2082 | jest-get-type: 29.6.3 2083 | 2084 | '@jest/expect@29.7.0': 2085 | dependencies: 2086 | expect: 29.7.0 2087 | jest-snapshot: 29.7.0 2088 | transitivePeerDependencies: 2089 | - supports-color 2090 | 2091 | '@jest/fake-timers@29.7.0': 2092 | dependencies: 2093 | '@jest/types': 29.6.3 2094 | '@sinonjs/fake-timers': 10.3.0 2095 | '@types/node': 22.13.10 2096 | jest-message-util: 29.7.0 2097 | jest-mock: 29.7.0 2098 | jest-util: 29.7.0 2099 | 2100 | '@jest/globals@29.7.0': 2101 | dependencies: 2102 | '@jest/environment': 29.7.0 2103 | '@jest/expect': 29.7.0 2104 | '@jest/types': 29.6.3 2105 | jest-mock: 29.7.0 2106 | transitivePeerDependencies: 2107 | - supports-color 2108 | 2109 | '@jest/reporters@29.7.0': 2110 | dependencies: 2111 | '@bcoe/v8-coverage': 0.2.3 2112 | '@jest/console': 29.7.0 2113 | '@jest/test-result': 29.7.0 2114 | '@jest/transform': 29.7.0 2115 | '@jest/types': 29.6.3 2116 | '@jridgewell/trace-mapping': 0.3.25 2117 | '@types/node': 22.13.10 2118 | chalk: 4.1.2 2119 | collect-v8-coverage: 1.0.2 2120 | exit: 0.1.2 2121 | glob: 7.2.3 2122 | graceful-fs: 4.2.11 2123 | istanbul-lib-coverage: 3.2.2 2124 | istanbul-lib-instrument: 6.0.3 2125 | istanbul-lib-report: 3.0.1 2126 | istanbul-lib-source-maps: 4.0.1 2127 | istanbul-reports: 3.1.7 2128 | jest-message-util: 29.7.0 2129 | jest-util: 29.7.0 2130 | jest-worker: 29.7.0 2131 | slash: 3.0.0 2132 | string-length: 4.0.2 2133 | strip-ansi: 6.0.1 2134 | v8-to-istanbul: 9.3.0 2135 | transitivePeerDependencies: 2136 | - supports-color 2137 | 2138 | '@jest/schemas@29.6.3': 2139 | dependencies: 2140 | '@sinclair/typebox': 0.27.8 2141 | 2142 | '@jest/source-map@29.6.3': 2143 | dependencies: 2144 | '@jridgewell/trace-mapping': 0.3.25 2145 | callsites: 3.1.0 2146 | graceful-fs: 4.2.11 2147 | 2148 | '@jest/test-result@29.7.0': 2149 | dependencies: 2150 | '@jest/console': 29.7.0 2151 | '@jest/types': 29.6.3 2152 | '@types/istanbul-lib-coverage': 2.0.6 2153 | collect-v8-coverage: 1.0.2 2154 | 2155 | '@jest/test-sequencer@29.7.0': 2156 | dependencies: 2157 | '@jest/test-result': 29.7.0 2158 | graceful-fs: 4.2.11 2159 | jest-haste-map: 29.7.0 2160 | slash: 3.0.0 2161 | 2162 | '@jest/transform@29.7.0': 2163 | dependencies: 2164 | '@babel/core': 7.26.9 2165 | '@jest/types': 29.6.3 2166 | '@jridgewell/trace-mapping': 0.3.25 2167 | babel-plugin-istanbul: 6.1.1 2168 | chalk: 4.1.2 2169 | convert-source-map: 2.0.0 2170 | fast-json-stable-stringify: 2.1.0 2171 | graceful-fs: 4.2.11 2172 | jest-haste-map: 29.7.0 2173 | jest-regex-util: 29.6.3 2174 | jest-util: 29.7.0 2175 | micromatch: 4.0.8 2176 | pirates: 4.0.6 2177 | slash: 3.0.0 2178 | write-file-atomic: 4.0.2 2179 | transitivePeerDependencies: 2180 | - supports-color 2181 | 2182 | '@jest/types@29.6.3': 2183 | dependencies: 2184 | '@jest/schemas': 29.6.3 2185 | '@types/istanbul-lib-coverage': 2.0.6 2186 | '@types/istanbul-reports': 3.0.4 2187 | '@types/node': 22.13.10 2188 | '@types/yargs': 17.0.33 2189 | chalk: 4.1.2 2190 | 2191 | '@jridgewell/gen-mapping@0.3.8': 2192 | dependencies: 2193 | '@jridgewell/set-array': 1.2.1 2194 | '@jridgewell/sourcemap-codec': 1.5.0 2195 | '@jridgewell/trace-mapping': 0.3.25 2196 | 2197 | '@jridgewell/resolve-uri@3.1.2': {} 2198 | 2199 | '@jridgewell/set-array@1.2.1': {} 2200 | 2201 | '@jridgewell/source-map@0.3.6': 2202 | dependencies: 2203 | '@jridgewell/gen-mapping': 0.3.8 2204 | '@jridgewell/trace-mapping': 0.3.25 2205 | 2206 | '@jridgewell/sourcemap-codec@1.5.0': {} 2207 | 2208 | '@jridgewell/trace-mapping@0.3.25': 2209 | dependencies: 2210 | '@jridgewell/resolve-uri': 3.1.2 2211 | '@jridgewell/sourcemap-codec': 1.5.0 2212 | 2213 | '@pkgjs/parseargs@0.11.0': 2214 | optional: true 2215 | 2216 | '@rollup/plugin-terser@0.4.4(rollup@4.35.0)': 2217 | dependencies: 2218 | serialize-javascript: 6.0.2 2219 | smob: 1.5.0 2220 | terser: 5.39.0 2221 | optionalDependencies: 2222 | rollup: 4.35.0 2223 | 2224 | '@rollup/plugin-typescript@11.1.6(rollup@4.35.0)(tslib@2.8.1)(typescript@5.8.2)': 2225 | dependencies: 2226 | '@rollup/pluginutils': 5.1.4(rollup@4.35.0) 2227 | resolve: 1.22.10 2228 | typescript: 5.8.2 2229 | optionalDependencies: 2230 | rollup: 4.35.0 2231 | tslib: 2.8.1 2232 | 2233 | '@rollup/pluginutils@5.1.4(rollup@4.35.0)': 2234 | dependencies: 2235 | '@types/estree': 1.0.6 2236 | estree-walker: 2.0.2 2237 | picomatch: 4.0.2 2238 | optionalDependencies: 2239 | rollup: 4.35.0 2240 | 2241 | '@rollup/rollup-android-arm-eabi@4.35.0': 2242 | optional: true 2243 | 2244 | '@rollup/rollup-android-arm64@4.35.0': 2245 | optional: true 2246 | 2247 | '@rollup/rollup-darwin-arm64@4.35.0': 2248 | optional: true 2249 | 2250 | '@rollup/rollup-darwin-x64@4.35.0': 2251 | optional: true 2252 | 2253 | '@rollup/rollup-freebsd-arm64@4.35.0': 2254 | optional: true 2255 | 2256 | '@rollup/rollup-freebsd-x64@4.35.0': 2257 | optional: true 2258 | 2259 | '@rollup/rollup-linux-arm-gnueabihf@4.35.0': 2260 | optional: true 2261 | 2262 | '@rollup/rollup-linux-arm-musleabihf@4.35.0': 2263 | optional: true 2264 | 2265 | '@rollup/rollup-linux-arm64-gnu@4.35.0': 2266 | optional: true 2267 | 2268 | '@rollup/rollup-linux-arm64-musl@4.35.0': 2269 | optional: true 2270 | 2271 | '@rollup/rollup-linux-loongarch64-gnu@4.35.0': 2272 | optional: true 2273 | 2274 | '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': 2275 | optional: true 2276 | 2277 | '@rollup/rollup-linux-riscv64-gnu@4.35.0': 2278 | optional: true 2279 | 2280 | '@rollup/rollup-linux-s390x-gnu@4.35.0': 2281 | optional: true 2282 | 2283 | '@rollup/rollup-linux-x64-gnu@4.35.0': 2284 | optional: true 2285 | 2286 | '@rollup/rollup-linux-x64-musl@4.35.0': 2287 | optional: true 2288 | 2289 | '@rollup/rollup-win32-arm64-msvc@4.35.0': 2290 | optional: true 2291 | 2292 | '@rollup/rollup-win32-ia32-msvc@4.35.0': 2293 | optional: true 2294 | 2295 | '@rollup/rollup-win32-x64-msvc@4.35.0': 2296 | optional: true 2297 | 2298 | '@sinclair/typebox@0.27.8': {} 2299 | 2300 | '@sinonjs/commons@3.0.1': 2301 | dependencies: 2302 | type-detect: 4.0.8 2303 | 2304 | '@sinonjs/fake-timers@10.3.0': 2305 | dependencies: 2306 | '@sinonjs/commons': 3.0.1 2307 | 2308 | '@sucrase/jest-plugin@3.0.0(jest@29.7.0(@types/node@22.13.10))(sucrase@3.35.0)': 2309 | dependencies: 2310 | jest: 29.7.0(@types/node@22.13.10) 2311 | sucrase: 3.35.0 2312 | 2313 | '@tootallnate/once@2.0.0': {} 2314 | 2315 | '@types/babel__core@7.20.5': 2316 | dependencies: 2317 | '@babel/parser': 7.26.9 2318 | '@babel/types': 7.26.9 2319 | '@types/babel__generator': 7.6.8 2320 | '@types/babel__template': 7.4.4 2321 | '@types/babel__traverse': 7.20.6 2322 | 2323 | '@types/babel__generator@7.6.8': 2324 | dependencies: 2325 | '@babel/types': 7.26.9 2326 | 2327 | '@types/babel__template@7.4.4': 2328 | dependencies: 2329 | '@babel/parser': 7.26.9 2330 | '@babel/types': 7.26.9 2331 | 2332 | '@types/babel__traverse@7.20.6': 2333 | dependencies: 2334 | '@babel/types': 7.26.9 2335 | 2336 | '@types/estree@1.0.6': {} 2337 | 2338 | '@types/graceful-fs@4.1.9': 2339 | dependencies: 2340 | '@types/node': 22.13.10 2341 | 2342 | '@types/istanbul-lib-coverage@2.0.6': {} 2343 | 2344 | '@types/istanbul-lib-report@3.0.3': 2345 | dependencies: 2346 | '@types/istanbul-lib-coverage': 2.0.6 2347 | 2348 | '@types/istanbul-reports@3.0.4': 2349 | dependencies: 2350 | '@types/istanbul-lib-report': 3.0.3 2351 | 2352 | '@types/jest@29.5.14': 2353 | dependencies: 2354 | expect: 29.7.0 2355 | pretty-format: 29.7.0 2356 | 2357 | '@types/jsdom@20.0.1': 2358 | dependencies: 2359 | '@types/node': 22.13.10 2360 | '@types/tough-cookie': 4.0.5 2361 | parse5: 7.2.1 2362 | 2363 | '@types/node@22.13.10': 2364 | dependencies: 2365 | undici-types: 6.20.0 2366 | 2367 | '@types/stack-utils@2.0.3': {} 2368 | 2369 | '@types/tough-cookie@4.0.5': {} 2370 | 2371 | '@types/yargs-parser@21.0.3': {} 2372 | 2373 | '@types/yargs@17.0.33': 2374 | dependencies: 2375 | '@types/yargs-parser': 21.0.3 2376 | 2377 | '@vue/compiler-core@3.5.13': 2378 | dependencies: 2379 | '@babel/parser': 7.26.9 2380 | '@vue/shared': 3.5.13 2381 | entities: 4.5.0 2382 | estree-walker: 2.0.2 2383 | source-map-js: 1.2.1 2384 | 2385 | '@vue/compiler-dom@3.5.13': 2386 | dependencies: 2387 | '@vue/compiler-core': 3.5.13 2388 | '@vue/shared': 3.5.13 2389 | 2390 | '@vue/compiler-sfc@3.5.13': 2391 | dependencies: 2392 | '@babel/parser': 7.26.9 2393 | '@vue/compiler-core': 3.5.13 2394 | '@vue/compiler-dom': 3.5.13 2395 | '@vue/compiler-ssr': 3.5.13 2396 | '@vue/shared': 3.5.13 2397 | estree-walker: 2.0.2 2398 | magic-string: 0.30.17 2399 | postcss: 8.5.3 2400 | source-map-js: 1.2.1 2401 | 2402 | '@vue/compiler-ssr@3.5.13': 2403 | dependencies: 2404 | '@vue/compiler-dom': 3.5.13 2405 | '@vue/shared': 3.5.13 2406 | 2407 | '@vue/devtools-api@7.7.2': 2408 | dependencies: 2409 | '@vue/devtools-kit': 7.7.2 2410 | 2411 | '@vue/devtools-kit@7.7.2': 2412 | dependencies: 2413 | '@vue/devtools-shared': 7.7.2 2414 | birpc: 0.2.19 2415 | hookable: 5.5.3 2416 | mitt: 3.0.1 2417 | perfect-debounce: 1.0.0 2418 | speakingurl: 14.0.1 2419 | superjson: 2.2.2 2420 | 2421 | '@vue/devtools-shared@7.7.2': 2422 | dependencies: 2423 | rfdc: 1.4.1 2424 | 2425 | '@vue/reactivity@3.5.13': 2426 | dependencies: 2427 | '@vue/shared': 3.5.13 2428 | 2429 | '@vue/runtime-core@3.5.13': 2430 | dependencies: 2431 | '@vue/reactivity': 3.5.13 2432 | '@vue/shared': 3.5.13 2433 | 2434 | '@vue/runtime-dom@3.5.13': 2435 | dependencies: 2436 | '@vue/reactivity': 3.5.13 2437 | '@vue/runtime-core': 3.5.13 2438 | '@vue/shared': 3.5.13 2439 | csstype: 3.1.3 2440 | 2441 | '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))': 2442 | dependencies: 2443 | '@vue/compiler-ssr': 3.5.13 2444 | '@vue/shared': 3.5.13 2445 | vue: 3.5.13(typescript@5.8.2) 2446 | 2447 | '@vue/shared@3.5.13': {} 2448 | 2449 | abab@2.0.6: {} 2450 | 2451 | acorn-globals@7.0.1: 2452 | dependencies: 2453 | acorn: 8.14.1 2454 | acorn-walk: 8.3.4 2455 | 2456 | acorn-walk@8.3.4: 2457 | dependencies: 2458 | acorn: 8.14.1 2459 | 2460 | acorn@8.14.1: {} 2461 | 2462 | agent-base@6.0.2: 2463 | dependencies: 2464 | debug: 4.4.0 2465 | transitivePeerDependencies: 2466 | - supports-color 2467 | 2468 | ansi-escapes@4.3.2: 2469 | dependencies: 2470 | type-fest: 0.21.3 2471 | 2472 | ansi-regex@5.0.1: {} 2473 | 2474 | ansi-regex@6.1.0: {} 2475 | 2476 | ansi-styles@4.3.0: 2477 | dependencies: 2478 | color-convert: 2.0.1 2479 | 2480 | ansi-styles@5.2.0: {} 2481 | 2482 | ansi-styles@6.2.1: {} 2483 | 2484 | any-promise@1.3.0: {} 2485 | 2486 | anymatch@3.1.3: 2487 | dependencies: 2488 | normalize-path: 3.0.0 2489 | picomatch: 2.3.1 2490 | 2491 | argparse@1.0.10: 2492 | dependencies: 2493 | sprintf-js: 1.0.3 2494 | 2495 | asynckit@0.4.0: {} 2496 | 2497 | babel-jest@29.7.0(@babel/core@7.26.9): 2498 | dependencies: 2499 | '@babel/core': 7.26.9 2500 | '@jest/transform': 29.7.0 2501 | '@types/babel__core': 7.20.5 2502 | babel-plugin-istanbul: 6.1.1 2503 | babel-preset-jest: 29.6.3(@babel/core@7.26.9) 2504 | chalk: 4.1.2 2505 | graceful-fs: 4.2.11 2506 | slash: 3.0.0 2507 | transitivePeerDependencies: 2508 | - supports-color 2509 | 2510 | babel-plugin-istanbul@6.1.1: 2511 | dependencies: 2512 | '@babel/helper-plugin-utils': 7.26.5 2513 | '@istanbuljs/load-nyc-config': 1.1.0 2514 | '@istanbuljs/schema': 0.1.3 2515 | istanbul-lib-instrument: 5.2.1 2516 | test-exclude: 6.0.0 2517 | transitivePeerDependencies: 2518 | - supports-color 2519 | 2520 | babel-plugin-jest-hoist@29.6.3: 2521 | dependencies: 2522 | '@babel/template': 7.26.9 2523 | '@babel/types': 7.26.9 2524 | '@types/babel__core': 7.20.5 2525 | '@types/babel__traverse': 7.20.6 2526 | 2527 | babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.9): 2528 | dependencies: 2529 | '@babel/core': 7.26.9 2530 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.9) 2531 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.9) 2532 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.9) 2533 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.9) 2534 | '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) 2535 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9) 2536 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.9) 2537 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.9) 2538 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) 2539 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.9) 2540 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.9) 2541 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.9) 2542 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) 2543 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.9) 2544 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.9) 2545 | 2546 | babel-preset-jest@29.6.3(@babel/core@7.26.9): 2547 | dependencies: 2548 | '@babel/core': 7.26.9 2549 | babel-plugin-jest-hoist: 29.6.3 2550 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) 2551 | 2552 | balanced-match@1.0.2: {} 2553 | 2554 | birpc@0.2.19: {} 2555 | 2556 | brace-expansion@1.1.11: 2557 | dependencies: 2558 | balanced-match: 1.0.2 2559 | concat-map: 0.0.1 2560 | 2561 | brace-expansion@2.0.1: 2562 | dependencies: 2563 | balanced-match: 1.0.2 2564 | 2565 | braces@3.0.3: 2566 | dependencies: 2567 | fill-range: 7.1.1 2568 | 2569 | browserslist@4.24.4: 2570 | dependencies: 2571 | caniuse-lite: 1.0.30001703 2572 | electron-to-chromium: 1.5.114 2573 | node-releases: 2.0.19 2574 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 2575 | 2576 | bser@2.1.1: 2577 | dependencies: 2578 | node-int64: 0.4.0 2579 | 2580 | buffer-from@1.1.2: {} 2581 | 2582 | call-bind-apply-helpers@1.0.2: 2583 | dependencies: 2584 | es-errors: 1.3.0 2585 | function-bind: 1.1.2 2586 | 2587 | callsites@3.1.0: {} 2588 | 2589 | camelcase@5.3.1: {} 2590 | 2591 | camelcase@6.3.0: {} 2592 | 2593 | caniuse-lite@1.0.30001703: {} 2594 | 2595 | chalk@4.1.2: 2596 | dependencies: 2597 | ansi-styles: 4.3.0 2598 | supports-color: 7.2.0 2599 | 2600 | char-regex@1.0.2: {} 2601 | 2602 | ci-info@3.9.0: {} 2603 | 2604 | cjs-module-lexer@1.4.3: {} 2605 | 2606 | cliui@8.0.1: 2607 | dependencies: 2608 | string-width: 4.2.3 2609 | strip-ansi: 6.0.1 2610 | wrap-ansi: 7.0.0 2611 | 2612 | co@4.6.0: {} 2613 | 2614 | collect-v8-coverage@1.0.2: {} 2615 | 2616 | color-convert@2.0.1: 2617 | dependencies: 2618 | color-name: 1.1.4 2619 | 2620 | color-name@1.1.4: {} 2621 | 2622 | combined-stream@1.0.8: 2623 | dependencies: 2624 | delayed-stream: 1.0.0 2625 | 2626 | commander@2.20.3: {} 2627 | 2628 | commander@4.1.1: {} 2629 | 2630 | concat-map@0.0.1: {} 2631 | 2632 | convert-source-map@2.0.0: {} 2633 | 2634 | copy-anything@3.0.5: 2635 | dependencies: 2636 | is-what: 4.1.16 2637 | 2638 | create-jest@29.7.0(@types/node@22.13.10): 2639 | dependencies: 2640 | '@jest/types': 29.6.3 2641 | chalk: 4.1.2 2642 | exit: 0.1.2 2643 | graceful-fs: 4.2.11 2644 | jest-config: 29.7.0(@types/node@22.13.10) 2645 | jest-util: 29.7.0 2646 | prompts: 2.4.2 2647 | transitivePeerDependencies: 2648 | - '@types/node' 2649 | - babel-plugin-macros 2650 | - supports-color 2651 | - ts-node 2652 | 2653 | cross-spawn@7.0.6: 2654 | dependencies: 2655 | path-key: 3.1.1 2656 | shebang-command: 2.0.0 2657 | which: 2.0.2 2658 | 2659 | cssom@0.3.8: {} 2660 | 2661 | cssom@0.5.0: {} 2662 | 2663 | cssstyle@2.3.0: 2664 | dependencies: 2665 | cssom: 0.3.8 2666 | 2667 | csstype@3.1.3: {} 2668 | 2669 | data-urls@3.0.2: 2670 | dependencies: 2671 | abab: 2.0.6 2672 | whatwg-mimetype: 3.0.0 2673 | whatwg-url: 11.0.0 2674 | 2675 | debug@4.4.0: 2676 | dependencies: 2677 | ms: 2.1.3 2678 | 2679 | decimal.js@10.5.0: {} 2680 | 2681 | dedent@1.5.3: {} 2682 | 2683 | deepmerge@4.3.1: {} 2684 | 2685 | delayed-stream@1.0.0: {} 2686 | 2687 | detect-newline@3.1.0: {} 2688 | 2689 | diff-sequences@29.6.3: {} 2690 | 2691 | domexception@4.0.0: 2692 | dependencies: 2693 | webidl-conversions: 7.0.0 2694 | 2695 | dunder-proto@1.0.1: 2696 | dependencies: 2697 | call-bind-apply-helpers: 1.0.2 2698 | es-errors: 1.3.0 2699 | gopd: 1.2.0 2700 | 2701 | eastasianwidth@0.2.0: {} 2702 | 2703 | electron-to-chromium@1.5.114: {} 2704 | 2705 | emittery@0.13.1: {} 2706 | 2707 | emoji-regex@8.0.0: {} 2708 | 2709 | emoji-regex@9.2.2: {} 2710 | 2711 | entities@4.5.0: {} 2712 | 2713 | error-ex@1.3.2: 2714 | dependencies: 2715 | is-arrayish: 0.2.1 2716 | 2717 | es-define-property@1.0.1: {} 2718 | 2719 | es-errors@1.3.0: {} 2720 | 2721 | es-object-atoms@1.1.1: 2722 | dependencies: 2723 | es-errors: 1.3.0 2724 | 2725 | es-set-tostringtag@2.1.0: 2726 | dependencies: 2727 | es-errors: 1.3.0 2728 | get-intrinsic: 1.3.0 2729 | has-tostringtag: 1.0.2 2730 | hasown: 2.0.2 2731 | 2732 | escalade@3.2.0: {} 2733 | 2734 | escape-string-regexp@2.0.0: {} 2735 | 2736 | escodegen@2.1.0: 2737 | dependencies: 2738 | esprima: 4.0.1 2739 | estraverse: 5.3.0 2740 | esutils: 2.0.3 2741 | optionalDependencies: 2742 | source-map: 0.6.1 2743 | 2744 | esprima@4.0.1: {} 2745 | 2746 | estraverse@5.3.0: {} 2747 | 2748 | estree-walker@2.0.2: {} 2749 | 2750 | esutils@2.0.3: {} 2751 | 2752 | execa@5.1.1: 2753 | dependencies: 2754 | cross-spawn: 7.0.6 2755 | get-stream: 6.0.1 2756 | human-signals: 2.1.0 2757 | is-stream: 2.0.1 2758 | merge-stream: 2.0.0 2759 | npm-run-path: 4.0.1 2760 | onetime: 5.1.2 2761 | signal-exit: 3.0.7 2762 | strip-final-newline: 2.0.0 2763 | 2764 | exit@0.1.2: {} 2765 | 2766 | expect@29.7.0: 2767 | dependencies: 2768 | '@jest/expect-utils': 29.7.0 2769 | jest-get-type: 29.6.3 2770 | jest-matcher-utils: 29.7.0 2771 | jest-message-util: 29.7.0 2772 | jest-util: 29.7.0 2773 | 2774 | fast-json-stable-stringify@2.1.0: {} 2775 | 2776 | fb-watchman@2.0.2: 2777 | dependencies: 2778 | bser: 2.1.1 2779 | 2780 | fill-range@7.1.1: 2781 | dependencies: 2782 | to-regex-range: 5.0.1 2783 | 2784 | find-up@4.1.0: 2785 | dependencies: 2786 | locate-path: 5.0.0 2787 | path-exists: 4.0.0 2788 | 2789 | foreground-child@3.3.1: 2790 | dependencies: 2791 | cross-spawn: 7.0.6 2792 | signal-exit: 4.1.0 2793 | 2794 | form-data@4.0.2: 2795 | dependencies: 2796 | asynckit: 0.4.0 2797 | combined-stream: 1.0.8 2798 | es-set-tostringtag: 2.1.0 2799 | mime-types: 2.1.35 2800 | 2801 | fs.realpath@1.0.0: {} 2802 | 2803 | fsevents@2.3.3: 2804 | optional: true 2805 | 2806 | function-bind@1.1.2: {} 2807 | 2808 | gensync@1.0.0-beta.2: {} 2809 | 2810 | get-caller-file@2.0.5: {} 2811 | 2812 | get-intrinsic@1.3.0: 2813 | dependencies: 2814 | call-bind-apply-helpers: 1.0.2 2815 | es-define-property: 1.0.1 2816 | es-errors: 1.3.0 2817 | es-object-atoms: 1.1.1 2818 | function-bind: 1.1.2 2819 | get-proto: 1.0.1 2820 | gopd: 1.2.0 2821 | has-symbols: 1.1.0 2822 | hasown: 2.0.2 2823 | math-intrinsics: 1.1.0 2824 | 2825 | get-package-type@0.1.0: {} 2826 | 2827 | get-proto@1.0.1: 2828 | dependencies: 2829 | dunder-proto: 1.0.1 2830 | es-object-atoms: 1.1.1 2831 | 2832 | get-stream@6.0.1: {} 2833 | 2834 | glob@10.4.5: 2835 | dependencies: 2836 | foreground-child: 3.3.1 2837 | jackspeak: 3.4.3 2838 | minimatch: 9.0.5 2839 | minipass: 7.1.2 2840 | package-json-from-dist: 1.0.1 2841 | path-scurry: 1.11.1 2842 | 2843 | glob@11.0.1: 2844 | dependencies: 2845 | foreground-child: 3.3.1 2846 | jackspeak: 4.1.0 2847 | minimatch: 10.0.1 2848 | minipass: 7.1.2 2849 | package-json-from-dist: 1.0.1 2850 | path-scurry: 2.0.0 2851 | 2852 | glob@7.2.3: 2853 | dependencies: 2854 | fs.realpath: 1.0.0 2855 | inflight: 1.0.6 2856 | inherits: 2.0.4 2857 | minimatch: 3.1.2 2858 | once: 1.4.0 2859 | path-is-absolute: 1.0.1 2860 | 2861 | globals@11.12.0: {} 2862 | 2863 | gopd@1.2.0: {} 2864 | 2865 | graceful-fs@4.2.11: {} 2866 | 2867 | has-flag@4.0.0: {} 2868 | 2869 | has-symbols@1.1.0: {} 2870 | 2871 | has-tostringtag@1.0.2: 2872 | dependencies: 2873 | has-symbols: 1.1.0 2874 | 2875 | hasown@2.0.2: 2876 | dependencies: 2877 | function-bind: 1.1.2 2878 | 2879 | hookable@5.5.3: {} 2880 | 2881 | html-encoding-sniffer@3.0.0: 2882 | dependencies: 2883 | whatwg-encoding: 2.0.0 2884 | 2885 | html-escaper@2.0.2: {} 2886 | 2887 | http-proxy-agent@5.0.0: 2888 | dependencies: 2889 | '@tootallnate/once': 2.0.0 2890 | agent-base: 6.0.2 2891 | debug: 4.4.0 2892 | transitivePeerDependencies: 2893 | - supports-color 2894 | 2895 | https-proxy-agent@5.0.1: 2896 | dependencies: 2897 | agent-base: 6.0.2 2898 | debug: 4.4.0 2899 | transitivePeerDependencies: 2900 | - supports-color 2901 | 2902 | human-signals@2.1.0: {} 2903 | 2904 | iconv-lite@0.6.3: 2905 | dependencies: 2906 | safer-buffer: 2.1.2 2907 | 2908 | import-local@3.2.0: 2909 | dependencies: 2910 | pkg-dir: 4.2.0 2911 | resolve-cwd: 3.0.0 2912 | 2913 | imurmurhash@0.1.4: {} 2914 | 2915 | inflight@1.0.6: 2916 | dependencies: 2917 | once: 1.4.0 2918 | wrappy: 1.0.2 2919 | 2920 | inherits@2.0.4: {} 2921 | 2922 | is-arrayish@0.2.1: {} 2923 | 2924 | is-core-module@2.16.1: 2925 | dependencies: 2926 | hasown: 2.0.2 2927 | 2928 | is-fullwidth-code-point@3.0.0: {} 2929 | 2930 | is-generator-fn@2.1.0: {} 2931 | 2932 | is-number@7.0.0: {} 2933 | 2934 | is-potential-custom-element-name@1.0.1: {} 2935 | 2936 | is-stream@2.0.1: {} 2937 | 2938 | is-what@4.1.16: {} 2939 | 2940 | isexe@2.0.0: {} 2941 | 2942 | istanbul-lib-coverage@3.2.2: {} 2943 | 2944 | istanbul-lib-instrument@5.2.1: 2945 | dependencies: 2946 | '@babel/core': 7.26.9 2947 | '@babel/parser': 7.26.9 2948 | '@istanbuljs/schema': 0.1.3 2949 | istanbul-lib-coverage: 3.2.2 2950 | semver: 6.3.1 2951 | transitivePeerDependencies: 2952 | - supports-color 2953 | 2954 | istanbul-lib-instrument@6.0.3: 2955 | dependencies: 2956 | '@babel/core': 7.26.9 2957 | '@babel/parser': 7.26.9 2958 | '@istanbuljs/schema': 0.1.3 2959 | istanbul-lib-coverage: 3.2.2 2960 | semver: 7.7.1 2961 | transitivePeerDependencies: 2962 | - supports-color 2963 | 2964 | istanbul-lib-report@3.0.1: 2965 | dependencies: 2966 | istanbul-lib-coverage: 3.2.2 2967 | make-dir: 4.0.0 2968 | supports-color: 7.2.0 2969 | 2970 | istanbul-lib-source-maps@4.0.1: 2971 | dependencies: 2972 | debug: 4.4.0 2973 | istanbul-lib-coverage: 3.2.2 2974 | source-map: 0.6.1 2975 | transitivePeerDependencies: 2976 | - supports-color 2977 | 2978 | istanbul-reports@3.1.7: 2979 | dependencies: 2980 | html-escaper: 2.0.2 2981 | istanbul-lib-report: 3.0.1 2982 | 2983 | jackspeak@3.4.3: 2984 | dependencies: 2985 | '@isaacs/cliui': 8.0.2 2986 | optionalDependencies: 2987 | '@pkgjs/parseargs': 0.11.0 2988 | 2989 | jackspeak@4.1.0: 2990 | dependencies: 2991 | '@isaacs/cliui': 8.0.2 2992 | 2993 | jest-changed-files@29.7.0: 2994 | dependencies: 2995 | execa: 5.1.1 2996 | jest-util: 29.7.0 2997 | p-limit: 3.1.0 2998 | 2999 | jest-circus@29.7.0: 3000 | dependencies: 3001 | '@jest/environment': 29.7.0 3002 | '@jest/expect': 29.7.0 3003 | '@jest/test-result': 29.7.0 3004 | '@jest/types': 29.6.3 3005 | '@types/node': 22.13.10 3006 | chalk: 4.1.2 3007 | co: 4.6.0 3008 | dedent: 1.5.3 3009 | is-generator-fn: 2.1.0 3010 | jest-each: 29.7.0 3011 | jest-matcher-utils: 29.7.0 3012 | jest-message-util: 29.7.0 3013 | jest-runtime: 29.7.0 3014 | jest-snapshot: 29.7.0 3015 | jest-util: 29.7.0 3016 | p-limit: 3.1.0 3017 | pretty-format: 29.7.0 3018 | pure-rand: 6.1.0 3019 | slash: 3.0.0 3020 | stack-utils: 2.0.6 3021 | transitivePeerDependencies: 3022 | - babel-plugin-macros 3023 | - supports-color 3024 | 3025 | jest-cli@29.7.0(@types/node@22.13.10): 3026 | dependencies: 3027 | '@jest/core': 29.7.0 3028 | '@jest/test-result': 29.7.0 3029 | '@jest/types': 29.6.3 3030 | chalk: 4.1.2 3031 | create-jest: 29.7.0(@types/node@22.13.10) 3032 | exit: 0.1.2 3033 | import-local: 3.2.0 3034 | jest-config: 29.7.0(@types/node@22.13.10) 3035 | jest-util: 29.7.0 3036 | jest-validate: 29.7.0 3037 | yargs: 17.7.2 3038 | transitivePeerDependencies: 3039 | - '@types/node' 3040 | - babel-plugin-macros 3041 | - supports-color 3042 | - ts-node 3043 | 3044 | jest-config@29.7.0(@types/node@22.13.10): 3045 | dependencies: 3046 | '@babel/core': 7.26.9 3047 | '@jest/test-sequencer': 29.7.0 3048 | '@jest/types': 29.6.3 3049 | babel-jest: 29.7.0(@babel/core@7.26.9) 3050 | chalk: 4.1.2 3051 | ci-info: 3.9.0 3052 | deepmerge: 4.3.1 3053 | glob: 7.2.3 3054 | graceful-fs: 4.2.11 3055 | jest-circus: 29.7.0 3056 | jest-environment-node: 29.7.0 3057 | jest-get-type: 29.6.3 3058 | jest-regex-util: 29.6.3 3059 | jest-resolve: 29.7.0 3060 | jest-runner: 29.7.0 3061 | jest-util: 29.7.0 3062 | jest-validate: 29.7.0 3063 | micromatch: 4.0.8 3064 | parse-json: 5.2.0 3065 | pretty-format: 29.7.0 3066 | slash: 3.0.0 3067 | strip-json-comments: 3.1.1 3068 | optionalDependencies: 3069 | '@types/node': 22.13.10 3070 | transitivePeerDependencies: 3071 | - babel-plugin-macros 3072 | - supports-color 3073 | 3074 | jest-diff@29.7.0: 3075 | dependencies: 3076 | chalk: 4.1.2 3077 | diff-sequences: 29.6.3 3078 | jest-get-type: 29.6.3 3079 | pretty-format: 29.7.0 3080 | 3081 | jest-docblock@29.7.0: 3082 | dependencies: 3083 | detect-newline: 3.1.0 3084 | 3085 | jest-each@29.7.0: 3086 | dependencies: 3087 | '@jest/types': 29.6.3 3088 | chalk: 4.1.2 3089 | jest-get-type: 29.6.3 3090 | jest-util: 29.7.0 3091 | pretty-format: 29.7.0 3092 | 3093 | jest-environment-jsdom@29.7.0: 3094 | dependencies: 3095 | '@jest/environment': 29.7.0 3096 | '@jest/fake-timers': 29.7.0 3097 | '@jest/types': 29.6.3 3098 | '@types/jsdom': 20.0.1 3099 | '@types/node': 22.13.10 3100 | jest-mock: 29.7.0 3101 | jest-util: 29.7.0 3102 | jsdom: 20.0.3 3103 | transitivePeerDependencies: 3104 | - bufferutil 3105 | - supports-color 3106 | - utf-8-validate 3107 | 3108 | jest-environment-node@29.7.0: 3109 | dependencies: 3110 | '@jest/environment': 29.7.0 3111 | '@jest/fake-timers': 29.7.0 3112 | '@jest/types': 29.6.3 3113 | '@types/node': 22.13.10 3114 | jest-mock: 29.7.0 3115 | jest-util: 29.7.0 3116 | 3117 | jest-get-type@29.6.3: {} 3118 | 3119 | jest-haste-map@29.7.0: 3120 | dependencies: 3121 | '@jest/types': 29.6.3 3122 | '@types/graceful-fs': 4.1.9 3123 | '@types/node': 22.13.10 3124 | anymatch: 3.1.3 3125 | fb-watchman: 2.0.2 3126 | graceful-fs: 4.2.11 3127 | jest-regex-util: 29.6.3 3128 | jest-util: 29.7.0 3129 | jest-worker: 29.7.0 3130 | micromatch: 4.0.8 3131 | walker: 1.0.8 3132 | optionalDependencies: 3133 | fsevents: 2.3.3 3134 | 3135 | jest-leak-detector@29.7.0: 3136 | dependencies: 3137 | jest-get-type: 29.6.3 3138 | pretty-format: 29.7.0 3139 | 3140 | jest-matcher-utils@29.7.0: 3141 | dependencies: 3142 | chalk: 4.1.2 3143 | jest-diff: 29.7.0 3144 | jest-get-type: 29.6.3 3145 | pretty-format: 29.7.0 3146 | 3147 | jest-message-util@29.7.0: 3148 | dependencies: 3149 | '@babel/code-frame': 7.26.2 3150 | '@jest/types': 29.6.3 3151 | '@types/stack-utils': 2.0.3 3152 | chalk: 4.1.2 3153 | graceful-fs: 4.2.11 3154 | micromatch: 4.0.8 3155 | pretty-format: 29.7.0 3156 | slash: 3.0.0 3157 | stack-utils: 2.0.6 3158 | 3159 | jest-mock@29.7.0: 3160 | dependencies: 3161 | '@jest/types': 29.6.3 3162 | '@types/node': 22.13.10 3163 | jest-util: 29.7.0 3164 | 3165 | jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 3166 | optionalDependencies: 3167 | jest-resolve: 29.7.0 3168 | 3169 | jest-regex-util@29.6.3: {} 3170 | 3171 | jest-resolve-dependencies@29.7.0: 3172 | dependencies: 3173 | jest-regex-util: 29.6.3 3174 | jest-snapshot: 29.7.0 3175 | transitivePeerDependencies: 3176 | - supports-color 3177 | 3178 | jest-resolve@29.7.0: 3179 | dependencies: 3180 | chalk: 4.1.2 3181 | graceful-fs: 4.2.11 3182 | jest-haste-map: 29.7.0 3183 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 3184 | jest-util: 29.7.0 3185 | jest-validate: 29.7.0 3186 | resolve: 1.22.10 3187 | resolve.exports: 2.0.3 3188 | slash: 3.0.0 3189 | 3190 | jest-runner@29.7.0: 3191 | dependencies: 3192 | '@jest/console': 29.7.0 3193 | '@jest/environment': 29.7.0 3194 | '@jest/test-result': 29.7.0 3195 | '@jest/transform': 29.7.0 3196 | '@jest/types': 29.6.3 3197 | '@types/node': 22.13.10 3198 | chalk: 4.1.2 3199 | emittery: 0.13.1 3200 | graceful-fs: 4.2.11 3201 | jest-docblock: 29.7.0 3202 | jest-environment-node: 29.7.0 3203 | jest-haste-map: 29.7.0 3204 | jest-leak-detector: 29.7.0 3205 | jest-message-util: 29.7.0 3206 | jest-resolve: 29.7.0 3207 | jest-runtime: 29.7.0 3208 | jest-util: 29.7.0 3209 | jest-watcher: 29.7.0 3210 | jest-worker: 29.7.0 3211 | p-limit: 3.1.0 3212 | source-map-support: 0.5.13 3213 | transitivePeerDependencies: 3214 | - supports-color 3215 | 3216 | jest-runtime@29.7.0: 3217 | dependencies: 3218 | '@jest/environment': 29.7.0 3219 | '@jest/fake-timers': 29.7.0 3220 | '@jest/globals': 29.7.0 3221 | '@jest/source-map': 29.6.3 3222 | '@jest/test-result': 29.7.0 3223 | '@jest/transform': 29.7.0 3224 | '@jest/types': 29.6.3 3225 | '@types/node': 22.13.10 3226 | chalk: 4.1.2 3227 | cjs-module-lexer: 1.4.3 3228 | collect-v8-coverage: 1.0.2 3229 | glob: 7.2.3 3230 | graceful-fs: 4.2.11 3231 | jest-haste-map: 29.7.0 3232 | jest-message-util: 29.7.0 3233 | jest-mock: 29.7.0 3234 | jest-regex-util: 29.6.3 3235 | jest-resolve: 29.7.0 3236 | jest-snapshot: 29.7.0 3237 | jest-util: 29.7.0 3238 | slash: 3.0.0 3239 | strip-bom: 4.0.0 3240 | transitivePeerDependencies: 3241 | - supports-color 3242 | 3243 | jest-snapshot@29.7.0: 3244 | dependencies: 3245 | '@babel/core': 7.26.9 3246 | '@babel/generator': 7.26.9 3247 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) 3248 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) 3249 | '@babel/types': 7.26.9 3250 | '@jest/expect-utils': 29.7.0 3251 | '@jest/transform': 29.7.0 3252 | '@jest/types': 29.6.3 3253 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) 3254 | chalk: 4.1.2 3255 | expect: 29.7.0 3256 | graceful-fs: 4.2.11 3257 | jest-diff: 29.7.0 3258 | jest-get-type: 29.6.3 3259 | jest-matcher-utils: 29.7.0 3260 | jest-message-util: 29.7.0 3261 | jest-util: 29.7.0 3262 | natural-compare: 1.4.0 3263 | pretty-format: 29.7.0 3264 | semver: 7.7.1 3265 | transitivePeerDependencies: 3266 | - supports-color 3267 | 3268 | jest-util@29.7.0: 3269 | dependencies: 3270 | '@jest/types': 29.6.3 3271 | '@types/node': 22.13.10 3272 | chalk: 4.1.2 3273 | ci-info: 3.9.0 3274 | graceful-fs: 4.2.11 3275 | picomatch: 2.3.1 3276 | 3277 | jest-validate@29.7.0: 3278 | dependencies: 3279 | '@jest/types': 29.6.3 3280 | camelcase: 6.3.0 3281 | chalk: 4.1.2 3282 | jest-get-type: 29.6.3 3283 | leven: 3.1.0 3284 | pretty-format: 29.7.0 3285 | 3286 | jest-watcher@29.7.0: 3287 | dependencies: 3288 | '@jest/test-result': 29.7.0 3289 | '@jest/types': 29.6.3 3290 | '@types/node': 22.13.10 3291 | ansi-escapes: 4.3.2 3292 | chalk: 4.1.2 3293 | emittery: 0.13.1 3294 | jest-util: 29.7.0 3295 | string-length: 4.0.2 3296 | 3297 | jest-worker@29.7.0: 3298 | dependencies: 3299 | '@types/node': 22.13.10 3300 | jest-util: 29.7.0 3301 | merge-stream: 2.0.0 3302 | supports-color: 8.1.1 3303 | 3304 | jest@29.7.0(@types/node@22.13.10): 3305 | dependencies: 3306 | '@jest/core': 29.7.0 3307 | '@jest/types': 29.6.3 3308 | import-local: 3.2.0 3309 | jest-cli: 29.7.0(@types/node@22.13.10) 3310 | transitivePeerDependencies: 3311 | - '@types/node' 3312 | - babel-plugin-macros 3313 | - supports-color 3314 | - ts-node 3315 | 3316 | js-tokens@4.0.0: {} 3317 | 3318 | js-yaml@3.14.1: 3319 | dependencies: 3320 | argparse: 1.0.10 3321 | esprima: 4.0.1 3322 | 3323 | jsdom@20.0.3: 3324 | dependencies: 3325 | abab: 2.0.6 3326 | acorn: 8.14.1 3327 | acorn-globals: 7.0.1 3328 | cssom: 0.5.0 3329 | cssstyle: 2.3.0 3330 | data-urls: 3.0.2 3331 | decimal.js: 10.5.0 3332 | domexception: 4.0.0 3333 | escodegen: 2.1.0 3334 | form-data: 4.0.2 3335 | html-encoding-sniffer: 3.0.0 3336 | http-proxy-agent: 5.0.0 3337 | https-proxy-agent: 5.0.1 3338 | is-potential-custom-element-name: 1.0.1 3339 | nwsapi: 2.2.18 3340 | parse5: 7.2.1 3341 | saxes: 6.0.0 3342 | symbol-tree: 3.2.4 3343 | tough-cookie: 4.1.4 3344 | w3c-xmlserializer: 4.0.0 3345 | webidl-conversions: 7.0.0 3346 | whatwg-encoding: 2.0.0 3347 | whatwg-mimetype: 3.0.0 3348 | whatwg-url: 11.0.0 3349 | ws: 8.18.1 3350 | xml-name-validator: 4.0.0 3351 | transitivePeerDependencies: 3352 | - bufferutil 3353 | - supports-color 3354 | - utf-8-validate 3355 | 3356 | jsesc@3.1.0: {} 3357 | 3358 | json-parse-even-better-errors@2.3.1: {} 3359 | 3360 | json5@2.2.3: {} 3361 | 3362 | kleur@3.0.3: {} 3363 | 3364 | leven@3.1.0: {} 3365 | 3366 | lines-and-columns@1.2.4: {} 3367 | 3368 | locate-path@5.0.0: 3369 | dependencies: 3370 | p-locate: 4.1.0 3371 | 3372 | lru-cache@10.4.3: {} 3373 | 3374 | lru-cache@11.0.2: {} 3375 | 3376 | lru-cache@5.1.1: 3377 | dependencies: 3378 | yallist: 3.1.1 3379 | 3380 | magic-string@0.30.17: 3381 | dependencies: 3382 | '@jridgewell/sourcemap-codec': 1.5.0 3383 | 3384 | make-dir@4.0.0: 3385 | dependencies: 3386 | semver: 7.7.1 3387 | 3388 | makeerror@1.0.12: 3389 | dependencies: 3390 | tmpl: 1.0.5 3391 | 3392 | math-intrinsics@1.1.0: {} 3393 | 3394 | merge-stream@2.0.0: {} 3395 | 3396 | micromatch@4.0.8: 3397 | dependencies: 3398 | braces: 3.0.3 3399 | picomatch: 2.3.1 3400 | 3401 | mime-db@1.52.0: {} 3402 | 3403 | mime-types@2.1.35: 3404 | dependencies: 3405 | mime-db: 1.52.0 3406 | 3407 | mimic-fn@2.1.0: {} 3408 | 3409 | minimatch@10.0.1: 3410 | dependencies: 3411 | brace-expansion: 2.0.1 3412 | 3413 | minimatch@3.1.2: 3414 | dependencies: 3415 | brace-expansion: 1.1.11 3416 | 3417 | minimatch@9.0.5: 3418 | dependencies: 3419 | brace-expansion: 2.0.1 3420 | 3421 | minipass@7.1.2: {} 3422 | 3423 | mitt@3.0.1: {} 3424 | 3425 | ms@2.1.3: {} 3426 | 3427 | mz@2.7.0: 3428 | dependencies: 3429 | any-promise: 1.3.0 3430 | object-assign: 4.1.1 3431 | thenify-all: 1.6.0 3432 | 3433 | nanoid@3.3.9: {} 3434 | 3435 | natural-compare@1.4.0: {} 3436 | 3437 | node-int64@0.4.0: {} 3438 | 3439 | node-releases@2.0.19: {} 3440 | 3441 | normalize-path@3.0.0: {} 3442 | 3443 | npm-run-path@4.0.1: 3444 | dependencies: 3445 | path-key: 3.1.1 3446 | 3447 | nwsapi@2.2.18: {} 3448 | 3449 | object-assign@4.1.1: {} 3450 | 3451 | once@1.4.0: 3452 | dependencies: 3453 | wrappy: 1.0.2 3454 | 3455 | onetime@5.1.2: 3456 | dependencies: 3457 | mimic-fn: 2.1.0 3458 | 3459 | p-limit@2.3.0: 3460 | dependencies: 3461 | p-try: 2.2.0 3462 | 3463 | p-limit@3.1.0: 3464 | dependencies: 3465 | yocto-queue: 0.1.0 3466 | 3467 | p-locate@4.1.0: 3468 | dependencies: 3469 | p-limit: 2.3.0 3470 | 3471 | p-try@2.2.0: {} 3472 | 3473 | package-json-from-dist@1.0.1: {} 3474 | 3475 | parse-json@5.2.0: 3476 | dependencies: 3477 | '@babel/code-frame': 7.26.2 3478 | error-ex: 1.3.2 3479 | json-parse-even-better-errors: 2.3.1 3480 | lines-and-columns: 1.2.4 3481 | 3482 | parse5@7.2.1: 3483 | dependencies: 3484 | entities: 4.5.0 3485 | 3486 | path-exists@4.0.0: {} 3487 | 3488 | path-is-absolute@1.0.1: {} 3489 | 3490 | path-key@3.1.1: {} 3491 | 3492 | path-parse@1.0.7: {} 3493 | 3494 | path-scurry@1.11.1: 3495 | dependencies: 3496 | lru-cache: 10.4.3 3497 | minipass: 7.1.2 3498 | 3499 | path-scurry@2.0.0: 3500 | dependencies: 3501 | lru-cache: 11.0.2 3502 | minipass: 7.1.2 3503 | 3504 | perfect-debounce@1.0.0: {} 3505 | 3506 | picocolors@1.1.1: {} 3507 | 3508 | picomatch@2.3.1: {} 3509 | 3510 | picomatch@4.0.2: {} 3511 | 3512 | pinia@3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)): 3513 | dependencies: 3514 | '@vue/devtools-api': 7.7.2 3515 | vue: 3.5.13(typescript@5.8.2) 3516 | optionalDependencies: 3517 | typescript: 5.8.2 3518 | 3519 | pirates@4.0.6: {} 3520 | 3521 | pkg-dir@4.2.0: 3522 | dependencies: 3523 | find-up: 4.1.0 3524 | 3525 | postcss@8.5.3: 3526 | dependencies: 3527 | nanoid: 3.3.9 3528 | picocolors: 1.1.1 3529 | source-map-js: 1.2.1 3530 | 3531 | prettier@3.5.3: {} 3532 | 3533 | pretty-format@29.7.0: 3534 | dependencies: 3535 | '@jest/schemas': 29.6.3 3536 | ansi-styles: 5.2.0 3537 | react-is: 18.3.1 3538 | 3539 | prompts@2.4.2: 3540 | dependencies: 3541 | kleur: 3.0.3 3542 | sisteransi: 1.0.5 3543 | 3544 | psl@1.15.0: 3545 | dependencies: 3546 | punycode: 2.3.1 3547 | 3548 | punycode@2.3.1: {} 3549 | 3550 | pure-rand@6.1.0: {} 3551 | 3552 | querystringify@2.2.0: {} 3553 | 3554 | randombytes@2.1.0: 3555 | dependencies: 3556 | safe-buffer: 5.2.1 3557 | 3558 | react-is@18.3.1: {} 3559 | 3560 | require-directory@2.1.1: {} 3561 | 3562 | requires-port@1.0.0: {} 3563 | 3564 | resolve-cwd@3.0.0: 3565 | dependencies: 3566 | resolve-from: 5.0.0 3567 | 3568 | resolve-from@5.0.0: {} 3569 | 3570 | resolve.exports@2.0.3: {} 3571 | 3572 | resolve@1.22.10: 3573 | dependencies: 3574 | is-core-module: 2.16.1 3575 | path-parse: 1.0.7 3576 | supports-preserve-symlinks-flag: 1.0.0 3577 | 3578 | rfdc@1.4.1: {} 3579 | 3580 | rimraf@6.0.1: 3581 | dependencies: 3582 | glob: 11.0.1 3583 | package-json-from-dist: 1.0.1 3584 | 3585 | rollup@4.35.0: 3586 | dependencies: 3587 | '@types/estree': 1.0.6 3588 | optionalDependencies: 3589 | '@rollup/rollup-android-arm-eabi': 4.35.0 3590 | '@rollup/rollup-android-arm64': 4.35.0 3591 | '@rollup/rollup-darwin-arm64': 4.35.0 3592 | '@rollup/rollup-darwin-x64': 4.35.0 3593 | '@rollup/rollup-freebsd-arm64': 4.35.0 3594 | '@rollup/rollup-freebsd-x64': 4.35.0 3595 | '@rollup/rollup-linux-arm-gnueabihf': 4.35.0 3596 | '@rollup/rollup-linux-arm-musleabihf': 4.35.0 3597 | '@rollup/rollup-linux-arm64-gnu': 4.35.0 3598 | '@rollup/rollup-linux-arm64-musl': 4.35.0 3599 | '@rollup/rollup-linux-loongarch64-gnu': 4.35.0 3600 | '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0 3601 | '@rollup/rollup-linux-riscv64-gnu': 4.35.0 3602 | '@rollup/rollup-linux-s390x-gnu': 4.35.0 3603 | '@rollup/rollup-linux-x64-gnu': 4.35.0 3604 | '@rollup/rollup-linux-x64-musl': 4.35.0 3605 | '@rollup/rollup-win32-arm64-msvc': 4.35.0 3606 | '@rollup/rollup-win32-ia32-msvc': 4.35.0 3607 | '@rollup/rollup-win32-x64-msvc': 4.35.0 3608 | fsevents: 2.3.3 3609 | 3610 | safe-buffer@5.2.1: {} 3611 | 3612 | safer-buffer@2.1.2: {} 3613 | 3614 | saxes@6.0.0: 3615 | dependencies: 3616 | xmlchars: 2.2.0 3617 | 3618 | semver@6.3.1: {} 3619 | 3620 | semver@7.7.1: {} 3621 | 3622 | serialize-javascript@6.0.2: 3623 | dependencies: 3624 | randombytes: 2.1.0 3625 | 3626 | shebang-command@2.0.0: 3627 | dependencies: 3628 | shebang-regex: 3.0.0 3629 | 3630 | shebang-regex@3.0.0: {} 3631 | 3632 | signal-exit@3.0.7: {} 3633 | 3634 | signal-exit@4.1.0: {} 3635 | 3636 | sisteransi@1.0.5: {} 3637 | 3638 | slash@3.0.0: {} 3639 | 3640 | smob@1.5.0: {} 3641 | 3642 | source-map-js@1.2.1: {} 3643 | 3644 | source-map-support@0.5.13: 3645 | dependencies: 3646 | buffer-from: 1.1.2 3647 | source-map: 0.6.1 3648 | 3649 | source-map-support@0.5.21: 3650 | dependencies: 3651 | buffer-from: 1.1.2 3652 | source-map: 0.6.1 3653 | 3654 | source-map@0.6.1: {} 3655 | 3656 | speakingurl@14.0.1: {} 3657 | 3658 | sprintf-js@1.0.3: {} 3659 | 3660 | stack-utils@2.0.6: 3661 | dependencies: 3662 | escape-string-regexp: 2.0.0 3663 | 3664 | string-length@4.0.2: 3665 | dependencies: 3666 | char-regex: 1.0.2 3667 | strip-ansi: 6.0.1 3668 | 3669 | string-width@4.2.3: 3670 | dependencies: 3671 | emoji-regex: 8.0.0 3672 | is-fullwidth-code-point: 3.0.0 3673 | strip-ansi: 6.0.1 3674 | 3675 | string-width@5.1.2: 3676 | dependencies: 3677 | eastasianwidth: 0.2.0 3678 | emoji-regex: 9.2.2 3679 | strip-ansi: 7.1.0 3680 | 3681 | strip-ansi@6.0.1: 3682 | dependencies: 3683 | ansi-regex: 5.0.1 3684 | 3685 | strip-ansi@7.1.0: 3686 | dependencies: 3687 | ansi-regex: 6.1.0 3688 | 3689 | strip-bom@4.0.0: {} 3690 | 3691 | strip-final-newline@2.0.0: {} 3692 | 3693 | strip-json-comments@3.1.1: {} 3694 | 3695 | sucrase@3.35.0: 3696 | dependencies: 3697 | '@jridgewell/gen-mapping': 0.3.8 3698 | commander: 4.1.1 3699 | glob: 10.4.5 3700 | lines-and-columns: 1.2.4 3701 | mz: 2.7.0 3702 | pirates: 4.0.6 3703 | ts-interface-checker: 0.1.13 3704 | 3705 | superjson@2.2.2: 3706 | dependencies: 3707 | copy-anything: 3.0.5 3708 | 3709 | supports-color@7.2.0: 3710 | dependencies: 3711 | has-flag: 4.0.0 3712 | 3713 | supports-color@8.1.1: 3714 | dependencies: 3715 | has-flag: 4.0.0 3716 | 3717 | supports-preserve-symlinks-flag@1.0.0: {} 3718 | 3719 | symbol-tree@3.2.4: {} 3720 | 3721 | terser@5.39.0: 3722 | dependencies: 3723 | '@jridgewell/source-map': 0.3.6 3724 | acorn: 8.14.1 3725 | commander: 2.20.3 3726 | source-map-support: 0.5.21 3727 | 3728 | test-exclude@6.0.0: 3729 | dependencies: 3730 | '@istanbuljs/schema': 0.1.3 3731 | glob: 7.2.3 3732 | minimatch: 3.1.2 3733 | 3734 | thenify-all@1.6.0: 3735 | dependencies: 3736 | thenify: 3.3.1 3737 | 3738 | thenify@3.3.1: 3739 | dependencies: 3740 | any-promise: 1.3.0 3741 | 3742 | tmpl@1.0.5: {} 3743 | 3744 | to-regex-range@5.0.1: 3745 | dependencies: 3746 | is-number: 7.0.0 3747 | 3748 | tough-cookie@4.1.4: 3749 | dependencies: 3750 | psl: 1.15.0 3751 | punycode: 2.3.1 3752 | universalify: 0.2.0 3753 | url-parse: 1.5.10 3754 | 3755 | tr46@3.0.0: 3756 | dependencies: 3757 | punycode: 2.3.1 3758 | 3759 | ts-interface-checker@0.1.13: {} 3760 | 3761 | tslib@2.8.1: {} 3762 | 3763 | type-detect@4.0.8: {} 3764 | 3765 | type-fest@0.21.3: {} 3766 | 3767 | typescript@5.8.2: {} 3768 | 3769 | undici-types@6.20.0: {} 3770 | 3771 | universalify@0.2.0: {} 3772 | 3773 | update-browserslist-db@1.1.3(browserslist@4.24.4): 3774 | dependencies: 3775 | browserslist: 4.24.4 3776 | escalade: 3.2.0 3777 | picocolors: 1.1.1 3778 | 3779 | url-parse@1.5.10: 3780 | dependencies: 3781 | querystringify: 2.2.0 3782 | requires-port: 1.0.0 3783 | 3784 | v8-to-istanbul@9.3.0: 3785 | dependencies: 3786 | '@jridgewell/trace-mapping': 0.3.25 3787 | '@types/istanbul-lib-coverage': 2.0.6 3788 | convert-source-map: 2.0.0 3789 | 3790 | vue@3.5.13(typescript@5.8.2): 3791 | dependencies: 3792 | '@vue/compiler-dom': 3.5.13 3793 | '@vue/compiler-sfc': 3.5.13 3794 | '@vue/runtime-dom': 3.5.13 3795 | '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.2)) 3796 | '@vue/shared': 3.5.13 3797 | optionalDependencies: 3798 | typescript: 5.8.2 3799 | 3800 | w3c-xmlserializer@4.0.0: 3801 | dependencies: 3802 | xml-name-validator: 4.0.0 3803 | 3804 | walker@1.0.8: 3805 | dependencies: 3806 | makeerror: 1.0.12 3807 | 3808 | webidl-conversions@7.0.0: {} 3809 | 3810 | whatwg-encoding@2.0.0: 3811 | dependencies: 3812 | iconv-lite: 0.6.3 3813 | 3814 | whatwg-mimetype@3.0.0: {} 3815 | 3816 | whatwg-url@11.0.0: 3817 | dependencies: 3818 | tr46: 3.0.0 3819 | webidl-conversions: 7.0.0 3820 | 3821 | which@2.0.2: 3822 | dependencies: 3823 | isexe: 2.0.0 3824 | 3825 | wrap-ansi@7.0.0: 3826 | dependencies: 3827 | ansi-styles: 4.3.0 3828 | string-width: 4.2.3 3829 | strip-ansi: 6.0.1 3830 | 3831 | wrap-ansi@8.1.0: 3832 | dependencies: 3833 | ansi-styles: 6.2.1 3834 | string-width: 5.1.2 3835 | strip-ansi: 7.1.0 3836 | 3837 | wrappy@1.0.2: {} 3838 | 3839 | write-file-atomic@4.0.2: 3840 | dependencies: 3841 | imurmurhash: 0.1.4 3842 | signal-exit: 3.0.7 3843 | 3844 | ws@8.18.1: {} 3845 | 3846 | xml-name-validator@4.0.0: {} 3847 | 3848 | xmlchars@2.2.0: {} 3849 | 3850 | y18n@5.0.8: {} 3851 | 3852 | yallist@3.1.1: {} 3853 | 3854 | yargs-parser@21.1.1: {} 3855 | 3856 | yargs@17.7.2: 3857 | dependencies: 3858 | cliui: 8.0.1 3859 | escalade: 3.2.0 3860 | get-caller-file: 2.0.5 3861 | require-directory: 2.1.1 3862 | string-width: 4.2.3 3863 | y18n: 5.0.8 3864 | yargs-parser: 21.1.1 3865 | 3866 | yocto-queue@0.1.0: {} 3867 | --------------------------------------------------------------------------------