├── .prettierignore ├── .gitattributes ├── .vscode ├── extensions.json └── settings.json ├── eslint.config.js ├── .prettierrc ├── src ├── index.ts ├── remove.ts ├── utils.ts ├── schemas.ts ├── get.ts ├── init.ts ├── create.ts ├── query.ts ├── update.ts ├── set.ts ├── types.ts └── fields.ts ├── .github └── workflows │ ├── release.yml │ └── ci.yml ├── tsconfig.build.json ├── .changeset ├── config.json └── README.md ├── bin └── build.js ├── .gitignore ├── tests └── example.spec.ts ├── tsconfig.json ├── package.json ├── playwright.config.ts ├── CHANGELOG.md ├── README.md └── pnpm-lock.yaml /.prettierignore: -------------------------------------------------------------------------------- 1 | # Production directory 2 | dist/ -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import finsweetConfigs from '@finsweet/eslint-config'; 2 | 3 | export default [...finsweetConfigs]; 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.codeActionsOnSave": { 4 | "source.fixAll.eslint": "explicit" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "arrowParens": "always", 4 | "printWidth": 100, 5 | "tabWidth": 2, 6 | "semi": true, 7 | "singleQuote": true 8 | } 9 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './create'; 2 | export * from './get'; 3 | export * from './init'; 4 | export * from './query'; 5 | export * from './remove'; 6 | export * from './set'; 7 | export * from './types'; 8 | export * from './update'; 9 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | - main 8 | 9 | jobs: 10 | release: 11 | uses: finsweet/workflow-release/.github/workflows/release.yml@main 12 | secrets: 13 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 14 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | Lint: 8 | uses: finsweet/workflow-ci-lint/.github/workflows/lint.yml@main 9 | 10 | # Comment this job out if your project doesn't have any tests. 11 | # Tests: 12 | # uses: finsweet/workflow-ci-test/.github/workflows/test.yml@main 13 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "ESNext", 5 | "rootDir": "./src/", 6 | "outDir": "./dist/types/", 7 | "noUnusedLocals": true, 8 | "noUnusedParameters": true 9 | }, 10 | "include": ["src/**/*.ts"], 11 | "exclude": ["src/**/*.test.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.0.0/schema.json", 3 | "changelog": "@changesets/changelog-git", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "master", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /bin/build.js: -------------------------------------------------------------------------------- 1 | import { exec } from 'child_process'; 2 | import { build } from 'esbuild'; 3 | 4 | const entryPoints = ['src/index.ts']; 5 | 6 | build({ 7 | entryPoints, 8 | logLevel: 'info', 9 | bundle: true, 10 | outbase: './src', 11 | outdir: './dist', 12 | format: 'esm', 13 | }); 14 | 15 | exec(`tsc --emitDeclarationOnly --declaration --project tsconfig.build.json`); 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directories 7 | node_modules/ 8 | 9 | # TypeScript v1 declaration files 10 | typings/ 11 | 12 | # Optional npm cache directory 13 | .npm 14 | 15 | # Optional eslint cache 16 | .eslintcache 17 | 18 | # Optional REPL history 19 | .node_repl_history 20 | 21 | # Output of 'npm pack' 22 | *.tgz 23 | 24 | # dotenv environment variables file 25 | .env 26 | 27 | # Production files 28 | dist -------------------------------------------------------------------------------- /tests/example.spec.ts: -------------------------------------------------------------------------------- 1 | import type { Page } from '@playwright/test'; 2 | import { expect, test } from '@playwright/test'; 3 | 4 | /** 5 | * These are some demo tests to showcase Playwright. 6 | * You can run the tests by running `pnpm dev`. 7 | * If you need more info about writing tests, please visit {@link https://playwright.dev/}. 8 | */ 9 | 10 | test.beforeEach(async ({ page }) => { 11 | // await page.goto('https://demo.playwright.dev/todomvc'); 12 | }); 13 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "declaration": true, 5 | "moduleResolution": "Node", 6 | "outDir": "./dist", 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "strict": true, 10 | "skipLibCheck": true, 11 | "strictPropertyInitialization": true, 12 | "strictNullChecks": true, 13 | "noUnusedLocals": false, 14 | "noUnusedParameters": false, 15 | "noUncheckedIndexedAccess": true 16 | }, 17 | "include": ["src/**/*.ts", "src/**/*.test.ts"] 18 | } 19 | -------------------------------------------------------------------------------- /src/remove.ts: -------------------------------------------------------------------------------- 1 | import type * as Firestore from './types'; 2 | import { get_firestore_endpoint } from './utils'; 3 | 4 | /** 5 | * Removes a document from Firestore. 6 | * Reference: {@link https://firebase.google.com/docs/firestore/reference/rest/v1/projects.databases.documents/delete} 7 | * 8 | * @param firestore The DB instance. 9 | * @param document_path The document path. 10 | * 11 | * @returns `true` if the deletion was successful. 12 | */ 13 | export const remove = async ({ jwt, project_id }: Firestore.DB, ...paths: string[]) => { 14 | const endpoint = get_firestore_endpoint(project_id, paths); 15 | 16 | const response = await fetch(endpoint, { 17 | method: 'DELETE', 18 | headers: { 19 | Authorization: `Bearer ${jwt}`, 20 | }, 21 | }); 22 | 23 | return response.ok; 24 | }; 25 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | export const FIRESTORE_ENDPOINT = 'https://firestore.googleapis.com'; 2 | 3 | /** 4 | * @returns The firestore endpoint for a project ID. 5 | * @param project_id 6 | * @param paths 7 | * @param suffix 8 | */ 9 | export const get_firestore_endpoint = ( 10 | project_id: string, 11 | paths: string[] = [], 12 | suffix = '' 13 | ): URL => { 14 | const allPaths = ['v1', 'projects', project_id, 'databases', '(default)', 'documents', ...paths]; 15 | const path = allPaths.join('/') + suffix; 16 | 17 | const endpoint = new URL(FIRESTORE_ENDPOINT); 18 | 19 | // We assign the pathname after instanciating the URL to ensure any hashes are encoded as part of the patname. 20 | // This is done to support use cases where users have hashes in their document IDs. 21 | endpoint.pathname = path; 22 | 23 | return endpoint; 24 | }; 25 | -------------------------------------------------------------------------------- /src/schemas.ts: -------------------------------------------------------------------------------- 1 | import { boolean, date, define, is, number, object, string } from 'superstruct'; 2 | 3 | const TIMESTAMP_REGEX = 4 | /^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(([Zz])|([+|-]([01][0-9]|2[0-3]):[0-5][0-9]))$/; 5 | 6 | const date_schema = date(); 7 | export const string_schema = string(); 8 | export const boolean_schema = boolean(); 9 | export const number_schema = number(); 10 | export const object_schema = object(); 11 | export const geo_point_schema = object({ 12 | latitude: number(), 13 | longitude: number(), 14 | }); 15 | 16 | /** 17 | * Custom superstruct type. 18 | * Defines a RFC3339 timestamp string. 19 | */ 20 | export const timestamp_schema = define('timestamp', (value) => { 21 | if (!is(value, string_schema)) return false; 22 | 23 | return TIMESTAMP_REGEX.test(value) && is(new Date(value), date_schema); 24 | }); 25 | -------------------------------------------------------------------------------- /src/get.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { extract_fields_from_document } from './fields'; 3 | import type * as Firestore from './types'; 4 | import { get_firestore_endpoint } from './utils'; 5 | 6 | /** 7 | * Gets a single document from Firestore. 8 | * Reference: {@link https://firebase.google.com/docs/firestore/reference/rest/v1/projects.databases.documents/get} 9 | * 10 | * @param firestore The DB instance. 11 | * @param document_path The document path. 12 | */ 13 | export const get = async >( 14 | { jwt, project_id }: Firestore.DB, 15 | ...paths: string[] 16 | ) => { 17 | const endpoint = get_firestore_endpoint(project_id, paths); 18 | 19 | const response = await fetch(endpoint, { 20 | headers: { 21 | Authorization: `Bearer ${jwt}`, 22 | }, 23 | }); 24 | 25 | const data: Firestore.GetResponse = await response.json(); 26 | 27 | if ('error' in data) throw new Error(data.error.message); 28 | 29 | const document = extract_fields_from_document(data); 30 | return document; 31 | }; 32 | -------------------------------------------------------------------------------- /src/init.ts: -------------------------------------------------------------------------------- 1 | import * as jose from 'jose'; 2 | 3 | import type * as Firestore from './types'; 4 | import { FIRESTORE_ENDPOINT } from './utils'; 5 | 6 | const alg = 'RS256'; 7 | const aud = `${FIRESTORE_ENDPOINT}/`; 8 | 9 | /** 10 | * Inits a Firestore instance by creating a [custom token](https://firebase.google.com/docs/auth/admin/create-custom-tokens). 11 | * 12 | * @param params 13 | * @returns A {@link Firestore.DB} object. 14 | */ 15 | export const init = async ({ 16 | client_email, 17 | private_key, 18 | private_key_id, 19 | uid, 20 | project_id, 21 | claims = {}, 22 | }: { 23 | project_id: string; 24 | private_key_id: string; 25 | client_email: string; 26 | private_key: string; 27 | uid: string; 28 | claims?: Record; 29 | }): Promise => { 30 | const sign_key = await jose.importPKCS8(private_key.replace(/\\n/g, '\n'), alg); 31 | 32 | const jwt = await new jose.SignJWT({ 33 | aud, 34 | uid, 35 | claims, 36 | sub: client_email, 37 | iss: client_email, 38 | }) 39 | .setProtectedHeader({ alg, kid: private_key_id }) 40 | .setIssuedAt() 41 | .setExpirationTime('1h') 42 | .sign(sign_key); 43 | 44 | return { 45 | project_id, 46 | jwt, 47 | }; 48 | }; 49 | -------------------------------------------------------------------------------- /src/create.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { create_document_from_fields, extract_fields_from_document } from './fields'; 3 | import type * as Firestore from './types'; 4 | import { get_firestore_endpoint } from './utils'; 5 | 6 | /** 7 | * Gets a single document from Firestore. 8 | * Reference: {@link https://firebase.google.com/docs/firestore/reference/rest/v1/projects.databases.documents/createDocument} 9 | * 10 | * @param firestore 11 | * @param collection_path 12 | * @param fields 13 | */ 14 | export const create = async >( 15 | { jwt, project_id }: Firestore.DB, 16 | ...args: [...string[], Fields] 17 | ) => { 18 | const paths = args.slice(0, -1) as string[]; 19 | const fields = args.at(-1) as Fields; 20 | 21 | const endpoint = get_firestore_endpoint(project_id, paths); 22 | const payload = create_document_from_fields(fields); 23 | 24 | const response = await fetch(endpoint, { 25 | method: 'POST', 26 | body: JSON.stringify(payload), 27 | headers: { 28 | Authorization: `Bearer ${jwt}`, 29 | }, 30 | }); 31 | 32 | const data: Firestore.GetResponse = await response.json(); 33 | 34 | if ('error' in data) throw new Error(data.error.message); 35 | 36 | const document = extract_fields_from_document(data); 37 | return document; 38 | }; 39 | -------------------------------------------------------------------------------- /src/query.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { extract_fields_from_document } from './fields'; 3 | import type * as Firestore from './types'; 4 | import { get_firestore_endpoint } from './utils'; 5 | 6 | type RunQueryRequest = { 7 | parent?: string; 8 | structuredQuery?: Firestore.StructuredQuery; 9 | transaction?: string; 10 | newTransaction?: Firestore.TransactionOptions; 11 | readTime?: string; 12 | }; 13 | 14 | type RunQueryResponse = Array<{ 15 | transaction?: string; 16 | document?: Firestore.Document; 17 | readTime?: string; 18 | skippedResults?: number; 19 | }>; 20 | 21 | /** 22 | * Performs a query to Firestore. 23 | * Reference: {@link https://firebase.google.com/docs/firestore/reference/rest/v1/projects.databases.documents/runQuery} 24 | * 25 | * @param firestore The DB instance. 26 | * @param query A [StructuredQuery](https://firebase.google.com/docs/firestore/reference/rest/v1/StructuredQuery) object. 27 | */ 28 | export const query = async >( 29 | { jwt, project_id }: Firestore.DB, 30 | query: Firestore.StructuredQuery, 31 | ...paths: string[] 32 | ) => { 33 | const endpoint = get_firestore_endpoint(project_id, paths, ':runQuery'); 34 | const payload: RunQueryRequest = { 35 | structuredQuery: query, 36 | }; 37 | 38 | const response = await fetch(endpoint, { 39 | method: 'POST', 40 | body: JSON.stringify(payload), 41 | headers: { 42 | Authorization: `Bearer ${jwt}`, 43 | }, 44 | }); 45 | 46 | const data: RunQueryResponse = await response.json(); 47 | 48 | const documents = data.reduce[]>((acc, { document }) => { 49 | if (!document) return acc; 50 | 51 | acc.push(extract_fields_from_document(document)); 52 | return acc; 53 | }, []); 54 | 55 | return documents; 56 | }; 57 | -------------------------------------------------------------------------------- /src/update.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { create_document_from_fields, extract_fields_from_document } from './fields'; 3 | import type * as Firestore from './types'; 4 | import { get_firestore_endpoint } from './utils'; 5 | 6 | /** 7 | * Updates a document. 8 | * Similar to the SDK's [updateDoc](https://firebase.google.com/docs/reference/js/firestore_.md#updatedoc). 9 | * 10 | * Reference: {@link https://firebase.google.com/docs/firestore/reference/rest/v1/projects.databases.documents/patch} 11 | * 12 | * @param firestore 13 | * @param document_path 14 | * @param fields 15 | */ 16 | export const update = async >( 17 | { jwt, project_id }: Firestore.DB, 18 | ...args: [...string[], Fields] 19 | ) => { 20 | const paths = args.slice(0, -1) as string[]; 21 | const fields = args.at(-1) as Fields; 22 | 23 | const payload = create_document_from_fields(fields); 24 | const endpoint = get_firestore_endpoint(project_id, paths); 25 | 26 | // Fail if the document doesn't exist, similar to the SDK's [updateDoc](https://firebase.google.com/docs/reference/js/firestore_.md#updatedoc) 27 | endpoint.searchParams.set('currentDocument.exists', 'true'); 28 | 29 | // Ensure that the fields are updated without overwriting the rest of the document 30 | for (const key in fields) { 31 | endpoint.searchParams.append('updateMask.fieldPaths', key); 32 | } 33 | 34 | const response = await fetch(endpoint, { 35 | method: 'PATCH', 36 | body: JSON.stringify(payload), 37 | headers: { 38 | Authorization: `Bearer ${jwt}`, 39 | }, 40 | }); 41 | 42 | const data: Firestore.GetResponse = await response.json(); 43 | 44 | if ('error' in data) throw new Error(data.error.message); 45 | 46 | const document = extract_fields_from_document(data); 47 | return document; 48 | }; 49 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fireworkers", 3 | "version": "0.4.2", 4 | "description": "Use Cloud Firestore inside Cloudflare Workers.", 5 | "sideEffects": false, 6 | "type": "module", 7 | "module": "dist/index.js", 8 | "types": "dist/types/index.d.ts", 9 | "exports": { 10 | ".": { 11 | "types": "./dist/types/index.d.ts", 12 | "import": "./dist/index.js" 13 | } 14 | }, 15 | "files": [ 16 | "dist" 17 | ], 18 | "license": "MIT", 19 | "keywords": [ 20 | "cloudflare", 21 | "workers", 22 | "firebase", 23 | "firestore", 24 | "serverless" 25 | ], 26 | "author": { 27 | "name": "Alex Iglesias", 28 | "url": "https://alexiglesias.me/" 29 | }, 30 | "homepage": "https://github.com/finsweet/fireworkers#readme", 31 | "repository": { 32 | "type": "git", 33 | "url": "git+https://github.com/finsweet/fireworkers.git" 34 | }, 35 | "bugs": { 36 | "url": "https://github.com/finsweet/fireworkers/issues" 37 | }, 38 | "scripts": { 39 | "build": "node ./bin/build.js", 40 | "lint": "eslint ./src && prettier --check ./src", 41 | "lint:fix": "eslint ./src --fix", 42 | "check": "tsc --noEmit", 43 | "format": "prettier --write ./src", 44 | "test": "pnpm playwright test", 45 | "test:headed": "pnpm playwright test --headed", 46 | "release": "changeset publish", 47 | "update": "pnpm update -i -L -r" 48 | }, 49 | "devDependencies": { 50 | "@changesets/changelog-git": "^0.2.0", 51 | "@changesets/cli": "^2.27.12", 52 | "@eslint/js": "^9.19.0", 53 | "@finsweet/eslint-config": "^3.0.3", 54 | "@playwright/test": "^1.50.1", 55 | "esbuild": "^0.24.2", 56 | "eslint": "^9.19.0", 57 | "eslint-config-prettier": "^10.0.1", 58 | "eslint-plugin-prettier": "^5.2.3", 59 | "eslint-plugin-simple-import-sort": "^12.1.1", 60 | "prettier": "^3.4.2", 61 | "typescript": "^5.7.3", 62 | "typescript-eslint": "^8.23.0" 63 | }, 64 | "dependencies": { 65 | "jose": "^5.9.6", 66 | "superstruct": "^2.0.2" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/set.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { create_document_from_fields, extract_fields_from_document } from './fields'; 3 | import type * as Firestore from './types'; 4 | import { get_firestore_endpoint } from './utils'; 5 | 6 | type Options = { 7 | merge?: boolean; 8 | }; 9 | 10 | /** 11 | * Writes to a document. If the document does not yet exist, it will be created. 12 | * Similar to the SDK's [setDoc](https://firebase.google.com/docs/reference/js/firestore_.md#setdoc). 13 | * 14 | * Reference: {@link https://firebase.google.com/docs/firestore/reference/rest/v1/projects.databases.documents/patch} 15 | * 16 | * @param firestore 17 | * @param document_path 18 | * @param fields 19 | */ 20 | export const set = async >( 21 | { jwt, project_id }: Firestore.DB, 22 | ...args: [...string[], Fields] | [...string[], Fields, Options] 23 | ) => { 24 | let paths; 25 | let fields; 26 | let options; 27 | 28 | if (typeof args.at(-2) === 'object') { 29 | paths = args.slice(0, -2) as string[]; 30 | fields = args.at(-2) as Fields; 31 | options = args.at(-1) as Options; 32 | } else { 33 | paths = args.slice(0, -1) as string[]; 34 | fields = args.at(-1) as Fields; 35 | } 36 | 37 | const payload = create_document_from_fields(fields); 38 | const endpoint = get_firestore_endpoint(project_id, paths); 39 | 40 | if (options?.merge) { 41 | // Ensure that the fields are updated without overwriting the rest of the document 42 | for (const key in fields) { 43 | endpoint.searchParams.append('updateMask.fieldPaths', key); 44 | } 45 | } 46 | 47 | const response = await fetch(endpoint, { 48 | method: 'PATCH', 49 | body: JSON.stringify(payload), 50 | headers: { 51 | Authorization: `Bearer ${jwt}`, 52 | }, 53 | }); 54 | 55 | const data: Firestore.GetResponse = await response.json(); 56 | 57 | if ('error' in data) throw new Error(data.error.message); 58 | 59 | const document = extract_fields_from_document(data); 60 | return document; 61 | }; 62 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | import { devices } from '@playwright/test'; 3 | 4 | declare const process: { 5 | env: { 6 | CI?: string; 7 | }; 8 | }; 9 | 10 | /** 11 | * See https://playwright.dev/docs/test-configuration. 12 | */ 13 | const config: PlaywrightTestConfig = { 14 | testDir: './tests', 15 | 16 | /* Maximum time one test can run for. */ 17 | timeout: 30 * 1000, 18 | expect: { 19 | /** 20 | * Maximum time expect() should wait for the condition to be met. 21 | * For example in `await expect(locator).toHaveText();` 22 | */ 23 | timeout: 5000, 24 | }, 25 | 26 | /* Run tests in files in parallel */ 27 | fullyParallel: true, 28 | 29 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 30 | forbidOnly: !!process.env.CI, 31 | 32 | /* Retry on CI only */ 33 | retries: process.env.CI ? 2 : 0, 34 | 35 | /* Opt out of parallel tests on CI. */ 36 | workers: process.env.CI ? 1 : undefined, 37 | 38 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 39 | reporter: process.env.CI ? 'dot' : 'list', 40 | 41 | /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 42 | use: { 43 | /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ 44 | actionTimeout: 0, 45 | /* Base URL to use in actions like `await page.goto('/')`. */ 46 | // baseURL: 'http://localhost:3000', 47 | 48 | /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 49 | trace: 'on-first-retry', 50 | }, 51 | 52 | /* Configure projects for major browsers */ 53 | projects: [ 54 | { 55 | name: 'chromium', 56 | use: { 57 | ...devices['Desktop Chrome'], 58 | }, 59 | }, 60 | 61 | { 62 | name: 'firefox', 63 | use: { 64 | ...devices['Desktop Firefox'], 65 | }, 66 | }, 67 | 68 | { 69 | name: 'webkit', 70 | use: { 71 | ...devices['Desktop Safari'], 72 | }, 73 | }, 74 | ], 75 | 76 | /* Run your local dev server before starting the tests */ 77 | webServer: { 78 | command: 'pnpm dev', 79 | port: 3000, 80 | reuseExistingServer: true, 81 | }, 82 | }; 83 | 84 | export default config; 85 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # fireworkers 2 | 3 | ## 0.4.2 4 | 5 | ### Patch Changes 6 | 7 | - 87a9436: chore: updated dependencies 8 | - e7a065c: fix: support document IDs that contain hashes 9 | 10 | ## 0.4.1 11 | 12 | ### Patch Changes 13 | 14 | - c942c2b: fix: remove global flag on timestamp regex 15 | 16 | ## 0.4.0 17 | 18 | ### Minor Changes 19 | 20 | - 013e768: feat: export all types 21 | 22 | ## 0.3.2 23 | 24 | ### Patch Changes 25 | 26 | - a664a3e: fix: include missing `OR` operator for structured queries. 27 | 28 | ## 0.3.1 29 | 30 | ### Patch Changes 31 | 32 | - b157152: fix: expose `Fireworkers.set` method 33 | 34 | ## 0.3.0 35 | 36 | ### Minor Changes 37 | 38 | - 945dc3c: **This release deliberately contains backwards-incompatible changes**. To avoid automatically picking up releases like this, you should either be pinning the exact version of `fireworkers` in your `package.json` file (recommended) or be using a version range syntax that only accepts patch upgrades such as `^0.2.0` or `~0.2.0`. See npm's documentation about [semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more information. 39 | 40 | - feat: add new `Firestore.set()` method that matches the behavior of the SDK's [setDoc](https://firebase.google.com/docs/reference/js/firestore_.md#setdoc). 41 | - fix: update `Firestore.update()` to match the behavior of the SDK's [updateDoc](https://firebase.google.com/docs/reference/js/firestore_.md#updatedoc): 42 | - Fields will be merged instead of overriding the entire document. 43 | - Operations will fail if the document doesn't exist. 44 | 45 | ### Patch Changes 46 | 47 | - 9d619ba: - fix: process numbers as `double` instead of `integer`. 48 | 49 | ## 0.2.1 50 | 51 | ### Patch Changes 52 | 53 | - 395d097: fix: wrong firestore endpoint URL constructor 54 | 55 | ## 0.2.0 56 | 57 | ### Minor Changes 58 | 59 | - e6a9bf5: - added support for querying sub-collections 60 | - (internal) refactored endpoints constructor 61 | 62 | ## 0.1.2 63 | 64 | ### Patch Changes 65 | 66 | - f2846f9: set pkg.sideEffects to false 67 | 68 | ## 0.1.1 69 | 70 | ### Patch Changes 71 | 72 | - 94bf58c: added pkg.exports info 73 | 74 | ## 0.1.0 75 | 76 | ### Minor Changes 77 | 78 | - 45ad92f: refactored firestore methods, added support for nested paths 79 | 80 | ## 0.0.4 81 | 82 | ### Patch Changes 83 | 84 | - 6de0a21: docs: small fixes 85 | 86 | ## 0.0.3 87 | 88 | ### Patch Changes 89 | 90 | - 09a0329: docs: fix invalid url 91 | 92 | ## 0.0.2 93 | 94 | ### Patch Changes 95 | 96 | - 37e4e14: docs: fix example import 97 | - 02046a6: docs: fix invalid example import (again) 98 | 99 | ## 0.0.1 100 | 101 | ### Patch Changes 102 | 103 | - ae834aa: Initial release 104 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type DB = { 2 | project_id: string; 3 | jwt: string; 4 | }; 5 | 6 | export type GetResponse = Document | { error: Status }; 7 | 8 | export interface Document { 9 | name?: string; 10 | fields?: ApiClientObjectMap; 11 | createTime?: Timestamp; 12 | updateTime?: Timestamp; 13 | } 14 | 15 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 16 | export type CustomDocument> = Pick< 17 | Document, 18 | 'createTime' | 'updateTime' 19 | > & { 20 | id: string; 21 | } & { 22 | fields: T; 23 | }; 24 | 25 | export interface Value { 26 | nullValue?: ValueNullValue; 27 | booleanValue?: boolean; 28 | integerValue?: string | number; 29 | doubleValue?: string | number; 30 | timestampValue?: Timestamp; 31 | stringValue?: string; 32 | bytesValue?: string | Uint8Array; 33 | referenceValue?: string; 34 | geoPointValue?: LatLng; 35 | arrayValue?: ArrayValue; 36 | mapValue?: MapValue; 37 | } 38 | 39 | export interface StructuredQuery { 40 | select?: Projection; 41 | from?: CollectionSelector[]; 42 | where?: Filter; 43 | orderBy?: Order[]; 44 | startAt?: Cursor; 45 | endAt?: Cursor; 46 | offset?: number; 47 | limit?: number | { value: number }; 48 | } 49 | 50 | export interface Projection { 51 | fields?: FieldReference[]; 52 | } 53 | 54 | export interface FieldReference { 55 | fieldPath?: string; 56 | } 57 | 58 | export interface CollectionSelector { 59 | collectionId?: string; 60 | allDescendants?: boolean; 61 | } 62 | 63 | export interface Filter { 64 | compositeFilter?: CompositeFilter; 65 | fieldFilter?: FieldFilter; 66 | unaryFilter?: UnaryFilter; 67 | } 68 | 69 | export interface CompositeFilter { 70 | op?: CompositeFilterOp; 71 | filters?: Filter[]; 72 | } 73 | 74 | export type CompositeFilterOp = 'OPERATOR_UNSPECIFIED' | 'AND' | 'OR'; 75 | 76 | export interface FieldFilter { 77 | field?: FieldReference; 78 | op?: FieldFilterOp; 79 | value?: Value; 80 | } 81 | 82 | export type FieldFilterOp = 83 | | 'OPERATOR_UNSPECIFIED' 84 | | 'LESS_THAN' 85 | | 'LESS_THAN_OR_EQUAL' 86 | | 'GREATER_THAN' 87 | | 'GREATER_THAN_OR_EQUAL' 88 | | 'EQUAL' 89 | | 'NOT_EQUAL' 90 | | 'ARRAY_CONTAINS' 91 | | 'IN' 92 | | 'ARRAY_CONTAINS_ANY' 93 | | 'NOT_IN'; 94 | 95 | export type ValueNullValue = 'NULL_VALUE'; 96 | 97 | export type Timestamp = string | { seconds?: string | number; nanos?: number }; 98 | 99 | export interface LatLng { 100 | latitude?: number; 101 | longitude?: number; 102 | } 103 | 104 | export interface ArrayValue { 105 | values?: Value[]; 106 | } 107 | 108 | export interface MapValue { 109 | fields?: ApiClientObjectMap; 110 | } 111 | 112 | export interface ApiClientObjectMap { 113 | [k: string]: T; 114 | } 115 | 116 | export interface Order { 117 | field?: FieldReference; 118 | direction?: OrderDirection; 119 | } 120 | 121 | export type OrderDirection = 'DIRECTION_UNSPECIFIED' | 'ASCENDING' | 'DESCENDING'; 122 | 123 | export interface Cursor { 124 | values?: Value[]; 125 | before?: boolean; 126 | } 127 | 128 | export interface UnaryFilter { 129 | op?: UnaryFilterOp; 130 | field?: FieldReference; 131 | } 132 | 133 | export type UnaryFilterOp = 134 | | 'OPERATOR_UNSPECIFIED' 135 | | 'IS_NAN' 136 | | 'IS_NULL' 137 | | 'IS_NOT_NAN' 138 | | 'IS_NOT_NULL'; 139 | 140 | export interface TransactionOptions { 141 | readOnly?: ReadOnly; 142 | readWrite?: ReadWrite; 143 | } 144 | 145 | export interface ReadOnly { 146 | readTime?: string; 147 | } 148 | 149 | export interface ReadWrite { 150 | retryTransaction?: string; 151 | } 152 | 153 | export interface Status { 154 | code?: number; 155 | message?: string; 156 | status?: string; 157 | } 158 | -------------------------------------------------------------------------------- /src/fields.ts: -------------------------------------------------------------------------------- 1 | import { is, validate } from 'superstruct'; 2 | 3 | import { 4 | boolean_schema, 5 | geo_point_schema, 6 | number_schema, 7 | object_schema, 8 | string_schema, 9 | timestamp_schema, 10 | } from './schemas'; 11 | import type * as Firestore from './types'; 12 | 13 | /** 14 | * Types 15 | */ 16 | export type PrimitiveValues = Omit; 17 | export type PrimitiveMappedValue = PrimitiveValues[keyof PrimitiveValues]; 18 | export type ArrayMappedValue = Array; 19 | export interface MapMappedValue { 20 | [key: string]: PrimitiveMappedValue | MapMappedValue | ArrayMappedValue; 21 | } 22 | 23 | export type MappedValue = PrimitiveMappedValue | ArrayMappedValue | MapMappedValue; 24 | 25 | /** 26 | * Converts a field to a {@link Firestore.Value} 27 | * @param field_value 28 | * @returns 29 | */ 30 | const convert_field_to_value = (field_value: unknown): Firestore.Value => { 31 | // Array 32 | if (Array.isArray(field_value)) { 33 | return { 34 | arrayValue: { 35 | values: field_value.map(convert_field_to_value), 36 | }, 37 | }; 38 | } 39 | 40 | // GeoPoint 41 | const [, geo_point_value] = validate(field_value, geo_point_schema); 42 | if (geo_point_value) return { geoPointValue: geo_point_value }; 43 | 44 | // Map 45 | if (is(field_value, object_schema)) { 46 | const entries = Object.entries(field_value).map( 47 | ([key, value]) => [key, convert_field_to_value(value)] as const 48 | ); 49 | return { 50 | mapValue: { 51 | fields: Object.fromEntries(entries), 52 | }, 53 | }; 54 | } 55 | 56 | // Primitives 57 | if (is(field_value, timestamp_schema)) return { timestampValue: field_value }; 58 | if (is(field_value, boolean_schema)) return { booleanValue: field_value }; 59 | if (is(field_value, number_schema)) return { doubleValue: field_value }; 60 | if (is(field_value, string_schema)) return { stringValue: field_value }; 61 | return { nullValue: 'NULL_VALUE' }; 62 | }; 63 | 64 | /** 65 | * Creates a document from an object of fields. 66 | * @param fields 67 | */ 68 | export const create_document_from_fields = (fields: Record) => { 69 | const entries = Object.entries(fields).map( 70 | ([key, value]) => [key, convert_field_to_value(value)] as const 71 | ); 72 | const document: Firestore.Document = { fields: Object.fromEntries(entries) }; 73 | 74 | return document; 75 | }; 76 | 77 | /** 78 | * Maps all values to remove Firestore's metadata. 79 | * @param document The document to map. 80 | * @returns 81 | */ 82 | export const extract_fields_from_document = >( 83 | document: Firestore.Document 84 | ): Firestore.CustomDocument => { 85 | const { name, fields = {}, ...timestamps } = document; 86 | 87 | const entries = Object.entries(fields).map( 88 | ([key, value]) => [key, extract_value(value)] as const 89 | ); 90 | const new_fields = Object.fromEntries(entries) as DocumentFields; 91 | 92 | const new_document: Firestore.CustomDocument = { 93 | ...timestamps, 94 | id: extract_id_from_name(name), 95 | fields: new_fields, 96 | }; 97 | 98 | return new_document; 99 | }; 100 | 101 | /** 102 | * Extracts the value from a Firestore's field. 103 | * @param value 104 | */ 105 | const extract_value = (value: Firestore.Value): MappedValue => { 106 | const { arrayValue, mapValue, ...primitiveValue } = value; 107 | 108 | if (arrayValue) return extract_array_value(arrayValue); 109 | if (mapValue) return extract_map_value(mapValue); 110 | 111 | return extract_primitive_value(primitiveValue); 112 | }; 113 | 114 | /** 115 | * Extracts a primitive value from a field object. 116 | * @param primitiveValues 117 | */ 118 | const extract_primitive_value = (primitiveValues: PrimitiveValues) => 119 | Object.values(primitiveValues)[0]; 120 | 121 | /** 122 | * Extracts an array field. 123 | * @param arrayValue 124 | */ 125 | const extract_array_value = ({ values = [] }: NonNullable) => 126 | values.map(extract_value); 127 | 128 | /** 129 | * Extracts a map field. 130 | * @param mapValue 131 | */ 132 | const extract_map_value = ({ fields = {} }: NonNullable) => { 133 | const entries = Object.entries(fields).map(([key, value]) => [key, extract_value(value)]); 134 | return Object.fromEntries(entries); 135 | }; 136 | 137 | /** 138 | * Extracts the ID from the Document name. 139 | * @param name The document name. 140 | */ 141 | const extract_id_from_name = (name = '') => name.match(/[^/]+$/)?.[0] || name; 142 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fireworkers [![npm](https://img.shields.io/npm/v/fireworkers)](https://www.npmjs.com/package/fireworkers) 2 | 3 | Work in progress, expect bugs and missing features. 4 | 5 | A library to use [Cloud Firestore](https://firebase.google.com/docs/firestore) inside [Cloudflare Workers](https://workers.cloudflare.com/). 6 | 7 | ## Install 8 | 9 | ```bash 10 | npm install fireworkers 11 | # OR 12 | yarn add fireworkers 13 | # OR 14 | pnpm add fireworkers 15 | ``` 16 | 17 | ## Usage 18 | 19 | ```typescript 20 | import * as Firestore from 'fireworkers'; 21 | 22 | const db = await Firestore.init({ 23 | uid: 'user1234', 24 | project_id: 'my-project', 25 | client_email: 'abc-123@a-b-c-123.iam.gserviceaccount.com', 26 | private_key: '-----BEGIN PRIVATE KEY-----...', 27 | private_key_id: 'OdxPtETQKf1o2YvMTTLBzsJ3OYdiPcx7NlFE2ZAk', 28 | claims: { 29 | premium_account: true, 30 | }, 31 | }); 32 | 33 | const todo = await Firestore.get(db, 'todos', 'aDyjLiTViX1G7HyF74Ax'); 34 | ``` 35 | 36 | ## API 37 | 38 | ### init(options) 39 | 40 | Returns a DB instance. Requires a [service account](https://firebase.google.com/docs/auth/admin/create-custom-tokens#using_a_service_account_json_file). 41 | 42 | #### options.uid 43 | 44 | Type: `string` 45 | 46 | The unique identifier of the signed-in user, between 1-36 characters long. 47 | 48 | #### options.project_id 49 | 50 | Type: `string` 51 | 52 | The `project_id` defined in the `serviceAccountKey.json`. 53 | 54 | #### options.client_email 55 | 56 | Type: `string` 57 | 58 | The `client_email` defined in the `serviceAccountKey.json`. 59 | 60 | #### options.private_key 61 | 62 | Type: `string` 63 | 64 | The `private_key` defined in the `serviceAccountKey.json`. 65 | 66 | #### options.private_key_id 67 | 68 | Type: `string` 69 | 70 | The `private_key_id` defined in the `serviceAccountKey.json`. 71 | 72 | #### (Optional) options.claims 73 | 74 | Type: `Record` | `undefined` 75 | 76 | Optional custom claims to include in the [Security Rules](https://firebase.google.com/docs/firestore/security/get-started) `auth / request.auth` variables. 77 | 78 | ```typescript 79 | const db = await Firestore.init({ 80 | uid: 'user1234', 81 | project_id: 'my-project', 82 | client_email: 'abc-123@a-b-c-123.iam.gserviceaccount.com', 83 | private_key: '-----BEGIN PRIVATE KEY-----...', 84 | private_key_id: 'OdxPtETQKf1o2YvMTTLBzsJ3OYdiPcx7NlFE2ZAk', 85 | claims: { 86 | premium_account: true, 87 | }, 88 | }); 89 | ``` 90 | 91 | --- 92 | 93 | ### get(db, ...document_path) 94 | 95 | Gets a single document. 96 | 97 | #### db 98 | 99 | Type: `DB` 100 | 101 | The DB instance. 102 | 103 | #### document_path 104 | 105 | Type: `string` 106 | 107 | The document path, usually defined as `{collection_id}/{document_id}`. 108 | 109 | Allows nested documents like `{collection_id}/{document_id}/{nested_collection_id}/{nested_document_id}`. 110 | 111 | It can either be defined using a single string like: 112 | 113 | ```typescript 114 | const todo = await Firestore.get(db, 'todos/aDyjLiTViX1G7HyF74Ax'); 115 | ``` 116 | 117 | Or multiple params like: 118 | 119 | ```typescript 120 | const todo = await Firestore.get(db, 'todos', 'aDyjLiTViX1G7HyF74Ax'); 121 | ``` 122 | 123 | --- 124 | 125 | ### create(db, ...collection_path, fields) 126 | 127 | Creates a new document. 128 | 129 | #### db 130 | 131 | Type: `DB` 132 | 133 | The DB instance. 134 | 135 | #### collection_path 136 | 137 | Type: `string` 138 | 139 | The collection path, usually defined as `{collection_id}`. 140 | 141 | Allows nested collections like `{collection_id}/{document_id}/{nested_collection_id}`. 142 | 143 | Nested collections can either be defined using a single string like `todo/aDyjLiTViX1G7HyF74Ax/tasks` or by passing multiple params like `'todo', 'aDyjLiTViX1G7HyF74Ax', 'tasks'`. 144 | 145 | #### fields 146 | 147 | Type: `Record` 148 | 149 | The document fields. 150 | 151 | ```typescript 152 | const newTodo = await Firestore.create(db, 'todos', { 153 | title: 'Win the lottery', 154 | completed: false, 155 | }); 156 | ``` 157 | 158 | --- 159 | 160 | ### update(db, ...document_path, fields) 161 | 162 | Updates fields in a document. The update will fail if applied to a document that does not exist. 163 | 164 | Implements the same functionality as Firestore's [updateDoc](https://firebase.google.com/docs/reference/js/firestore_.md#updatedoc). 165 | 166 | #### db 167 | 168 | Type: `DB` 169 | 170 | The DB instance. 171 | 172 | #### document_path 173 | 174 | Type: `string` 175 | 176 | The document path, defined like in [get](#document_path). 177 | 178 | #### fields 179 | 180 | Type: `Record` 181 | 182 | The fields to update. 183 | 184 | ```typescript 185 | const updatedTodo = await Firestore.update(db, 'todos', 'aDyjLiTViX1G7HyF74Ax', { 186 | completed: false, 187 | }); 188 | ``` 189 | 190 | --- 191 | 192 | ### set(db, ...document_path, fields, options?) 193 | 194 | Writes to a document. If the document does not yet exist, it will be created. If you provide `merge`, the provided data can be merged into an existing document. 195 | 196 | Implements the same functionality as Firestore's [setDoc](https://firebase.google.com/docs/reference/js/firestore_.md#setdoc_2). 197 | 198 | #### db 199 | 200 | Type: `DB` 201 | 202 | The DB instance. 203 | 204 | #### document_path 205 | 206 | Type: `string` 207 | 208 | The document path, defined like in [get](#document_path). 209 | 210 | #### fields 211 | 212 | Type: `Record` 213 | 214 | The fields to update. 215 | 216 | #### (Optional) options.merge 217 | 218 | Type: `boolean` 219 | 220 | If set to `true`, the provided data will be merged into an existing document instead of overwriting. 221 | 222 | ```typescript 223 | const updatedTodo = await Firestore.set( 224 | db, 225 | 'todos', 226 | 'aDyjLiTViX1G7HyF74Ax', 227 | { completed: false }, 228 | { merge: true } 229 | ); 230 | ``` 231 | 232 | --- 233 | 234 | ### remove(db, ...document_path) 235 | 236 | Removes a document. 237 | 238 | #### db 239 | 240 | Type: `DB` 241 | 242 | The DB instance. 243 | 244 | #### document_path 245 | 246 | Type: `string` 247 | 248 | The document path, defined like in [get](#document_path). 249 | 250 | ```typescript 251 | const todo = await Firestore.remove(db, 'todos', 'aDyjLiTViX1G7HyF74Ax'); 252 | ``` 253 | 254 | --- 255 | 256 | ### query(db, query) 257 | 258 | Runs a query. 259 | 260 | #### db 261 | 262 | Type: `DB` 263 | 264 | The DB instance. 265 | 266 | #### query 267 | 268 | Type: `StructuredQuery` 269 | 270 | A [StructuredQuery](https://firebase.google.com/docs/firestore/reference/rest/v1/StructuredQuery) object. 271 | 272 | ```typescript 273 | const todos = await Firestore.query(db, { 274 | from: [{ collectionId: 'todos' }], 275 | 276 | where: { 277 | fieldFilter: { 278 | field: { 279 | fieldPath: 'owner', 280 | }, 281 | op: 'EQUAL', 282 | value: { 283 | stringValue: 'user1234', 284 | }, 285 | }, 286 | }, 287 | }); 288 | ``` 289 | 290 | ## TypeScript 291 | 292 | This library has first-class TypeScript support. 293 | 294 | To define a document interface, you can pass a generic like so: 295 | 296 | ```typescript 297 | type Todo = { 298 | title: string; 299 | completed: boolean; 300 | }; 301 | 302 | const todo = await Firestore.get(db, 'todos', 'aDyjLiTViX1G7HyF74Ax'); 303 | ``` 304 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | jose: 12 | specifier: ^5.9.6 13 | version: 5.9.6 14 | superstruct: 15 | specifier: ^2.0.2 16 | version: 2.0.2 17 | devDependencies: 18 | '@changesets/changelog-git': 19 | specifier: ^0.2.0 20 | version: 0.2.0 21 | '@changesets/cli': 22 | specifier: ^2.27.12 23 | version: 2.27.12 24 | '@eslint/js': 25 | specifier: ^9.19.0 26 | version: 9.19.0 27 | '@finsweet/eslint-config': 28 | specifier: ^3.0.3 29 | version: 3.0.3(@eslint/js@9.19.0)(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2))(eslint-plugin-simple-import-sort@12.1.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2)(typescript-eslint@8.23.0(eslint@9.19.0)(typescript@5.7.3))(typescript@5.7.3) 30 | '@playwright/test': 31 | specifier: ^1.50.1 32 | version: 1.50.1 33 | esbuild: 34 | specifier: ^0.24.2 35 | version: 0.24.2 36 | eslint: 37 | specifier: ^9.19.0 38 | version: 9.19.0 39 | eslint-config-prettier: 40 | specifier: ^10.0.1 41 | version: 10.0.1(eslint@9.19.0) 42 | eslint-plugin-prettier: 43 | specifier: ^5.2.3 44 | version: 5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2) 45 | eslint-plugin-simple-import-sort: 46 | specifier: ^12.1.1 47 | version: 12.1.1(eslint@9.19.0) 48 | prettier: 49 | specifier: ^3.4.2 50 | version: 3.4.2 51 | typescript: 52 | specifier: ^5.7.3 53 | version: 5.7.3 54 | typescript-eslint: 55 | specifier: ^8.23.0 56 | version: 8.23.0(eslint@9.19.0)(typescript@5.7.3) 57 | 58 | packages: 59 | 60 | '@babel/runtime@7.26.7': 61 | resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} 62 | engines: {node: '>=6.9.0'} 63 | 64 | '@changesets/apply-release-plan@7.0.8': 65 | resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} 66 | 67 | '@changesets/assemble-release-plan@6.0.5': 68 | resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} 69 | 70 | '@changesets/changelog-git@0.2.0': 71 | resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} 72 | 73 | '@changesets/cli@2.27.12': 74 | resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} 75 | hasBin: true 76 | 77 | '@changesets/config@3.0.5': 78 | resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} 79 | 80 | '@changesets/errors@0.2.0': 81 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 82 | 83 | '@changesets/get-dependents-graph@2.1.2': 84 | resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} 85 | 86 | '@changesets/get-release-plan@4.0.6': 87 | resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} 88 | 89 | '@changesets/get-version-range-type@0.4.0': 90 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 91 | 92 | '@changesets/git@3.0.2': 93 | resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} 94 | 95 | '@changesets/logger@0.1.1': 96 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 97 | 98 | '@changesets/parse@0.4.0': 99 | resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} 100 | 101 | '@changesets/pre@2.0.1': 102 | resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} 103 | 104 | '@changesets/read@0.6.2': 105 | resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} 106 | 107 | '@changesets/should-skip-package@0.1.1': 108 | resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} 109 | 110 | '@changesets/types@4.1.0': 111 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 112 | 113 | '@changesets/types@6.0.0': 114 | resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} 115 | 116 | '@changesets/write@0.3.2': 117 | resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} 118 | 119 | '@esbuild/aix-ppc64@0.24.2': 120 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 121 | engines: {node: '>=18'} 122 | cpu: [ppc64] 123 | os: [aix] 124 | 125 | '@esbuild/android-arm64@0.24.2': 126 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 127 | engines: {node: '>=18'} 128 | cpu: [arm64] 129 | os: [android] 130 | 131 | '@esbuild/android-arm@0.24.2': 132 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 133 | engines: {node: '>=18'} 134 | cpu: [arm] 135 | os: [android] 136 | 137 | '@esbuild/android-x64@0.24.2': 138 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 139 | engines: {node: '>=18'} 140 | cpu: [x64] 141 | os: [android] 142 | 143 | '@esbuild/darwin-arm64@0.24.2': 144 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 145 | engines: {node: '>=18'} 146 | cpu: [arm64] 147 | os: [darwin] 148 | 149 | '@esbuild/darwin-x64@0.24.2': 150 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 151 | engines: {node: '>=18'} 152 | cpu: [x64] 153 | os: [darwin] 154 | 155 | '@esbuild/freebsd-arm64@0.24.2': 156 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 157 | engines: {node: '>=18'} 158 | cpu: [arm64] 159 | os: [freebsd] 160 | 161 | '@esbuild/freebsd-x64@0.24.2': 162 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 163 | engines: {node: '>=18'} 164 | cpu: [x64] 165 | os: [freebsd] 166 | 167 | '@esbuild/linux-arm64@0.24.2': 168 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 169 | engines: {node: '>=18'} 170 | cpu: [arm64] 171 | os: [linux] 172 | 173 | '@esbuild/linux-arm@0.24.2': 174 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 175 | engines: {node: '>=18'} 176 | cpu: [arm] 177 | os: [linux] 178 | 179 | '@esbuild/linux-ia32@0.24.2': 180 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 181 | engines: {node: '>=18'} 182 | cpu: [ia32] 183 | os: [linux] 184 | 185 | '@esbuild/linux-loong64@0.24.2': 186 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 187 | engines: {node: '>=18'} 188 | cpu: [loong64] 189 | os: [linux] 190 | 191 | '@esbuild/linux-mips64el@0.24.2': 192 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 193 | engines: {node: '>=18'} 194 | cpu: [mips64el] 195 | os: [linux] 196 | 197 | '@esbuild/linux-ppc64@0.24.2': 198 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 199 | engines: {node: '>=18'} 200 | cpu: [ppc64] 201 | os: [linux] 202 | 203 | '@esbuild/linux-riscv64@0.24.2': 204 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 205 | engines: {node: '>=18'} 206 | cpu: [riscv64] 207 | os: [linux] 208 | 209 | '@esbuild/linux-s390x@0.24.2': 210 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 211 | engines: {node: '>=18'} 212 | cpu: [s390x] 213 | os: [linux] 214 | 215 | '@esbuild/linux-x64@0.24.2': 216 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 217 | engines: {node: '>=18'} 218 | cpu: [x64] 219 | os: [linux] 220 | 221 | '@esbuild/netbsd-arm64@0.24.2': 222 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 223 | engines: {node: '>=18'} 224 | cpu: [arm64] 225 | os: [netbsd] 226 | 227 | '@esbuild/netbsd-x64@0.24.2': 228 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 229 | engines: {node: '>=18'} 230 | cpu: [x64] 231 | os: [netbsd] 232 | 233 | '@esbuild/openbsd-arm64@0.24.2': 234 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 235 | engines: {node: '>=18'} 236 | cpu: [arm64] 237 | os: [openbsd] 238 | 239 | '@esbuild/openbsd-x64@0.24.2': 240 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 241 | engines: {node: '>=18'} 242 | cpu: [x64] 243 | os: [openbsd] 244 | 245 | '@esbuild/sunos-x64@0.24.2': 246 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 247 | engines: {node: '>=18'} 248 | cpu: [x64] 249 | os: [sunos] 250 | 251 | '@esbuild/win32-arm64@0.24.2': 252 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 253 | engines: {node: '>=18'} 254 | cpu: [arm64] 255 | os: [win32] 256 | 257 | '@esbuild/win32-ia32@0.24.2': 258 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 259 | engines: {node: '>=18'} 260 | cpu: [ia32] 261 | os: [win32] 262 | 263 | '@esbuild/win32-x64@0.24.2': 264 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 265 | engines: {node: '>=18'} 266 | cpu: [x64] 267 | os: [win32] 268 | 269 | '@eslint-community/eslint-utils@4.4.1': 270 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 271 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 272 | peerDependencies: 273 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 274 | 275 | '@eslint-community/regexpp@4.12.1': 276 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 277 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 278 | 279 | '@eslint/config-array@0.19.2': 280 | resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} 281 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 282 | 283 | '@eslint/core@0.10.0': 284 | resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} 285 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 286 | 287 | '@eslint/eslintrc@3.2.0': 288 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 289 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 290 | 291 | '@eslint/js@9.19.0': 292 | resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} 293 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 294 | 295 | '@eslint/object-schema@2.1.6': 296 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 297 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 298 | 299 | '@eslint/plugin-kit@0.2.5': 300 | resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} 301 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 302 | 303 | '@finsweet/eslint-config@3.0.3': 304 | resolution: {integrity: sha512-TtN3531913OMnTVleaIQ80uybqYZJT3TPBaGvzqXl0nVTLh0ptMpUdfxVWxRGn/9+TCyfn03Smt726EAZODKNg==} 305 | peerDependencies: 306 | '@eslint/js': ^9.0.0 307 | eslint: ^9.0.0 308 | eslint-config-prettier: ^10.0.0 309 | eslint-plugin-prettier: ^5.0.0 310 | eslint-plugin-simple-import-sort: ^12.0.0 311 | prettier: ^3.0.0 312 | typescript: ^5.0.0 313 | typescript-eslint: ^8.0.0 314 | 315 | '@humanfs/core@0.19.1': 316 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 317 | engines: {node: '>=18.18.0'} 318 | 319 | '@humanfs/node@0.16.6': 320 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 321 | engines: {node: '>=18.18.0'} 322 | 323 | '@humanwhocodes/module-importer@1.0.1': 324 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 325 | engines: {node: '>=12.22'} 326 | 327 | '@humanwhocodes/retry@0.3.1': 328 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 329 | engines: {node: '>=18.18'} 330 | 331 | '@humanwhocodes/retry@0.4.1': 332 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 333 | engines: {node: '>=18.18'} 334 | 335 | '@manypkg/find-root@1.1.0': 336 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 337 | 338 | '@manypkg/get-packages@1.1.3': 339 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 340 | 341 | '@nodelib/fs.scandir@2.1.5': 342 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 343 | engines: {node: '>= 8'} 344 | 345 | '@nodelib/fs.stat@2.0.5': 346 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 347 | engines: {node: '>= 8'} 348 | 349 | '@nodelib/fs.walk@1.2.8': 350 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 351 | engines: {node: '>= 8'} 352 | 353 | '@pkgr/core@0.1.1': 354 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 355 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 356 | 357 | '@playwright/test@1.50.1': 358 | resolution: {integrity: sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==} 359 | engines: {node: '>=18'} 360 | hasBin: true 361 | 362 | '@types/estree@1.0.6': 363 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 364 | 365 | '@types/json-schema@7.0.15': 366 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 367 | 368 | '@types/node@12.20.55': 369 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 370 | 371 | '@typescript-eslint/eslint-plugin@8.23.0': 372 | resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} 373 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 374 | peerDependencies: 375 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 376 | eslint: ^8.57.0 || ^9.0.0 377 | typescript: '>=4.8.4 <5.8.0' 378 | 379 | '@typescript-eslint/parser@8.23.0': 380 | resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} 381 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 382 | peerDependencies: 383 | eslint: ^8.57.0 || ^9.0.0 384 | typescript: '>=4.8.4 <5.8.0' 385 | 386 | '@typescript-eslint/scope-manager@8.23.0': 387 | resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} 388 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 389 | 390 | '@typescript-eslint/type-utils@8.23.0': 391 | resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} 392 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 393 | peerDependencies: 394 | eslint: ^8.57.0 || ^9.0.0 395 | typescript: '>=4.8.4 <5.8.0' 396 | 397 | '@typescript-eslint/types@8.23.0': 398 | resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} 399 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 400 | 401 | '@typescript-eslint/typescript-estree@8.23.0': 402 | resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} 403 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 404 | peerDependencies: 405 | typescript: '>=4.8.4 <5.8.0' 406 | 407 | '@typescript-eslint/utils@8.23.0': 408 | resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} 409 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 410 | peerDependencies: 411 | eslint: ^8.57.0 || ^9.0.0 412 | typescript: '>=4.8.4 <5.8.0' 413 | 414 | '@typescript-eslint/visitor-keys@8.23.0': 415 | resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} 416 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 417 | 418 | acorn-jsx@5.3.2: 419 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 420 | peerDependencies: 421 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 422 | 423 | acorn@8.14.0: 424 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 425 | engines: {node: '>=0.4.0'} 426 | hasBin: true 427 | 428 | ajv@6.12.6: 429 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 430 | 431 | ansi-colors@4.1.3: 432 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 433 | engines: {node: '>=6'} 434 | 435 | ansi-regex@5.0.1: 436 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 437 | engines: {node: '>=8'} 438 | 439 | ansi-styles@4.3.0: 440 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 441 | engines: {node: '>=8'} 442 | 443 | argparse@1.0.10: 444 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 445 | 446 | argparse@2.0.1: 447 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 448 | 449 | array-union@2.1.0: 450 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 451 | engines: {node: '>=8'} 452 | 453 | balanced-match@1.0.2: 454 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 455 | 456 | better-path-resolve@1.0.0: 457 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 458 | engines: {node: '>=4'} 459 | 460 | brace-expansion@1.1.11: 461 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 462 | 463 | brace-expansion@2.0.1: 464 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 465 | 466 | braces@3.0.3: 467 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 468 | engines: {node: '>=8'} 469 | 470 | callsites@3.1.0: 471 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 472 | engines: {node: '>=6'} 473 | 474 | chalk@4.1.2: 475 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 476 | engines: {node: '>=10'} 477 | 478 | chardet@0.7.0: 479 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 480 | 481 | ci-info@3.9.0: 482 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 483 | engines: {node: '>=8'} 484 | 485 | color-convert@2.0.1: 486 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 487 | engines: {node: '>=7.0.0'} 488 | 489 | color-name@1.1.4: 490 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 491 | 492 | concat-map@0.0.1: 493 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 494 | 495 | cross-spawn@7.0.6: 496 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 497 | engines: {node: '>= 8'} 498 | 499 | debug@4.4.0: 500 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 501 | engines: {node: '>=6.0'} 502 | peerDependencies: 503 | supports-color: '*' 504 | peerDependenciesMeta: 505 | supports-color: 506 | optional: true 507 | 508 | deep-is@0.1.4: 509 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 510 | 511 | detect-indent@6.1.0: 512 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 513 | engines: {node: '>=8'} 514 | 515 | dir-glob@3.0.1: 516 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 517 | engines: {node: '>=8'} 518 | 519 | enquirer@2.4.1: 520 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 521 | engines: {node: '>=8.6'} 522 | 523 | esbuild@0.24.2: 524 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 525 | engines: {node: '>=18'} 526 | hasBin: true 527 | 528 | escape-string-regexp@4.0.0: 529 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 530 | engines: {node: '>=10'} 531 | 532 | eslint-config-prettier@10.0.1: 533 | resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} 534 | hasBin: true 535 | peerDependencies: 536 | eslint: '>=7.0.0' 537 | 538 | eslint-plugin-prettier@5.2.3: 539 | resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} 540 | engines: {node: ^14.18.0 || >=16.0.0} 541 | peerDependencies: 542 | '@types/eslint': '>=8.0.0' 543 | eslint: '>=8.0.0' 544 | eslint-config-prettier: '*' 545 | prettier: '>=3.0.0' 546 | peerDependenciesMeta: 547 | '@types/eslint': 548 | optional: true 549 | eslint-config-prettier: 550 | optional: true 551 | 552 | eslint-plugin-simple-import-sort@12.1.1: 553 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 554 | peerDependencies: 555 | eslint: '>=5.0.0' 556 | 557 | eslint-scope@8.2.0: 558 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 559 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 560 | 561 | eslint-visitor-keys@3.4.3: 562 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 563 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 564 | 565 | eslint-visitor-keys@4.2.0: 566 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 567 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 568 | 569 | eslint@9.19.0: 570 | resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} 571 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 572 | hasBin: true 573 | peerDependencies: 574 | jiti: '*' 575 | peerDependenciesMeta: 576 | jiti: 577 | optional: true 578 | 579 | espree@10.3.0: 580 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 581 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 582 | 583 | esprima@4.0.1: 584 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 585 | engines: {node: '>=4'} 586 | hasBin: true 587 | 588 | esquery@1.6.0: 589 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 590 | engines: {node: '>=0.10'} 591 | 592 | esrecurse@4.3.0: 593 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 594 | engines: {node: '>=4.0'} 595 | 596 | estraverse@5.3.0: 597 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 598 | engines: {node: '>=4.0'} 599 | 600 | esutils@2.0.3: 601 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 602 | engines: {node: '>=0.10.0'} 603 | 604 | extendable-error@0.1.7: 605 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 606 | 607 | external-editor@3.1.0: 608 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 609 | engines: {node: '>=4'} 610 | 611 | fast-deep-equal@3.1.3: 612 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 613 | 614 | fast-diff@1.3.0: 615 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 616 | 617 | fast-glob@3.3.3: 618 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 619 | engines: {node: '>=8.6.0'} 620 | 621 | fast-json-stable-stringify@2.1.0: 622 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 623 | 624 | fast-levenshtein@2.0.6: 625 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 626 | 627 | fastq@1.19.0: 628 | resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} 629 | 630 | file-entry-cache@8.0.0: 631 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 632 | engines: {node: '>=16.0.0'} 633 | 634 | fill-range@7.1.1: 635 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 636 | engines: {node: '>=8'} 637 | 638 | find-up@4.1.0: 639 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 640 | engines: {node: '>=8'} 641 | 642 | find-up@5.0.0: 643 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 644 | engines: {node: '>=10'} 645 | 646 | flat-cache@4.0.1: 647 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 648 | engines: {node: '>=16'} 649 | 650 | flatted@3.3.2: 651 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 652 | 653 | fs-extra@7.0.1: 654 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 655 | engines: {node: '>=6 <7 || >=8'} 656 | 657 | fs-extra@8.1.0: 658 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 659 | engines: {node: '>=6 <7 || >=8'} 660 | 661 | fsevents@2.3.2: 662 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 663 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 664 | os: [darwin] 665 | 666 | glob-parent@5.1.2: 667 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 668 | engines: {node: '>= 6'} 669 | 670 | glob-parent@6.0.2: 671 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 672 | engines: {node: '>=10.13.0'} 673 | 674 | globals@14.0.0: 675 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 676 | engines: {node: '>=18'} 677 | 678 | globby@11.1.0: 679 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 680 | engines: {node: '>=10'} 681 | 682 | graceful-fs@4.2.11: 683 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 684 | 685 | graphemer@1.4.0: 686 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 687 | 688 | has-flag@4.0.0: 689 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 690 | engines: {node: '>=8'} 691 | 692 | human-id@1.0.2: 693 | resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 694 | 695 | iconv-lite@0.4.24: 696 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 697 | engines: {node: '>=0.10.0'} 698 | 699 | ignore@5.3.2: 700 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 701 | engines: {node: '>= 4'} 702 | 703 | import-fresh@3.3.1: 704 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 705 | engines: {node: '>=6'} 706 | 707 | imurmurhash@0.1.4: 708 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 709 | engines: {node: '>=0.8.19'} 710 | 711 | is-extglob@2.1.1: 712 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 713 | engines: {node: '>=0.10.0'} 714 | 715 | is-glob@4.0.3: 716 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 717 | engines: {node: '>=0.10.0'} 718 | 719 | is-number@7.0.0: 720 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 721 | engines: {node: '>=0.12.0'} 722 | 723 | is-subdir@1.2.0: 724 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 725 | engines: {node: '>=4'} 726 | 727 | is-windows@1.0.2: 728 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 729 | engines: {node: '>=0.10.0'} 730 | 731 | isexe@2.0.0: 732 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 733 | 734 | jose@5.9.6: 735 | resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} 736 | 737 | js-yaml@3.14.1: 738 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 739 | hasBin: true 740 | 741 | js-yaml@4.1.0: 742 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 743 | hasBin: true 744 | 745 | json-buffer@3.0.1: 746 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 747 | 748 | json-schema-traverse@0.4.1: 749 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 750 | 751 | json-stable-stringify-without-jsonify@1.0.1: 752 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 753 | 754 | jsonfile@4.0.0: 755 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 756 | 757 | keyv@4.5.4: 758 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 759 | 760 | levn@0.4.1: 761 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 762 | engines: {node: '>= 0.8.0'} 763 | 764 | locate-path@5.0.0: 765 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 766 | engines: {node: '>=8'} 767 | 768 | locate-path@6.0.0: 769 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 770 | engines: {node: '>=10'} 771 | 772 | lodash.merge@4.6.2: 773 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 774 | 775 | lodash.startcase@4.4.0: 776 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 777 | 778 | merge2@1.4.1: 779 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 780 | engines: {node: '>= 8'} 781 | 782 | micromatch@4.0.8: 783 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 784 | engines: {node: '>=8.6'} 785 | 786 | minimatch@3.1.2: 787 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 788 | 789 | minimatch@9.0.5: 790 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 791 | engines: {node: '>=16 || 14 >=14.17'} 792 | 793 | mri@1.2.0: 794 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 795 | engines: {node: '>=4'} 796 | 797 | ms@2.1.3: 798 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 799 | 800 | natural-compare@1.4.0: 801 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 802 | 803 | optionator@0.9.4: 804 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 805 | engines: {node: '>= 0.8.0'} 806 | 807 | os-tmpdir@1.0.2: 808 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 809 | engines: {node: '>=0.10.0'} 810 | 811 | outdent@0.5.0: 812 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 813 | 814 | p-filter@2.1.0: 815 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 816 | engines: {node: '>=8'} 817 | 818 | p-limit@2.3.0: 819 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 820 | engines: {node: '>=6'} 821 | 822 | p-limit@3.1.0: 823 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 824 | engines: {node: '>=10'} 825 | 826 | p-locate@4.1.0: 827 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 828 | engines: {node: '>=8'} 829 | 830 | p-locate@5.0.0: 831 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 832 | engines: {node: '>=10'} 833 | 834 | p-map@2.1.0: 835 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 836 | engines: {node: '>=6'} 837 | 838 | p-try@2.2.0: 839 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 840 | engines: {node: '>=6'} 841 | 842 | package-manager-detector@0.2.9: 843 | resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} 844 | 845 | parent-module@1.0.1: 846 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 847 | engines: {node: '>=6'} 848 | 849 | path-exists@4.0.0: 850 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 851 | engines: {node: '>=8'} 852 | 853 | path-key@3.1.1: 854 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 855 | engines: {node: '>=8'} 856 | 857 | path-type@4.0.0: 858 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 859 | engines: {node: '>=8'} 860 | 861 | picocolors@1.1.1: 862 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 863 | 864 | picomatch@2.3.1: 865 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 866 | engines: {node: '>=8.6'} 867 | 868 | pify@4.0.1: 869 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 870 | engines: {node: '>=6'} 871 | 872 | playwright-core@1.50.1: 873 | resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} 874 | engines: {node: '>=18'} 875 | hasBin: true 876 | 877 | playwright@1.50.1: 878 | resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} 879 | engines: {node: '>=18'} 880 | hasBin: true 881 | 882 | prelude-ls@1.2.1: 883 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 884 | engines: {node: '>= 0.8.0'} 885 | 886 | prettier-linter-helpers@1.0.0: 887 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 888 | engines: {node: '>=6.0.0'} 889 | 890 | prettier@2.8.8: 891 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 892 | engines: {node: '>=10.13.0'} 893 | hasBin: true 894 | 895 | prettier@3.4.2: 896 | resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} 897 | engines: {node: '>=14'} 898 | hasBin: true 899 | 900 | punycode@2.3.1: 901 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 902 | engines: {node: '>=6'} 903 | 904 | queue-microtask@1.2.3: 905 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 906 | 907 | read-yaml-file@1.1.0: 908 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 909 | engines: {node: '>=6'} 910 | 911 | regenerator-runtime@0.14.1: 912 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 913 | 914 | resolve-from@4.0.0: 915 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 916 | engines: {node: '>=4'} 917 | 918 | resolve-from@5.0.0: 919 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 920 | engines: {node: '>=8'} 921 | 922 | reusify@1.0.4: 923 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 924 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 925 | 926 | run-parallel@1.2.0: 927 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 928 | 929 | safer-buffer@2.1.2: 930 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 931 | 932 | semver@7.7.1: 933 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 934 | engines: {node: '>=10'} 935 | hasBin: true 936 | 937 | shebang-command@2.0.0: 938 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 939 | engines: {node: '>=8'} 940 | 941 | shebang-regex@3.0.0: 942 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 943 | engines: {node: '>=8'} 944 | 945 | signal-exit@4.1.0: 946 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 947 | engines: {node: '>=14'} 948 | 949 | slash@3.0.0: 950 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 951 | engines: {node: '>=8'} 952 | 953 | spawndamnit@3.0.1: 954 | resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} 955 | 956 | sprintf-js@1.0.3: 957 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 958 | 959 | strip-ansi@6.0.1: 960 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 961 | engines: {node: '>=8'} 962 | 963 | strip-bom@3.0.0: 964 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 965 | engines: {node: '>=4'} 966 | 967 | strip-json-comments@3.1.1: 968 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 969 | engines: {node: '>=8'} 970 | 971 | superstruct@2.0.2: 972 | resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} 973 | engines: {node: '>=14.0.0'} 974 | 975 | supports-color@7.2.0: 976 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 977 | engines: {node: '>=8'} 978 | 979 | synckit@0.9.2: 980 | resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} 981 | engines: {node: ^14.18.0 || >=16.0.0} 982 | 983 | term-size@2.2.1: 984 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 985 | engines: {node: '>=8'} 986 | 987 | tmp@0.0.33: 988 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 989 | engines: {node: '>=0.6.0'} 990 | 991 | to-regex-range@5.0.1: 992 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 993 | engines: {node: '>=8.0'} 994 | 995 | ts-api-utils@2.0.1: 996 | resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} 997 | engines: {node: '>=18.12'} 998 | peerDependencies: 999 | typescript: '>=4.8.4' 1000 | 1001 | tslib@2.8.1: 1002 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1003 | 1004 | type-check@0.4.0: 1005 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1006 | engines: {node: '>= 0.8.0'} 1007 | 1008 | typescript-eslint@8.23.0: 1009 | resolution: {integrity: sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==} 1010 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1011 | peerDependencies: 1012 | eslint: ^8.57.0 || ^9.0.0 1013 | typescript: '>=4.8.4 <5.8.0' 1014 | 1015 | typescript@5.7.3: 1016 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1017 | engines: {node: '>=14.17'} 1018 | hasBin: true 1019 | 1020 | universalify@0.1.2: 1021 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1022 | engines: {node: '>= 4.0.0'} 1023 | 1024 | uri-js@4.4.1: 1025 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1026 | 1027 | which@2.0.2: 1028 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1029 | engines: {node: '>= 8'} 1030 | hasBin: true 1031 | 1032 | word-wrap@1.2.5: 1033 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1034 | engines: {node: '>=0.10.0'} 1035 | 1036 | yocto-queue@0.1.0: 1037 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1038 | engines: {node: '>=10'} 1039 | 1040 | snapshots: 1041 | 1042 | '@babel/runtime@7.26.7': 1043 | dependencies: 1044 | regenerator-runtime: 0.14.1 1045 | 1046 | '@changesets/apply-release-plan@7.0.8': 1047 | dependencies: 1048 | '@changesets/config': 3.0.5 1049 | '@changesets/get-version-range-type': 0.4.0 1050 | '@changesets/git': 3.0.2 1051 | '@changesets/should-skip-package': 0.1.1 1052 | '@changesets/types': 6.0.0 1053 | '@manypkg/get-packages': 1.1.3 1054 | detect-indent: 6.1.0 1055 | fs-extra: 7.0.1 1056 | lodash.startcase: 4.4.0 1057 | outdent: 0.5.0 1058 | prettier: 2.8.8 1059 | resolve-from: 5.0.0 1060 | semver: 7.7.1 1061 | 1062 | '@changesets/assemble-release-plan@6.0.5': 1063 | dependencies: 1064 | '@changesets/errors': 0.2.0 1065 | '@changesets/get-dependents-graph': 2.1.2 1066 | '@changesets/should-skip-package': 0.1.1 1067 | '@changesets/types': 6.0.0 1068 | '@manypkg/get-packages': 1.1.3 1069 | semver: 7.7.1 1070 | 1071 | '@changesets/changelog-git@0.2.0': 1072 | dependencies: 1073 | '@changesets/types': 6.0.0 1074 | 1075 | '@changesets/cli@2.27.12': 1076 | dependencies: 1077 | '@changesets/apply-release-plan': 7.0.8 1078 | '@changesets/assemble-release-plan': 6.0.5 1079 | '@changesets/changelog-git': 0.2.0 1080 | '@changesets/config': 3.0.5 1081 | '@changesets/errors': 0.2.0 1082 | '@changesets/get-dependents-graph': 2.1.2 1083 | '@changesets/get-release-plan': 4.0.6 1084 | '@changesets/git': 3.0.2 1085 | '@changesets/logger': 0.1.1 1086 | '@changesets/pre': 2.0.1 1087 | '@changesets/read': 0.6.2 1088 | '@changesets/should-skip-package': 0.1.1 1089 | '@changesets/types': 6.0.0 1090 | '@changesets/write': 0.3.2 1091 | '@manypkg/get-packages': 1.1.3 1092 | ansi-colors: 4.1.3 1093 | ci-info: 3.9.0 1094 | enquirer: 2.4.1 1095 | external-editor: 3.1.0 1096 | fs-extra: 7.0.1 1097 | mri: 1.2.0 1098 | p-limit: 2.3.0 1099 | package-manager-detector: 0.2.9 1100 | picocolors: 1.1.1 1101 | resolve-from: 5.0.0 1102 | semver: 7.7.1 1103 | spawndamnit: 3.0.1 1104 | term-size: 2.2.1 1105 | 1106 | '@changesets/config@3.0.5': 1107 | dependencies: 1108 | '@changesets/errors': 0.2.0 1109 | '@changesets/get-dependents-graph': 2.1.2 1110 | '@changesets/logger': 0.1.1 1111 | '@changesets/types': 6.0.0 1112 | '@manypkg/get-packages': 1.1.3 1113 | fs-extra: 7.0.1 1114 | micromatch: 4.0.8 1115 | 1116 | '@changesets/errors@0.2.0': 1117 | dependencies: 1118 | extendable-error: 0.1.7 1119 | 1120 | '@changesets/get-dependents-graph@2.1.2': 1121 | dependencies: 1122 | '@changesets/types': 6.0.0 1123 | '@manypkg/get-packages': 1.1.3 1124 | picocolors: 1.1.1 1125 | semver: 7.7.1 1126 | 1127 | '@changesets/get-release-plan@4.0.6': 1128 | dependencies: 1129 | '@changesets/assemble-release-plan': 6.0.5 1130 | '@changesets/config': 3.0.5 1131 | '@changesets/pre': 2.0.1 1132 | '@changesets/read': 0.6.2 1133 | '@changesets/types': 6.0.0 1134 | '@manypkg/get-packages': 1.1.3 1135 | 1136 | '@changesets/get-version-range-type@0.4.0': {} 1137 | 1138 | '@changesets/git@3.0.2': 1139 | dependencies: 1140 | '@changesets/errors': 0.2.0 1141 | '@manypkg/get-packages': 1.1.3 1142 | is-subdir: 1.2.0 1143 | micromatch: 4.0.8 1144 | spawndamnit: 3.0.1 1145 | 1146 | '@changesets/logger@0.1.1': 1147 | dependencies: 1148 | picocolors: 1.1.1 1149 | 1150 | '@changesets/parse@0.4.0': 1151 | dependencies: 1152 | '@changesets/types': 6.0.0 1153 | js-yaml: 3.14.1 1154 | 1155 | '@changesets/pre@2.0.1': 1156 | dependencies: 1157 | '@changesets/errors': 0.2.0 1158 | '@changesets/types': 6.0.0 1159 | '@manypkg/get-packages': 1.1.3 1160 | fs-extra: 7.0.1 1161 | 1162 | '@changesets/read@0.6.2': 1163 | dependencies: 1164 | '@changesets/git': 3.0.2 1165 | '@changesets/logger': 0.1.1 1166 | '@changesets/parse': 0.4.0 1167 | '@changesets/types': 6.0.0 1168 | fs-extra: 7.0.1 1169 | p-filter: 2.1.0 1170 | picocolors: 1.1.1 1171 | 1172 | '@changesets/should-skip-package@0.1.1': 1173 | dependencies: 1174 | '@changesets/types': 6.0.0 1175 | '@manypkg/get-packages': 1.1.3 1176 | 1177 | '@changesets/types@4.1.0': {} 1178 | 1179 | '@changesets/types@6.0.0': {} 1180 | 1181 | '@changesets/write@0.3.2': 1182 | dependencies: 1183 | '@changesets/types': 6.0.0 1184 | fs-extra: 7.0.1 1185 | human-id: 1.0.2 1186 | prettier: 2.8.8 1187 | 1188 | '@esbuild/aix-ppc64@0.24.2': 1189 | optional: true 1190 | 1191 | '@esbuild/android-arm64@0.24.2': 1192 | optional: true 1193 | 1194 | '@esbuild/android-arm@0.24.2': 1195 | optional: true 1196 | 1197 | '@esbuild/android-x64@0.24.2': 1198 | optional: true 1199 | 1200 | '@esbuild/darwin-arm64@0.24.2': 1201 | optional: true 1202 | 1203 | '@esbuild/darwin-x64@0.24.2': 1204 | optional: true 1205 | 1206 | '@esbuild/freebsd-arm64@0.24.2': 1207 | optional: true 1208 | 1209 | '@esbuild/freebsd-x64@0.24.2': 1210 | optional: true 1211 | 1212 | '@esbuild/linux-arm64@0.24.2': 1213 | optional: true 1214 | 1215 | '@esbuild/linux-arm@0.24.2': 1216 | optional: true 1217 | 1218 | '@esbuild/linux-ia32@0.24.2': 1219 | optional: true 1220 | 1221 | '@esbuild/linux-loong64@0.24.2': 1222 | optional: true 1223 | 1224 | '@esbuild/linux-mips64el@0.24.2': 1225 | optional: true 1226 | 1227 | '@esbuild/linux-ppc64@0.24.2': 1228 | optional: true 1229 | 1230 | '@esbuild/linux-riscv64@0.24.2': 1231 | optional: true 1232 | 1233 | '@esbuild/linux-s390x@0.24.2': 1234 | optional: true 1235 | 1236 | '@esbuild/linux-x64@0.24.2': 1237 | optional: true 1238 | 1239 | '@esbuild/netbsd-arm64@0.24.2': 1240 | optional: true 1241 | 1242 | '@esbuild/netbsd-x64@0.24.2': 1243 | optional: true 1244 | 1245 | '@esbuild/openbsd-arm64@0.24.2': 1246 | optional: true 1247 | 1248 | '@esbuild/openbsd-x64@0.24.2': 1249 | optional: true 1250 | 1251 | '@esbuild/sunos-x64@0.24.2': 1252 | optional: true 1253 | 1254 | '@esbuild/win32-arm64@0.24.2': 1255 | optional: true 1256 | 1257 | '@esbuild/win32-ia32@0.24.2': 1258 | optional: true 1259 | 1260 | '@esbuild/win32-x64@0.24.2': 1261 | optional: true 1262 | 1263 | '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0)': 1264 | dependencies: 1265 | eslint: 9.19.0 1266 | eslint-visitor-keys: 3.4.3 1267 | 1268 | '@eslint-community/regexpp@4.12.1': {} 1269 | 1270 | '@eslint/config-array@0.19.2': 1271 | dependencies: 1272 | '@eslint/object-schema': 2.1.6 1273 | debug: 4.4.0 1274 | minimatch: 3.1.2 1275 | transitivePeerDependencies: 1276 | - supports-color 1277 | 1278 | '@eslint/core@0.10.0': 1279 | dependencies: 1280 | '@types/json-schema': 7.0.15 1281 | 1282 | '@eslint/eslintrc@3.2.0': 1283 | dependencies: 1284 | ajv: 6.12.6 1285 | debug: 4.4.0 1286 | espree: 10.3.0 1287 | globals: 14.0.0 1288 | ignore: 5.3.2 1289 | import-fresh: 3.3.1 1290 | js-yaml: 4.1.0 1291 | minimatch: 3.1.2 1292 | strip-json-comments: 3.1.1 1293 | transitivePeerDependencies: 1294 | - supports-color 1295 | 1296 | '@eslint/js@9.19.0': {} 1297 | 1298 | '@eslint/object-schema@2.1.6': {} 1299 | 1300 | '@eslint/plugin-kit@0.2.5': 1301 | dependencies: 1302 | '@eslint/core': 0.10.0 1303 | levn: 0.4.1 1304 | 1305 | '@finsweet/eslint-config@3.0.3(@eslint/js@9.19.0)(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2))(eslint-plugin-simple-import-sort@12.1.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2)(typescript-eslint@8.23.0(eslint@9.19.0)(typescript@5.7.3))(typescript@5.7.3)': 1306 | dependencies: 1307 | '@eslint/js': 9.19.0 1308 | eslint: 9.19.0 1309 | eslint-config-prettier: 10.0.1(eslint@9.19.0) 1310 | eslint-plugin-prettier: 5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2) 1311 | eslint-plugin-simple-import-sort: 12.1.1(eslint@9.19.0) 1312 | prettier: 3.4.2 1313 | typescript: 5.7.3 1314 | typescript-eslint: 8.23.0(eslint@9.19.0)(typescript@5.7.3) 1315 | 1316 | '@humanfs/core@0.19.1': {} 1317 | 1318 | '@humanfs/node@0.16.6': 1319 | dependencies: 1320 | '@humanfs/core': 0.19.1 1321 | '@humanwhocodes/retry': 0.3.1 1322 | 1323 | '@humanwhocodes/module-importer@1.0.1': {} 1324 | 1325 | '@humanwhocodes/retry@0.3.1': {} 1326 | 1327 | '@humanwhocodes/retry@0.4.1': {} 1328 | 1329 | '@manypkg/find-root@1.1.0': 1330 | dependencies: 1331 | '@babel/runtime': 7.26.7 1332 | '@types/node': 12.20.55 1333 | find-up: 4.1.0 1334 | fs-extra: 8.1.0 1335 | 1336 | '@manypkg/get-packages@1.1.3': 1337 | dependencies: 1338 | '@babel/runtime': 7.26.7 1339 | '@changesets/types': 4.1.0 1340 | '@manypkg/find-root': 1.1.0 1341 | fs-extra: 8.1.0 1342 | globby: 11.1.0 1343 | read-yaml-file: 1.1.0 1344 | 1345 | '@nodelib/fs.scandir@2.1.5': 1346 | dependencies: 1347 | '@nodelib/fs.stat': 2.0.5 1348 | run-parallel: 1.2.0 1349 | 1350 | '@nodelib/fs.stat@2.0.5': {} 1351 | 1352 | '@nodelib/fs.walk@1.2.8': 1353 | dependencies: 1354 | '@nodelib/fs.scandir': 2.1.5 1355 | fastq: 1.19.0 1356 | 1357 | '@pkgr/core@0.1.1': {} 1358 | 1359 | '@playwright/test@1.50.1': 1360 | dependencies: 1361 | playwright: 1.50.1 1362 | 1363 | '@types/estree@1.0.6': {} 1364 | 1365 | '@types/json-schema@7.0.15': {} 1366 | 1367 | '@types/node@12.20.55': {} 1368 | 1369 | '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3)': 1370 | dependencies: 1371 | '@eslint-community/regexpp': 4.12.1 1372 | '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) 1373 | '@typescript-eslint/scope-manager': 8.23.0 1374 | '@typescript-eslint/type-utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) 1375 | '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) 1376 | '@typescript-eslint/visitor-keys': 8.23.0 1377 | eslint: 9.19.0 1378 | graphemer: 1.4.0 1379 | ignore: 5.3.2 1380 | natural-compare: 1.4.0 1381 | ts-api-utils: 2.0.1(typescript@5.7.3) 1382 | typescript: 5.7.3 1383 | transitivePeerDependencies: 1384 | - supports-color 1385 | 1386 | '@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3)': 1387 | dependencies: 1388 | '@typescript-eslint/scope-manager': 8.23.0 1389 | '@typescript-eslint/types': 8.23.0 1390 | '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) 1391 | '@typescript-eslint/visitor-keys': 8.23.0 1392 | debug: 4.4.0 1393 | eslint: 9.19.0 1394 | typescript: 5.7.3 1395 | transitivePeerDependencies: 1396 | - supports-color 1397 | 1398 | '@typescript-eslint/scope-manager@8.23.0': 1399 | dependencies: 1400 | '@typescript-eslint/types': 8.23.0 1401 | '@typescript-eslint/visitor-keys': 8.23.0 1402 | 1403 | '@typescript-eslint/type-utils@8.23.0(eslint@9.19.0)(typescript@5.7.3)': 1404 | dependencies: 1405 | '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) 1406 | '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) 1407 | debug: 4.4.0 1408 | eslint: 9.19.0 1409 | ts-api-utils: 2.0.1(typescript@5.7.3) 1410 | typescript: 5.7.3 1411 | transitivePeerDependencies: 1412 | - supports-color 1413 | 1414 | '@typescript-eslint/types@8.23.0': {} 1415 | 1416 | '@typescript-eslint/typescript-estree@8.23.0(typescript@5.7.3)': 1417 | dependencies: 1418 | '@typescript-eslint/types': 8.23.0 1419 | '@typescript-eslint/visitor-keys': 8.23.0 1420 | debug: 4.4.0 1421 | fast-glob: 3.3.3 1422 | is-glob: 4.0.3 1423 | minimatch: 9.0.5 1424 | semver: 7.7.1 1425 | ts-api-utils: 2.0.1(typescript@5.7.3) 1426 | typescript: 5.7.3 1427 | transitivePeerDependencies: 1428 | - supports-color 1429 | 1430 | '@typescript-eslint/utils@8.23.0(eslint@9.19.0)(typescript@5.7.3)': 1431 | dependencies: 1432 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) 1433 | '@typescript-eslint/scope-manager': 8.23.0 1434 | '@typescript-eslint/types': 8.23.0 1435 | '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) 1436 | eslint: 9.19.0 1437 | typescript: 5.7.3 1438 | transitivePeerDependencies: 1439 | - supports-color 1440 | 1441 | '@typescript-eslint/visitor-keys@8.23.0': 1442 | dependencies: 1443 | '@typescript-eslint/types': 8.23.0 1444 | eslint-visitor-keys: 4.2.0 1445 | 1446 | acorn-jsx@5.3.2(acorn@8.14.0): 1447 | dependencies: 1448 | acorn: 8.14.0 1449 | 1450 | acorn@8.14.0: {} 1451 | 1452 | ajv@6.12.6: 1453 | dependencies: 1454 | fast-deep-equal: 3.1.3 1455 | fast-json-stable-stringify: 2.1.0 1456 | json-schema-traverse: 0.4.1 1457 | uri-js: 4.4.1 1458 | 1459 | ansi-colors@4.1.3: {} 1460 | 1461 | ansi-regex@5.0.1: {} 1462 | 1463 | ansi-styles@4.3.0: 1464 | dependencies: 1465 | color-convert: 2.0.1 1466 | 1467 | argparse@1.0.10: 1468 | dependencies: 1469 | sprintf-js: 1.0.3 1470 | 1471 | argparse@2.0.1: {} 1472 | 1473 | array-union@2.1.0: {} 1474 | 1475 | balanced-match@1.0.2: {} 1476 | 1477 | better-path-resolve@1.0.0: 1478 | dependencies: 1479 | is-windows: 1.0.2 1480 | 1481 | brace-expansion@1.1.11: 1482 | dependencies: 1483 | balanced-match: 1.0.2 1484 | concat-map: 0.0.1 1485 | 1486 | brace-expansion@2.0.1: 1487 | dependencies: 1488 | balanced-match: 1.0.2 1489 | 1490 | braces@3.0.3: 1491 | dependencies: 1492 | fill-range: 7.1.1 1493 | 1494 | callsites@3.1.0: {} 1495 | 1496 | chalk@4.1.2: 1497 | dependencies: 1498 | ansi-styles: 4.3.0 1499 | supports-color: 7.2.0 1500 | 1501 | chardet@0.7.0: {} 1502 | 1503 | ci-info@3.9.0: {} 1504 | 1505 | color-convert@2.0.1: 1506 | dependencies: 1507 | color-name: 1.1.4 1508 | 1509 | color-name@1.1.4: {} 1510 | 1511 | concat-map@0.0.1: {} 1512 | 1513 | cross-spawn@7.0.6: 1514 | dependencies: 1515 | path-key: 3.1.1 1516 | shebang-command: 2.0.0 1517 | which: 2.0.2 1518 | 1519 | debug@4.4.0: 1520 | dependencies: 1521 | ms: 2.1.3 1522 | 1523 | deep-is@0.1.4: {} 1524 | 1525 | detect-indent@6.1.0: {} 1526 | 1527 | dir-glob@3.0.1: 1528 | dependencies: 1529 | path-type: 4.0.0 1530 | 1531 | enquirer@2.4.1: 1532 | dependencies: 1533 | ansi-colors: 4.1.3 1534 | strip-ansi: 6.0.1 1535 | 1536 | esbuild@0.24.2: 1537 | optionalDependencies: 1538 | '@esbuild/aix-ppc64': 0.24.2 1539 | '@esbuild/android-arm': 0.24.2 1540 | '@esbuild/android-arm64': 0.24.2 1541 | '@esbuild/android-x64': 0.24.2 1542 | '@esbuild/darwin-arm64': 0.24.2 1543 | '@esbuild/darwin-x64': 0.24.2 1544 | '@esbuild/freebsd-arm64': 0.24.2 1545 | '@esbuild/freebsd-x64': 0.24.2 1546 | '@esbuild/linux-arm': 0.24.2 1547 | '@esbuild/linux-arm64': 0.24.2 1548 | '@esbuild/linux-ia32': 0.24.2 1549 | '@esbuild/linux-loong64': 0.24.2 1550 | '@esbuild/linux-mips64el': 0.24.2 1551 | '@esbuild/linux-ppc64': 0.24.2 1552 | '@esbuild/linux-riscv64': 0.24.2 1553 | '@esbuild/linux-s390x': 0.24.2 1554 | '@esbuild/linux-x64': 0.24.2 1555 | '@esbuild/netbsd-arm64': 0.24.2 1556 | '@esbuild/netbsd-x64': 0.24.2 1557 | '@esbuild/openbsd-arm64': 0.24.2 1558 | '@esbuild/openbsd-x64': 0.24.2 1559 | '@esbuild/sunos-x64': 0.24.2 1560 | '@esbuild/win32-arm64': 0.24.2 1561 | '@esbuild/win32-ia32': 0.24.2 1562 | '@esbuild/win32-x64': 0.24.2 1563 | 1564 | escape-string-regexp@4.0.0: {} 1565 | 1566 | eslint-config-prettier@10.0.1(eslint@9.19.0): 1567 | dependencies: 1568 | eslint: 9.19.0 1569 | 1570 | eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2): 1571 | dependencies: 1572 | eslint: 9.19.0 1573 | prettier: 3.4.2 1574 | prettier-linter-helpers: 1.0.0 1575 | synckit: 0.9.2 1576 | optionalDependencies: 1577 | eslint-config-prettier: 10.0.1(eslint@9.19.0) 1578 | 1579 | eslint-plugin-simple-import-sort@12.1.1(eslint@9.19.0): 1580 | dependencies: 1581 | eslint: 9.19.0 1582 | 1583 | eslint-scope@8.2.0: 1584 | dependencies: 1585 | esrecurse: 4.3.0 1586 | estraverse: 5.3.0 1587 | 1588 | eslint-visitor-keys@3.4.3: {} 1589 | 1590 | eslint-visitor-keys@4.2.0: {} 1591 | 1592 | eslint@9.19.0: 1593 | dependencies: 1594 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) 1595 | '@eslint-community/regexpp': 4.12.1 1596 | '@eslint/config-array': 0.19.2 1597 | '@eslint/core': 0.10.0 1598 | '@eslint/eslintrc': 3.2.0 1599 | '@eslint/js': 9.19.0 1600 | '@eslint/plugin-kit': 0.2.5 1601 | '@humanfs/node': 0.16.6 1602 | '@humanwhocodes/module-importer': 1.0.1 1603 | '@humanwhocodes/retry': 0.4.1 1604 | '@types/estree': 1.0.6 1605 | '@types/json-schema': 7.0.15 1606 | ajv: 6.12.6 1607 | chalk: 4.1.2 1608 | cross-spawn: 7.0.6 1609 | debug: 4.4.0 1610 | escape-string-regexp: 4.0.0 1611 | eslint-scope: 8.2.0 1612 | eslint-visitor-keys: 4.2.0 1613 | espree: 10.3.0 1614 | esquery: 1.6.0 1615 | esutils: 2.0.3 1616 | fast-deep-equal: 3.1.3 1617 | file-entry-cache: 8.0.0 1618 | find-up: 5.0.0 1619 | glob-parent: 6.0.2 1620 | ignore: 5.3.2 1621 | imurmurhash: 0.1.4 1622 | is-glob: 4.0.3 1623 | json-stable-stringify-without-jsonify: 1.0.1 1624 | lodash.merge: 4.6.2 1625 | minimatch: 3.1.2 1626 | natural-compare: 1.4.0 1627 | optionator: 0.9.4 1628 | transitivePeerDependencies: 1629 | - supports-color 1630 | 1631 | espree@10.3.0: 1632 | dependencies: 1633 | acorn: 8.14.0 1634 | acorn-jsx: 5.3.2(acorn@8.14.0) 1635 | eslint-visitor-keys: 4.2.0 1636 | 1637 | esprima@4.0.1: {} 1638 | 1639 | esquery@1.6.0: 1640 | dependencies: 1641 | estraverse: 5.3.0 1642 | 1643 | esrecurse@4.3.0: 1644 | dependencies: 1645 | estraverse: 5.3.0 1646 | 1647 | estraverse@5.3.0: {} 1648 | 1649 | esutils@2.0.3: {} 1650 | 1651 | extendable-error@0.1.7: {} 1652 | 1653 | external-editor@3.1.0: 1654 | dependencies: 1655 | chardet: 0.7.0 1656 | iconv-lite: 0.4.24 1657 | tmp: 0.0.33 1658 | 1659 | fast-deep-equal@3.1.3: {} 1660 | 1661 | fast-diff@1.3.0: {} 1662 | 1663 | fast-glob@3.3.3: 1664 | dependencies: 1665 | '@nodelib/fs.stat': 2.0.5 1666 | '@nodelib/fs.walk': 1.2.8 1667 | glob-parent: 5.1.2 1668 | merge2: 1.4.1 1669 | micromatch: 4.0.8 1670 | 1671 | fast-json-stable-stringify@2.1.0: {} 1672 | 1673 | fast-levenshtein@2.0.6: {} 1674 | 1675 | fastq@1.19.0: 1676 | dependencies: 1677 | reusify: 1.0.4 1678 | 1679 | file-entry-cache@8.0.0: 1680 | dependencies: 1681 | flat-cache: 4.0.1 1682 | 1683 | fill-range@7.1.1: 1684 | dependencies: 1685 | to-regex-range: 5.0.1 1686 | 1687 | find-up@4.1.0: 1688 | dependencies: 1689 | locate-path: 5.0.0 1690 | path-exists: 4.0.0 1691 | 1692 | find-up@5.0.0: 1693 | dependencies: 1694 | locate-path: 6.0.0 1695 | path-exists: 4.0.0 1696 | 1697 | flat-cache@4.0.1: 1698 | dependencies: 1699 | flatted: 3.3.2 1700 | keyv: 4.5.4 1701 | 1702 | flatted@3.3.2: {} 1703 | 1704 | fs-extra@7.0.1: 1705 | dependencies: 1706 | graceful-fs: 4.2.11 1707 | jsonfile: 4.0.0 1708 | universalify: 0.1.2 1709 | 1710 | fs-extra@8.1.0: 1711 | dependencies: 1712 | graceful-fs: 4.2.11 1713 | jsonfile: 4.0.0 1714 | universalify: 0.1.2 1715 | 1716 | fsevents@2.3.2: 1717 | optional: true 1718 | 1719 | glob-parent@5.1.2: 1720 | dependencies: 1721 | is-glob: 4.0.3 1722 | 1723 | glob-parent@6.0.2: 1724 | dependencies: 1725 | is-glob: 4.0.3 1726 | 1727 | globals@14.0.0: {} 1728 | 1729 | globby@11.1.0: 1730 | dependencies: 1731 | array-union: 2.1.0 1732 | dir-glob: 3.0.1 1733 | fast-glob: 3.3.3 1734 | ignore: 5.3.2 1735 | merge2: 1.4.1 1736 | slash: 3.0.0 1737 | 1738 | graceful-fs@4.2.11: {} 1739 | 1740 | graphemer@1.4.0: {} 1741 | 1742 | has-flag@4.0.0: {} 1743 | 1744 | human-id@1.0.2: {} 1745 | 1746 | iconv-lite@0.4.24: 1747 | dependencies: 1748 | safer-buffer: 2.1.2 1749 | 1750 | ignore@5.3.2: {} 1751 | 1752 | import-fresh@3.3.1: 1753 | dependencies: 1754 | parent-module: 1.0.1 1755 | resolve-from: 4.0.0 1756 | 1757 | imurmurhash@0.1.4: {} 1758 | 1759 | is-extglob@2.1.1: {} 1760 | 1761 | is-glob@4.0.3: 1762 | dependencies: 1763 | is-extglob: 2.1.1 1764 | 1765 | is-number@7.0.0: {} 1766 | 1767 | is-subdir@1.2.0: 1768 | dependencies: 1769 | better-path-resolve: 1.0.0 1770 | 1771 | is-windows@1.0.2: {} 1772 | 1773 | isexe@2.0.0: {} 1774 | 1775 | jose@5.9.6: {} 1776 | 1777 | js-yaml@3.14.1: 1778 | dependencies: 1779 | argparse: 1.0.10 1780 | esprima: 4.0.1 1781 | 1782 | js-yaml@4.1.0: 1783 | dependencies: 1784 | argparse: 2.0.1 1785 | 1786 | json-buffer@3.0.1: {} 1787 | 1788 | json-schema-traverse@0.4.1: {} 1789 | 1790 | json-stable-stringify-without-jsonify@1.0.1: {} 1791 | 1792 | jsonfile@4.0.0: 1793 | optionalDependencies: 1794 | graceful-fs: 4.2.11 1795 | 1796 | keyv@4.5.4: 1797 | dependencies: 1798 | json-buffer: 3.0.1 1799 | 1800 | levn@0.4.1: 1801 | dependencies: 1802 | prelude-ls: 1.2.1 1803 | type-check: 0.4.0 1804 | 1805 | locate-path@5.0.0: 1806 | dependencies: 1807 | p-locate: 4.1.0 1808 | 1809 | locate-path@6.0.0: 1810 | dependencies: 1811 | p-locate: 5.0.0 1812 | 1813 | lodash.merge@4.6.2: {} 1814 | 1815 | lodash.startcase@4.4.0: {} 1816 | 1817 | merge2@1.4.1: {} 1818 | 1819 | micromatch@4.0.8: 1820 | dependencies: 1821 | braces: 3.0.3 1822 | picomatch: 2.3.1 1823 | 1824 | minimatch@3.1.2: 1825 | dependencies: 1826 | brace-expansion: 1.1.11 1827 | 1828 | minimatch@9.0.5: 1829 | dependencies: 1830 | brace-expansion: 2.0.1 1831 | 1832 | mri@1.2.0: {} 1833 | 1834 | ms@2.1.3: {} 1835 | 1836 | natural-compare@1.4.0: {} 1837 | 1838 | optionator@0.9.4: 1839 | dependencies: 1840 | deep-is: 0.1.4 1841 | fast-levenshtein: 2.0.6 1842 | levn: 0.4.1 1843 | prelude-ls: 1.2.1 1844 | type-check: 0.4.0 1845 | word-wrap: 1.2.5 1846 | 1847 | os-tmpdir@1.0.2: {} 1848 | 1849 | outdent@0.5.0: {} 1850 | 1851 | p-filter@2.1.0: 1852 | dependencies: 1853 | p-map: 2.1.0 1854 | 1855 | p-limit@2.3.0: 1856 | dependencies: 1857 | p-try: 2.2.0 1858 | 1859 | p-limit@3.1.0: 1860 | dependencies: 1861 | yocto-queue: 0.1.0 1862 | 1863 | p-locate@4.1.0: 1864 | dependencies: 1865 | p-limit: 2.3.0 1866 | 1867 | p-locate@5.0.0: 1868 | dependencies: 1869 | p-limit: 3.1.0 1870 | 1871 | p-map@2.1.0: {} 1872 | 1873 | p-try@2.2.0: {} 1874 | 1875 | package-manager-detector@0.2.9: {} 1876 | 1877 | parent-module@1.0.1: 1878 | dependencies: 1879 | callsites: 3.1.0 1880 | 1881 | path-exists@4.0.0: {} 1882 | 1883 | path-key@3.1.1: {} 1884 | 1885 | path-type@4.0.0: {} 1886 | 1887 | picocolors@1.1.1: {} 1888 | 1889 | picomatch@2.3.1: {} 1890 | 1891 | pify@4.0.1: {} 1892 | 1893 | playwright-core@1.50.1: {} 1894 | 1895 | playwright@1.50.1: 1896 | dependencies: 1897 | playwright-core: 1.50.1 1898 | optionalDependencies: 1899 | fsevents: 2.3.2 1900 | 1901 | prelude-ls@1.2.1: {} 1902 | 1903 | prettier-linter-helpers@1.0.0: 1904 | dependencies: 1905 | fast-diff: 1.3.0 1906 | 1907 | prettier@2.8.8: {} 1908 | 1909 | prettier@3.4.2: {} 1910 | 1911 | punycode@2.3.1: {} 1912 | 1913 | queue-microtask@1.2.3: {} 1914 | 1915 | read-yaml-file@1.1.0: 1916 | dependencies: 1917 | graceful-fs: 4.2.11 1918 | js-yaml: 3.14.1 1919 | pify: 4.0.1 1920 | strip-bom: 3.0.0 1921 | 1922 | regenerator-runtime@0.14.1: {} 1923 | 1924 | resolve-from@4.0.0: {} 1925 | 1926 | resolve-from@5.0.0: {} 1927 | 1928 | reusify@1.0.4: {} 1929 | 1930 | run-parallel@1.2.0: 1931 | dependencies: 1932 | queue-microtask: 1.2.3 1933 | 1934 | safer-buffer@2.1.2: {} 1935 | 1936 | semver@7.7.1: {} 1937 | 1938 | shebang-command@2.0.0: 1939 | dependencies: 1940 | shebang-regex: 3.0.0 1941 | 1942 | shebang-regex@3.0.0: {} 1943 | 1944 | signal-exit@4.1.0: {} 1945 | 1946 | slash@3.0.0: {} 1947 | 1948 | spawndamnit@3.0.1: 1949 | dependencies: 1950 | cross-spawn: 7.0.6 1951 | signal-exit: 4.1.0 1952 | 1953 | sprintf-js@1.0.3: {} 1954 | 1955 | strip-ansi@6.0.1: 1956 | dependencies: 1957 | ansi-regex: 5.0.1 1958 | 1959 | strip-bom@3.0.0: {} 1960 | 1961 | strip-json-comments@3.1.1: {} 1962 | 1963 | superstruct@2.0.2: {} 1964 | 1965 | supports-color@7.2.0: 1966 | dependencies: 1967 | has-flag: 4.0.0 1968 | 1969 | synckit@0.9.2: 1970 | dependencies: 1971 | '@pkgr/core': 0.1.1 1972 | tslib: 2.8.1 1973 | 1974 | term-size@2.2.1: {} 1975 | 1976 | tmp@0.0.33: 1977 | dependencies: 1978 | os-tmpdir: 1.0.2 1979 | 1980 | to-regex-range@5.0.1: 1981 | dependencies: 1982 | is-number: 7.0.0 1983 | 1984 | ts-api-utils@2.0.1(typescript@5.7.3): 1985 | dependencies: 1986 | typescript: 5.7.3 1987 | 1988 | tslib@2.8.1: {} 1989 | 1990 | type-check@0.4.0: 1991 | dependencies: 1992 | prelude-ls: 1.2.1 1993 | 1994 | typescript-eslint@8.23.0(eslint@9.19.0)(typescript@5.7.3): 1995 | dependencies: 1996 | '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) 1997 | '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) 1998 | '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) 1999 | eslint: 9.19.0 2000 | typescript: 5.7.3 2001 | transitivePeerDependencies: 2002 | - supports-color 2003 | 2004 | typescript@5.7.3: {} 2005 | 2006 | universalify@0.1.2: {} 2007 | 2008 | uri-js@4.4.1: 2009 | dependencies: 2010 | punycode: 2.3.1 2011 | 2012 | which@2.0.2: 2013 | dependencies: 2014 | isexe: 2.0.0 2015 | 2016 | word-wrap@1.2.5: {} 2017 | 2018 | yocto-queue@0.1.0: {} 2019 | --------------------------------------------------------------------------------