diff --git a/.eslintrc.json b/.eslintrc.json index a1ddc50..d8e5b9b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,12 +1,22 @@ { + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:prettier/recommended" + ], + "plugins": ["@typescript-eslint/eslint-plugin", "prettier"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "ignorePatterns": ["dist/", "node_modules/", "examples/"], "env": { "browser": true, "commonjs": true, - "es2021": true - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": "latest" + "es2021": true, + "node": true }, "rules": { "no-unused-vars": "off", diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dbd6389..bf7cbf7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,13 +9,17 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - name: Checkout source + uses: actions/checkout@v4 + - name: Setup node + uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependencies - run: npm install + - name: Install + run: yarn install --frozen-lockfile - name: Lint - run: npm run lint + run: yarn lint - name: Test - run: npm test + run: yarn test:ci + - name: Build + run: yarn build diff --git a/.github/workflows/publish-to-npm.yml b/.github/workflows/publish-to-npm.yml index 4b49e1f..99610c0 100644 --- a/.github/workflows/publish-to-npm.yml +++ b/.github/workflows/publish-to-npm.yml @@ -13,22 +13,24 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v4 - - name: Setup node uses: actions/setup-node@v3 with: node-version: 18 - - - name: NPM install + - name: Install run: yarn install --frozen-lockfile - + - name: Lint + run: yarn lint + - name: Test + run: yarn test:ci + - name: Build + run: yarn build - name: Get version from package.json id: get_version run: | version=$(jq -r '.version' package.json) echo "version=$version" >> $GITHUB_OUTPUT echo "Read version $version from package.json" - - name: Verify version corresponds to branch id: verify_version run: | @@ -61,7 +63,6 @@ jobs: echo "version_tag=$version_tag" >> $GITHUB_OUTPUT; echo "Will publish version ${{ steps.get_version.outputs.version }} as $version_tag" - - name: Publish to npm if: ${{ steps.verify_version.outputs.version_tag != '' }} uses: JS-DevTools/npm-publish@v1 diff --git a/.gitignore b/.gitignore index cd06617..4408606 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,8 @@ # Ignore node_modules directory node_modules + +# Ignore build output directory +dist + +# Ignore test coverage +coverage \ No newline at end of file diff --git a/.npmignore b/.npmignore index d8df819..8d434ab 100644 --- a/.npmignore +++ b/.npmignore @@ -6,3 +6,7 @@ yarn.lock # Exclude .npmrc file .npmrc + +# Exclude types +dist/* +!dist/index.d.ts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d0a7c26 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "printWidth": 100, + "tabWidth": 2, + "useTabs": true, + "singleQuote": true, + "semi": true, + "quoteProps": "consistent", + "trailingComma": "all", + "arrowParens": "avoid", + "endOfLine": "lf" +} diff --git a/package.json b/package.json index ec84164..6383701 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,69 @@ { "name": "@adobe/plugin-hooks", - "version": "0.3.4", + "version": "0.3.5-alpha.0", "publishConfig": { "access": "public" }, "description": "Adobe API Mesh Hooks Plugin", - "main": "index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "files": [ + "dist" + ], + "exports": { + ".": { + "require": "./dist/cjs/index.js", + "import": "./dist/esm/index.js" + } + }, "scripts": { - "test": "echo \"no test specified\" && exit 0", - "lint": "eslint .", - "lint:fix": "eslint --fix ." + "clean": "rimraf dist", + "build": "yarn clean && yarn build:esm && yarn build:cjs", + "build:esm": "tsc --project tsconfig.esm.json --outDir dist/esm", + "build:cjs": "tsc --project tsconfig.cjs.json --outDir dist/cjs", + "prepack": "yarn build", + "lint": "eslint src", + "lint:fix": "eslint --fix .", + "test": "vitest", + "test:ci": "vitest --run" }, "dependencies": { - "@graphql-mesh/utils": "^0.43.4", + "@graphql-mesh/cross-helpers": "^0.4.10", + "@graphql-mesh/utils": "0.43.20", "await-timeout": "^1.1.1", "make-cancellable-promise": "^1.1.0", "node-fetch": "^2" }, "devDependencies": { "@envelop/core": "^3.0.4", + "@graphql-mesh/types": "0.91.12", + "@graphql-tools/executor-http": "^2.0.1", + "@types/await-timeout": "^0.3.4", + "@types/node": "^22.15.18", + "@types/node-fetch": "^2.6.12", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", + "@vitest/coverage-v8": "^3.1.3", + "@vitest/ui": "^3.1.4", "eslint": "^8.31.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-prettier": "^5.4.0", "graphql": "^16.6.0", - "jest": "^29.6.4" + "graphql-yoga": "5.3.1", + "jest": "^29.6.4", + "prettier": "^3.5.3", + "rimraf": "5.0.1", + "typescript": "^5.8.3", + "vitest": "^3.1.3" }, "peerDependencies": { "@envelop/core": "*", "graphql": "*" }, + "resolutions": { + "@graphql-mesh/utils": "0.43.20" + }, "repository": { "type": "git", "url": "https://github.com/adobe/plugin-hooks" diff --git a/index.js b/src/__fixtures__/badHook.js similarity index 89% rename from index.js rename to src/__fixtures__/badHook.js index 99f687a..e7b813e 100644 --- a/index.js +++ b/src/__fixtures__/badHook.js @@ -9,7 +9,3 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ - -const hooksPlugin = require("./src"); - -module.exports = hooksPlugin; diff --git a/src/__fixtures__/hookAsync.js b/src/__fixtures__/hookAsync.js new file mode 100644 index 0000000..623b22b --- /dev/null +++ b/src/__fixtures__/hookAsync.js @@ -0,0 +1,20 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +module.exports = { + mockHook: async ({ body: { status, message } }) => { + return { + status, + message, + }; + }, +}; diff --git a/src/__fixtures__/hookDefaultExportAsync.js b/src/__fixtures__/hookDefaultExportAsync.js new file mode 100644 index 0000000..2c90eef --- /dev/null +++ b/src/__fixtures__/hookDefaultExportAsync.js @@ -0,0 +1,18 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +module.exports = async ({ body: { status, message } }) => { + return { + status, + message, + }; +}; diff --git a/src/__fixtures__/hookNamedDefaultExportAsync.js b/src/__fixtures__/hookNamedDefaultExportAsync.js new file mode 100644 index 0000000..3158d15 --- /dev/null +++ b/src/__fixtures__/hookNamedDefaultExportAsync.js @@ -0,0 +1,20 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +module.exports = { + default: async ({ body: { status, message } }) => { + return { + status, + message, + }; + }, +}; diff --git a/src/__fixtures__/hookSync.js b/src/__fixtures__/hookSync.js new file mode 100644 index 0000000..dfbee7e --- /dev/null +++ b/src/__fixtures__/hookSync.js @@ -0,0 +1,20 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +module.exports = { + mockHook: ({ body: { status, message } }) => { + return { + status, + message, + }; + }, +}; diff --git a/src/__fixtures__/hooksTestHelper.ts b/src/__fixtures__/hooksTestHelper.ts new file mode 100644 index 0000000..5dda247 --- /dev/null +++ b/src/__fixtures__/hooksTestHelper.ts @@ -0,0 +1,75 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import { buildHTTPExecutor, SyncFetchFn } from '@graphql-tools/executor-http'; +import { createSchema, YogaInitialContext, YogaServer } from 'graphql-yoga'; +import { parse } from 'graphql'; +import { HookFunctionPayload, HookResponse, HookStatus, UserContext } from '../types'; + +const mockSuccessResponse: HookResponse = { + status: HookStatus.SUCCESS, + message: 'mock ok', +}; + +const mockErrorResponse: HookResponse = { + status: HookStatus.ERROR, + message: 'mock error', +}; + +const convertMockResponseToContext = (mockResponse: HookResponse) => + ({ + body: mockResponse, + }) as unknown as HookFunctionPayload; + +const testFetch = (yogaServer: YogaServer, query: string) => { + if (!('fetch' in yogaServer)) { + throw new Error('Unable to test YogaServer via fetch executor'); + } + + const executor = buildHTTPExecutor({ + fetch: yogaServer.fetch as SyncFetchFn, + }); + + return Promise.resolve( + executor({ + document: parse(query), + }), + ); +}; + +const mockSchema = createSchema({ + typeDefs: /* GraphQL */ ` + type Query { + hello: String + } + `, + resolvers: { + Query: { + hello: () => 'world', + }, + }, +}); + +const mockQuery = /* GraphQL */ ` + query { + hello + } +`; + +export { + convertMockResponseToContext, + mockErrorResponse, + mockSchema, + mockSuccessResponse, + mockQuery, + testFetch, +}; diff --git a/src/__mocks__/yogaLogger.ts b/src/__mocks__/yogaLogger.ts new file mode 100644 index 0000000..fe7a17c --- /dev/null +++ b/src/__mocks__/yogaLogger.ts @@ -0,0 +1,22 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import { YogaLogger } from 'graphql-yoga'; + +const mockLogger = { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), +} as unknown as YogaLogger; + +export { mockLogger }; diff --git a/src/__tests__/handleBeforeAllHooks.test.ts b/src/__tests__/handleBeforeAllHooks.test.ts new file mode 100644 index 0000000..cd6e4bf --- /dev/null +++ b/src/__tests__/handleBeforeAllHooks.test.ts @@ -0,0 +1,162 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import getBeforeAllHookHandler, { BeforeAllHookBuildConfig } from '../handleBeforeAllHooks'; +import { PayloadContext, HookResponse, HookStatus } from '../types'; +import { mockLogger } from '../__mocks__/yogaLogger'; + +describe('getBeforeAllHookHandler', () => { + test('should return beforeAllHook function', async () => { + const mockConfig: BeforeAllHookBuildConfig = { + memoizedFns: {}, + baseDir: '', + logger: mockLogger, + beforeAll: { + blocking: true, + }, + }; + expect(getBeforeAllHookHandler(mockConfig)).toBeTypeOf('function'); + }); + describe('should call hook without error', () => { + test('when blocking and success', async () => { + const mockResponse: HookResponse = { + status: HookStatus.SUCCESS, + message: 'ok', + }; + const mockHook = vi.fn().mockReturnValue(Promise.resolve(mockResponse)); + const mockModule = { mockHook }; + const mockConfig: BeforeAllHookBuildConfig = { + memoizedFns: {}, + baseDir: '', + logger: mockLogger, + beforeAll: { + blocking: true, + module: mockModule, + fn: 'mockHook', + }, + }; + const beforeAllHookHandler = getBeforeAllHookHandler(mockConfig); + expect(mockHook).toHaveBeenCalledTimes(0); + await beforeAllHookHandler({ + payload: { context: {} as unknown as PayloadContext, document: {} }, + updateContext: () => {}, + }); + expect(mockHook).toHaveBeenCalledOnce(); + }); + test('when non-blocking and success', async () => { + const mockResponse: HookResponse = { + status: HookStatus.SUCCESS, + message: 'ok', + }; + const mockHook = vi.fn().mockReturnValue(Promise.resolve(mockResponse)); + const mockModule = { mockHook }; + const mockConfig: BeforeAllHookBuildConfig = { + memoizedFns: {}, + baseDir: '', + logger: mockLogger, + beforeAll: { + blocking: false, + module: mockModule, + fn: 'mockHook', + }, + }; + const beforeAllHookHandler = getBeforeAllHookHandler(mockConfig); + expect(mockHook).toHaveBeenCalledTimes(0); + await beforeAllHookHandler({ + payload: { context: {} as unknown as PayloadContext, document: {} }, + updateContext: () => {}, + }); + expect(mockHook).toHaveBeenCalledOnce(); + }); + test('when non-blocking and error', async () => { + const mockResponse: HookResponse = { + status: HookStatus.ERROR, + message: 'mock error message', + }; + const mockHook = vi.fn().mockReturnValue(Promise.resolve(mockResponse)); + const mockModule = { mockHook }; + const mockConfig: BeforeAllHookBuildConfig = { + memoizedFns: {}, + baseDir: '', + logger: mockLogger, + beforeAll: { + blocking: false, + module: mockModule, + fn: 'mockHook', + }, + }; + const beforeAllHookHandler = getBeforeAllHookHandler(mockConfig); + expect(mockHook).toHaveBeenCalledTimes(0); + await beforeAllHookHandler({ + payload: { context: {} as unknown as PayloadContext, document: {} }, + updateContext: () => {}, + }); + expect(mockHook).toHaveBeenCalledOnce(); + }); + }); + + test('should throw when blocking and error', async () => { + const mockResponse: HookResponse = { + status: HookStatus.ERROR, + message: 'mock error message', + }; + const mockHook = vi.fn().mockReturnValue(Promise.resolve(mockResponse)); + const mockModule = { mockHook }; + const mockConfig: BeforeAllHookBuildConfig = { + memoizedFns: {}, + baseDir: '', + logger: mockLogger, + beforeAll: { + blocking: true, + module: mockModule, + fn: 'mockHook', + }, + }; + const beforeAllHookHandler = getBeforeAllHookHandler(mockConfig); + await expect( + beforeAllHookHandler({ + payload: { context: {} as unknown as PayloadContext, document: {} }, + updateContext: () => {}, + }), + ).rejects.toThrowError(mockResponse.message); + }); + test('should return memoized function when previously invoked', async () => { + const mockResponse: HookResponse = { + status: HookStatus.SUCCESS, + message: 'ok', + }; + const mockMemoizedHook = vi.fn().mockReturnValue(Promise.resolve(mockResponse)); + const mockHook = vi.fn().mockReturnValue(Promise.resolve(mockResponse)); + const mockModule = { mockHook }; + const mockConfig: BeforeAllHookBuildConfig = { + memoizedFns: { + beforeAll: mockMemoizedHook, + }, + baseDir: '', + logger: mockLogger, + beforeAll: { + blocking: true, + module: mockModule, + fn: 'mockHook', + }, + }; + const beforeAllHookHandler = getBeforeAllHookHandler(mockConfig); + expect(mockHook).toHaveBeenCalledTimes(0); + expect(mockMemoizedHook).toHaveBeenCalledTimes(0); + await beforeAllHookHandler({ + payload: { context: {} as unknown as PayloadContext, document: {} }, + updateContext: () => {}, + }); + expect(mockHook).toHaveBeenCalledTimes(0); + expect(mockMemoizedHook).toHaveBeenCalledOnce(); + }); +}); diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts new file mode 100644 index 0000000..cc4307a --- /dev/null +++ b/src/__tests__/index.test.ts @@ -0,0 +1,97 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import { createYoga, YogaServer, YogaInitialContext } from 'graphql-yoga'; +import { beforeEach } from 'vitest'; +import { + mockQuery, + mockSchema, + mockSuccessResponse, + testFetch, +} from '../__fixtures__/hooksTestHelper'; +import { mockLogger } from '../__mocks__/yogaLogger'; +import hooksPlugin from '../index'; +import { HookFunction, Module, UserContext } from '../types'; + +let mockHook: ReturnType; +let mockModule: Module; + +describe('hooksPlugin', () => { + let yogaServer: YogaServer; + beforeEach(async () => { + mockHook = vi.fn(); + mockModule = { mockHook }; + yogaServer = createYoga({ + plugins: [ + await hooksPlugin({ + baseDir: '', + logger: mockLogger, + beforeAll: { + blocking: true, + module: mockModule, + fn: 'mockHook', + }, + }), + ], + schema: mockSchema, + }); + vi.resetAllMocks(); + }); + test('should run with no hooks', async () => { + yogaServer = createYoga({ + plugins: [ + await hooksPlugin({ + baseDir: '', + logger: mockLogger, + }), + ], + schema: mockSchema, + }); + expect(mockHook).toHaveBeenCalledTimes(0); + await testFetch(yogaServer, mockQuery); + expect(mockHook).toHaveBeenCalledTimes(0); + }); + test('should skip introspection queries', async () => { + expect(mockHook).toHaveBeenCalledTimes(0); + await testFetch(yogaServer, 'query IntrospectionQuery { __schema { types { name } } }'); + expect(mockHook).toHaveBeenCalledTimes(0); + }); + test('should update headers in context', async () => { + mockHook.mockImplementation(() => { + return { + ...mockSuccessResponse, + data: { + headers: { + 'x-mock-header': 'mock-value', + }, + }, + }; + }); + expect(mockHook).toHaveBeenCalledTimes(0); + await testFetch(yogaServer, mockQuery); + expect(mockHook).toHaveBeenCalledTimes(1); + }); + test('should invoke beforeAll hook', async () => { + expect(mockHook).toHaveBeenCalledTimes(0); + await testFetch(yogaServer, mockQuery); + expect(mockHook).toHaveBeenCalledTimes(1); + }); + // test('should return GraphQL error when error', async () => { + // mockHook.mockImplementationOnce(() => mockErrorResponse); + // expect(mockHook).toHaveBeenCalledTimes(0); + // const response = await testFetch(yogaServer, mockQuery); + // const data = await response.json(); + // expect(mockHook).toHaveBeenCalledTimes(1); + // expect(data.errors.length).toBe(1); + // expect(data.errors[0].message).toEqual(mockErrorResponse.message); + // }); +}); diff --git a/src/__tests__/utils.test.ts b/src/__tests__/utils.test.ts new file mode 100644 index 0000000..61fff53 --- /dev/null +++ b/src/__tests__/utils.test.ts @@ -0,0 +1,372 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import { beforeEach } from 'vitest'; +import fetch from 'node-fetch'; +import { HookStatus, Module } from '../types'; +import { + importFn, + getWrappedLocalHookFunction, + getWrappedLocalModuleHookFunction, + getWrappedRemoteHookFunction, + isModuleFn, + isRemoteFn, + parseResponseBody, + timedPromise, +} from '../utils'; +import { mockLogger } from '../__mocks__/yogaLogger'; +import { + mockSuccessResponse, + mockErrorResponse, + convertMockResponseToContext, +} from '../__fixtures__/hooksTestHelper'; + +vi.mock('node-fetch'); +vi.mock('graphql-yoga'); + +const setFetchMockResponse = ({ + ok, + status, + body, +}: { + ok?: boolean; + status?: number; + body?: unknown; +} = {}) => { + vi.mocked(fetch).mockReturnValueOnce( + Promise.resolve({ + ok: ok || true, + status: status || 200, + json: () => Promise.resolve(body || {}), + text: () => Promise.resolve(body ? JSON.stringify(body) : ''), + } as Partial as import('node-fetch').Response), + ); +}; + +describe('utils', () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + describe('importFn', async () => { + test('should import function', async () => { + expect(await importFn('./__fixtures__/hookAsync.js')).toBeTypeOf('object'); + }); + }); + describe('timedPromise', async () => { + test('should resolve promise', async () => { + expect(await timedPromise(Promise.resolve('test'), 30000)).toBe('test'); + }); + test('should reject promise', async () => { + await expect(timedPromise(Promise.reject(new Error('test')), 30000)).rejects.toThrow('test'); + }); + test('should timeout promise', async () => { + await expect(timedPromise(new Promise(() => {}), 1)).rejects.toThrow('Timeout'); + }); + }); + describe('parseResponseBody', async () => { + test('should return body when it contains status', () => { + expect(parseResponseBody('{"status": "ok"}', true)).toEqual({ status: 'ok' }); + }); + test('should return success when body does not contain status and is ok', () => { + expect(parseResponseBody(JSON.stringify(mockSuccessResponse), true)).toEqual({ + status: HookStatus.SUCCESS, + message: mockSuccessResponse.message, + }); + }); + test('should return error when body does not contain status and is not ok', () => { + expect(parseResponseBody(JSON.stringify(mockErrorResponse), false)).toEqual({ + status: HookStatus.ERROR, + message: mockErrorResponse.message, + }); + }); + test('should return success when error and is ok', () => { + const mockRawBody = '{'; + expect(parseResponseBody(mockRawBody, true)).toEqual({ + status: HookStatus.SUCCESS, + message: mockRawBody, + }); + }); + test('should return error when error and is not ok', () => { + expect(parseResponseBody(undefined as unknown as string, false)).toEqual({ + status: HookStatus.ERROR, + message: 'Unable to parse hook function response', + }); + }); + }); + describe('getWrappedRemoteHookFunction', async () => { + test('should wrap remote function call', async () => { + setFetchMockResponse(); + const result = await getWrappedRemoteHookFunction('https://localhost:9999/mockRemoteHook', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: false, + }); + expect(result).toBeTypeOf('function'); + }); + describe('wrapped hook function', () => { + describe('with blocking set to true', () => { + test('should return expected success object', async () => { + setFetchMockResponse({ body: mockSuccessResponse }); + const hookFunction = await getWrappedRemoteHookFunction( + 'https://localhost:9999/mockRemoteHook', + { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: true, + }, + ); + expect(await hookFunction(convertMockResponseToContext(mockSuccessResponse))).toEqual( + mockSuccessResponse, + ); + }); + test('should return expected error object with message', async () => { + setFetchMockResponse({ body: mockErrorResponse }); + const hookFunction = await getWrappedRemoteHookFunction( + 'https://localhost:9999/mockRemoteHook', + { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: true, + }, + ); + await expect( + hookFunction(convertMockResponseToContext(mockErrorResponse)), + ).rejects.toEqual(mockErrorResponse); + }); + }); + describe('with blocking set to false', async () => { + test('should return generic success object', async () => { + setFetchMockResponse({ body: mockSuccessResponse }); + const hookFunction = await getWrappedRemoteHookFunction( + 'https://localhost:9999/mockRemoteHook', + { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: false, + }, + ); + expect(await hookFunction(convertMockResponseToContext(mockSuccessResponse))).toEqual({ + ...mockSuccessResponse, + message: 'Remote function invoked successfully', + }); + }); + }); + }); + }); + describe('getWrappedLocalModuleFunction', async () => { + test('should wrap named export', async () => { + // @ts-expect-error mock hook function with no type declaration + const mockModule = await import('../__fixtures__/hookAsync.js'); + const result = await getWrappedLocalModuleHookFunction(mockModule, 'mockHook', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: false, + }); + expect(result).toBeTypeOf('function'); + }); + test('should wrap named default export', async () => { + // @ts-expect-error mock hook function with no type declaration + const mockModule = await import('../__fixtures__/hookNamedDefaultExportAsync.js'); + const result = await getWrappedLocalModuleHookFunction(mockModule, 'mockHook', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: false, + }); + expect(result).toBeTypeOf('function'); + }); + test('should wrap default export', async () => { + // @ts-expect-error mock hook function with no type declaration + const mockModule = await import('../__fixtures__/hookDefaultExportAsync.js'); + const result = await getWrappedLocalModuleHookFunction(mockModule, 'mockHook', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: false, + }); + expect(result).toBeTypeOf('function'); + }); + test('should reject with error when function not found', async () => { + await expect( + getWrappedLocalModuleHookFunction(undefined as unknown as Module, 'doesNotExist', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: true, + }), + ).rejects.toEqual({ + status: 'ERROR', + message: "Cannot read properties of undefined (reading 'doesNotExist')", + }); + }); + describe('wrapped hook function', () => { + describe('with blocking set to true', () => { + test('should return expected success object', async () => { + // @ts-expect-error mock hook function with no type declaration + const mockModule = await import('../__fixtures__/hookAsync.js'); + const hookFunction = await getWrappedLocalModuleHookFunction(mockModule, 'mockHook', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: true, + }); + expect(await hookFunction(convertMockResponseToContext(mockSuccessResponse))).toEqual( + mockSuccessResponse, + ); + }); + test('should return expected error object with message', async () => { + // @ts-expect-error mock hook function with no type declaration + const mockModule = await import('../__fixtures__/hookAsync.js'); + const hookFunction = await getWrappedLocalModuleHookFunction(mockModule, 'mockHook', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: true, + }); + await expect( + hookFunction(convertMockResponseToContext(mockErrorResponse)), + ).rejects.toEqual(mockErrorResponse); + }); + }); + describe('with blocking set to false', async () => { + test('should return generic success object', async () => { + // @ts-expect-error mock hook function with no type declaration + const mockModule = await import('../__fixtures__/hookAsync.js'); + const hookFunction = await getWrappedLocalModuleHookFunction(mockModule, 'mockHook', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: false, + }); + expect(await hookFunction(convertMockResponseToContext(mockErrorResponse))).toEqual({ + ...mockSuccessResponse, + message: 'Local module function invoked successfully', + }); + }); + }); + }); + }); + describe('getWrappedLocalModuleHookFunction', async () => { + test('should wrap named export', async () => { + const result = await getWrappedLocalHookFunction('../__fixtures__/hookAsync.js#mockHook', { + baseDir: __dirname, + importFn: importFn, + logger: mockLogger, + blocking: false, + }); + expect(result).toBeTypeOf('function'); + }); + test('should wrap named default export', async () => { + const result = await getWrappedLocalHookFunction( + '../__fixtures__/hookNamedDefaultExportAsync.js#mockHook', + { + baseDir: __dirname, + importFn: importFn, + logger: mockLogger, + blocking: false, + }, + ); + expect(result).toBeTypeOf('function'); + }); + test('should wrap default export', async () => { + const result = await getWrappedLocalHookFunction( + '../__fixtures__/hookDefaultExportAsync.js#mockHook', + { + baseDir: __dirname, + importFn: importFn, + logger: mockLogger, + blocking: false, + }, + ); + expect(result).toBeTypeOf('function'); + }); + test('should reject with error when function not found', async () => { + await expect( + getWrappedLocalHookFunction('../__fixtures__/hookAsync.js#doesNotExist', { + baseDir: '', + importFn: vi.fn(), + logger: mockLogger, + blocking: true, + }), + ).rejects.toEqual({ + status: HookStatus.ERROR, + message: "Cannot read properties of undefined (reading 'doesNotExist')", + }); + }); + describe('wrapped hook function', () => { + describe('with blocking set to true', () => { + test('should return expected success object', async () => { + const hookFunction = await getWrappedLocalHookFunction( + '../__fixtures__/hookAsync.js#mockHook', + { + baseDir: __dirname, + importFn: importFn, + logger: mockLogger, + blocking: true, + }, + ); + expect(await hookFunction(convertMockResponseToContext(mockSuccessResponse))).toEqual( + mockSuccessResponse, + ); + }); + test('should return expected error object with message', async () => { + const hookFunction = await getWrappedLocalHookFunction( + '../__fixtures__/hookAsync.js#mockHook', + { + baseDir: __dirname, + importFn: importFn, + logger: mockLogger, + blocking: true, + }, + ); + await expect( + hookFunction(convertMockResponseToContext(mockErrorResponse)), + ).rejects.toEqual(mockErrorResponse); + }); + }); + describe('with blocking set to false', async () => { + test('should return generic success object', async () => { + const hookFunction = await getWrappedLocalHookFunction( + '../__fixtures__/hookAsync.js#mockHook', + { + baseDir: __dirname, + importFn: importFn, + logger: mockLogger, + blocking: false, + }, + ); + expect(await hookFunction(convertMockResponseToContext(mockErrorResponse))).toEqual({ + ...mockSuccessResponse, + message: 'Local function invoked successfully', + }); + }); + }); + }); + }); + test('isModuleFn', () => { + expect(isModuleFn({ module: 'module', fn: 'fn' })).toBe(true); + expect(isModuleFn({ module: 'module' })).toBe(false); + expect(isModuleFn({ fn: 'fn' })).toBe(false); + expect(isModuleFn({})).toBe(false); + }); + test('isRemoteFn', () => { + expect(isRemoteFn('https://example.com')).toBe(true); + expect(isRemoteFn('http://example.com')).toBe(false); + expect(isRemoteFn('example.com')).toBe(false); + expect(isRemoteFn('https://example.com/path?query=string&another=value')).toBe(true); + }); +}); diff --git a/src/handleBeforeAllHooks.js b/src/handleBeforeAllHooks.js deleted file mode 100644 index 74f7761..0000000 --- a/src/handleBeforeAllHooks.js +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2022 Adobe. All rights reserved. -This file is licensed to you under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under -the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS -OF ANY KIND, either express or implied. See the License for the specific language -governing permissions and limitations under the License. -*/ - -const { - importFn, - isModuleFn, - isRemoteFn, - invokeLocalFunction, - invokeLocalModuleFunction, - invokeRemoteFunction, -} = require("./utils"); - -const handleBeforeAllHooks = (fnBuildConfig) => async (fnExecConfig) => { - try { - const { memoizedFns, baseDir, logger, beforeAll } = fnBuildConfig; - const { payload, updateContext } = fnExecConfig; - let beforeAllFn; - - if (!memoizedFns.beforeAll) { - if (isRemoteFn(beforeAll.composer)) { - // Invoke remote endpoint - beforeAllFn = await invokeRemoteFunction(beforeAll.composer, { - baseDir, - importFn, - logger, - blocking: beforeAll.blocking, - }); - } else if (isModuleFn(beforeAll)) { - // Invoke function from imported module. This handles bundled scenarios such as local development where the - // module needs to be known statically at build time. - beforeAllFn = await invokeLocalModuleFunction(beforeAll.module, beforeAll.fn, { - baseDir, - importFn, - logger, - blocking: beforeAll.blocking, - }); - } else { - // Invoke local function at runtime - beforeAllFn = await invokeLocalFunction(beforeAll.composer, { - baseDir, - importFn, - logger, - blocking: beforeAll.blocking, - }); - } - - memoizedFns.beforeAll = beforeAllFn; - } else { - beforeAllFn = memoizedFns.beforeAll; - } - - if (beforeAllFn) { - try { - const hooksResponse = await beforeAllFn(payload); - - if (beforeAll.blocking) { - if (hooksResponse.status.toUpperCase() === "SUCCESS") { - // take data from response and merge it with context - - if (hooksResponse.data) { - updateContext(hooksResponse.data); - } - } else { - throw new Error(hooksResponse.message); - } - } - } catch (err) { - logger.error("Error while invoking beforeAll hook %o", err); - - throw new Error(err.message); - } - } - } catch (err) { - throw new Error(err.message); - } -}; - -module.exports = handleBeforeAllHooks; diff --git a/src/handleBeforeAllHooks.ts b/src/handleBeforeAllHooks.ts new file mode 100644 index 0000000..c3e7bb9 --- /dev/null +++ b/src/handleBeforeAllHooks.ts @@ -0,0 +1,112 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import type { YogaLogger } from 'graphql-yoga'; +import { HookConfig, HookFunction, HookFunctionPayload, HookStatus, MemoizedFns } from './types'; + +import { + importFn, + isModuleFn, + isRemoteFn, + getWrappedLocalHookFunction, + getWrappedLocalModuleHookFunction, + getWrappedRemoteHookFunction, +} from './utils'; + +export interface BeforeAllHookBuildConfig { + baseDir: string; + beforeAll: HookConfig; + logger: YogaLogger; + memoizedFns: MemoizedFns; +} + +export interface BeforeAllHookExecConfig { + payload: HookFunctionPayload; + updateContext: UpdateContextFn; +} + +export type UpdateContextFn = (data: { headers?: Record }) => void; + +const getBeforeAllHookHandler = + (fnBuildConfig: BeforeAllHookBuildConfig) => + async (fnExecConfig: BeforeAllHookExecConfig): Promise => { + try { + const { memoizedFns, baseDir, logger, beforeAll } = fnBuildConfig; + const { payload, updateContext } = fnExecConfig; + let beforeAllFn: HookFunction | undefined; + + if (!memoizedFns.beforeAll) { + if (isRemoteFn(beforeAll.composer || '')) { + // Invoke remote endpoint + logger.debug('Invoking remote function %s', beforeAll.composer); + beforeAllFn = await getWrappedRemoteHookFunction(beforeAll.composer!, { + baseDir, + importFn, + logger, + blocking: beforeAll.blocking, + }); + } else if (isModuleFn(beforeAll)) { + // Invoke function from imported module. This handles bundled scenarios such as local development where the + // module needs to be known statically at build time. + logger.debug('Invoking local module function %s %s', beforeAll.module, beforeAll.fn); + beforeAllFn = await getWrappedLocalModuleHookFunction(beforeAll.module!, beforeAll.fn!, { + baseDir, + importFn, + logger, + blocking: beforeAll.blocking, + }); + } else { + // Invoke local function at runtime + logger.debug('Invoking local function %s', beforeAll.composer); + beforeAllFn = await getWrappedLocalHookFunction(beforeAll.composer!, { + baseDir, + importFn, + logger, + blocking: beforeAll.blocking, + }); + } + memoizedFns.beforeAll = beforeAllFn; + } else { + beforeAllFn = memoizedFns.beforeAll; + } + + if (beforeAllFn) { + try { + const hooksResponse = await beforeAllFn(payload); + if (beforeAll.blocking) { + if (hooksResponse.status.toUpperCase() === HookStatus.SUCCESS) { + if (hooksResponse.data) { + updateContext(hooksResponse.data); + } + } else { + throw new Error(hooksResponse.message); + } + } + } catch (err: unknown) { + logger.error('Error while invoking beforeAll hook %o', err); + if (err instanceof Error) { + throw new Error(err.message); + } + if (err && typeof err === 'object' && 'message' in err) { + throw new Error((err as { message?: string }).message); + } + throw new Error('Error while invoking beforeAll hook'); + } + } + } catch (err: unknown) { + throw new Error( + (err instanceof Error && err.message) || 'Error while invoking beforeAll hook', + ); + } + }; + +export default getBeforeAllHookHandler; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 16735cd..0000000 --- a/src/index.js +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright 2022 Adobe. All rights reserved. -This file is licensed to you under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under -the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS -OF ANY KIND, either express or implied. See the License for the specific language -governing permissions and limitations under the License. -*/ - -const handleBeforeAllHooks = require("./handleBeforeAllHooks"); - -async function hooksPlugin(config) { - try { - const { beforeAll, baseDir, logger } = config; - - if (!beforeAll) { - return {}; - } - - const memoizedFns = { - beforeAll: null, - }; - - // Generating bound beforeAll function - const handleBeforeAllHookFn = handleBeforeAllHooks({ - beforeAll, - memoizedFns, - baseDir, - logger, - }); - - return { - async onExecute({ args, setResultAndStopExecution, extendContext }) { - const query = args.contextValue.params.query; - - const { document, contextValue: context } = args; - const { headers, params, request, req, secrets } = context; - - let body = {}; - - if (req && req.body) { - body = req.body; - } - - const payload = { - context: { headers, params, request, body, secrets }, - document, - }; - - const updateContext = (newContext) => { - const { headers: newHeaders } = newContext; - - if (newHeaders) { - const updatedHeaders = { - ...args.contextValue.headers, - ...newHeaders, - }; - - extendContext({ - headers: updatedHeaders, - }); - } - }; - - const isIntrospectionQuery = - args.operationName === "IntrospectionQuery" || - (query && query.includes("query IntrospectionQuery")); - - if (isIntrospectionQuery) { - return {}; - } - - /** - * Start Before All Hook - */ - - try { - await handleBeforeAllHookFn({ payload, updateContext }); - } catch (err) { - setResultAndStopExecution({ - data: null, - errors: [err.message], - }); - } - - /** - * End Before All Hook - */ - - return {}; - }, - }; - } catch (err) { - console.error('Error while initializing "hooks" plugin', err); - - return {}; - } -} - -module.exports = hooksPlugin; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..09072ca --- /dev/null +++ b/src/index.ts @@ -0,0 +1,108 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import { GraphQLError } from 'graphql/error'; +import getBeforeAllHookHandler, { UpdateContextFn } from './handleBeforeAllHooks'; +import type { HookConfig, MemoizedFns, UserContext } from './types'; +import type { YogaLogger, Plugin, YogaInitialContext } from 'graphql-yoga'; + +export interface PluginConfig { + baseDir: string; + logger: YogaLogger; + beforeAll?: HookConfig; +} + +type HooksPlugin = Plugin, UserContext>; + +export default async function hooksPlugin(config: PluginConfig): Promise { + try { + const { beforeAll, baseDir, logger } = config; + if (!beforeAll) { + return { onExecute: async () => ({}) }; + } + const memoizedFns: MemoizedFns = {}; + const beforeAllHookHandler = getBeforeAllHookHandler({ + baseDir, + beforeAll, + logger, + memoizedFns, + }); + return { + async onExecute({ args, setResultAndStopExecution, extendContext }) { + const query = args.contextValue?.params?.query; + const operationName = args.operationName; + const { document, contextValue: context } = args; + const { params, request } = context || {}; + const headers = Object.fromEntries(request.headers.entries()); + const secrets = 'secrets' in context ? context.secrets : {}; + let body = {}; + if (request && request.body) { + body = request.body; + } + + const updateContext: UpdateContextFn = data => { + const { headers: newHeaders } = data; + if (newHeaders) { + const updatedHeaders = { + ...headers, + ...newHeaders, + }; + extendContext({ + headers: updatedHeaders, + }); + } + }; + + // Ignore introspection queries + const isIntrospectionQuery = + operationName === 'IntrospectionQuery' || + (query && query.includes('query IntrospectionQuery')); + if (isIntrospectionQuery) { + return {}; + } + + /** + * Start Before All Hook + */ + try { + const payload = { + context: { params, request, body, headers, secrets }, + document, + }; + await beforeAllHookHandler({ payload, updateContext }); + } catch (err: unknown) { + setResultAndStopExecution({ + data: null, + errors: [ + new GraphQLError( + (err instanceof Error && err.message) || 'Error while executing hooks', + { + extensions: { + code: 'PLUGIN_HOOKS_ERROR', + }, + }, + ), + ], + }); + } + + /** + * End Before All Hook + */ + return {}; + }, + }; + } catch (err: unknown) { + console.error('Error while initializing "hooks" plugin', err); + return { onExecute: async () => ({}) }; + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..f553cea --- /dev/null +++ b/src/types.ts @@ -0,0 +1,64 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import { GraphQLParams, YogaInitialContext } from 'graphql-yoga'; + +export interface UserContext extends YogaInitialContext { + headers?: Record; + secrets?: Record; +} + +export interface HookConfig { + blocking: boolean; + composer?: string; + module?: Module; + fn?: string; +} + +export interface MemoizedFns { + beforeAll?: HookFunction; +} + +export interface Module { + [key: string]: object | HookFunction | undefined; + default?: Module; +} + +export type HookFunctionPayload = { + context: PayloadContext; + document: unknown; +}; + +export interface PayloadContext { + request: Request; + params: GraphQLParams; + body: unknown; + headers?: Record; + secrets?: Record; +} + +export type HookFunction = (payload: HookFunctionPayload) => Promise | HookResponse; + +export interface HookResponse { + status: HookStatus; + message: string; + data?: { + headers?: { + [headerName: string]: string; + }; + }; +} + +export enum HookStatus { + SUCCESS = 'SUCCESS', + ERROR = 'ERROR', +} diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index 4d11b3a..0000000 --- a/src/utils.js +++ /dev/null @@ -1,380 +0,0 @@ -/* -Copyright 2022 Adobe. All rights reserved. -This file is licensed to you under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under -the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS -OF ANY KIND, either express or implied. See the License for the specific language -governing permissions and limitations under the License. -*/ - -const fetch = require("node-fetch"); -const Timeout = require("await-timeout"); -const { default: makeCancellablePromise } = require("make-cancellable-promise"); -const utils = require("@graphql-mesh/utils"); - -/** Test code */ - -const __createBinding = - (this && this.__createBinding) || - (Object.create - ? function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - let desc = Object.getOwnPropertyDescriptor(m, k); - if ( - !desc || - ("get" in desc ? !m.__esModule : desc.writable || desc.configurable) - ) { - desc = { - enumerable: true, - get: function () { - return m[k]; - }, - }; - } - Object.defineProperty(o, k2, desc); - } - : function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - }); - -const __setModuleDefault = - (this && this.__setModuleDefault) || - (Object.create - ? function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } - : function (o, v) { - o["default"] = v; - }); - -const __importStar = - (this && this.__importStar) || - function (mod) { - if (mod && mod.__esModule) return mod; - const result = {}; - if (mod != null) { - for (const k in mod) { - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) { - __createBinding(result, mod, k); - } - } - __setModuleDefault(result, mod.default); - } - return result; - }; - -function importFn(modulePath) { - return Promise.resolve(import(modulePath)).then((module) => __importStar(module)); -} - -/** Test code end */ - -function timedPromise(promise) { - try { - const { promise: newPromise, cancel } = makeCancellablePromise(promise); - - return Timeout.wrap(newPromise, 30000, "Timeout").catch((err) => { - if (err.message === "Timeout") { - cancel(); - } - - return Promise.reject(err); - }); - } catch (err) { - return Promise.reject(err); - } -} - -const parseResponseBody = (rawBody, isOk) => { - try { - const body = JSON.parse(rawBody); - - if (body.status) { - return body; - } else { - if (isOk) { - // returned OK JSON response without status - return { - status: "SUCCESS", - message: rawBody, - }; - } else { - // returned NON OK JSON response without status - return { - status: "ERROR", - message: rawBody, - }; - } - } - } catch (err) { - if (isOk) { - // returned OK String response - return { - status: "SUCCESS", - message: rawBody, - }; - } else { - // returned NON OK String response or some unknown error - return { - status: "ERROR", - message: rawBody || "Unable to parse remove function response", - }; - } - } -}; - -const invokeRemoteFunction = async (url, metaConfig) => (data) => { - const { logger, blocking } = metaConfig; - - try { - logger.debug("Invoking remote fn %s", url); - - const requestOptions = { - method: "POST", - body: JSON.stringify(data), - headers: { - "Content-Type": "application/json", - }, - }; - - return new Promise(async (resolve, reject) => { - const response$ = fetch(url, requestOptions); - - if (blocking) { - const response = await response$; - const rawBody = await response.text(); - const body = parseResponseBody(rawBody, response.ok); - - if (body.status.toUpperCase() === "SUCCESS") { - resolve(body); - } else { - reject(body); - } - } else { - resolve({ - status: "SUCCESS", - message: "Remote function invoked successfully", - }); - } - }); - } catch (error) { - logger.error("error while invoking remote function %s", url); - logger.error(error); - - return Promise.reject({ - status: "ERROR", - message: error.message || `Unable to invoke remote function ${url}`, - }); - } -}; - -/** - * Invoke local module function. Used in situations where the module needs to be imported at build time such as in - * bundled use cases like local development. - * @param mod Imported/required JavaScript module. - * @param functionName Function name. - * @param metaConfig Meta configuration - * @returns {Promise>} - */ -const invokeLocalModuleFunction = async (mod, functionName, metaConfig) => { - const { logger, blocking } = metaConfig; - - const exportName = functionName || 'default' - - let composerFn = null; - - try { - composerFn = mod[exportName] || (mod.default && mod.default[exportName]) || mod.default || mod; - } catch (err) { - logger.error("error while invoking local function %s", composerFn); - logger.error(err); - - return Promise.reject({ - status: "ERROR", - message: - err.message || `Unable to invoke local function ${composerFn}`, - }); - } - - return (data) => { - return new Promise((resolve, reject) => { - try { - if (!composerFn) { - reject({ - status: "ERROR", - message: `Unable to invoke local function ${composerFn}`, - }); - } - - logger.debug("Invoking local fn %o", composerFn); - - const result = composerFn(data); - - if (blocking) { - if (result instanceof Promise) { - timedPromise(result) - .then((res) => { - if (res.status.toUpperCase() === "SUCCESS") { - resolve(res); - } else { - reject(res); - } - }) - .catch((error) => { - logger.error( - "error while invoking local function %o", - composerFn - ); - logger.error(error); - - reject({ - status: "ERROR", - message: - error.message || - `Error while invoking local function ${composerFn}`, - }); - }); - } else { - if (result.status.toUpperCase() === "SUCCESS") { - resolve(result); - } else { - reject(result); - } - } - } else { - resolve({ - status: "SUCCESS", - message: "Local function invoked successfully", - }); - } - } catch (error) { - logger.error("error while invoking local function %o", composerFn); - logger.error(error); - - reject({ - status: "ERROR", - message: - error.message || - `Error while invoking local function ${composerFn}`, - }); - } - }); - }; -}; - -const invokeLocalFunction = async (composerFnPath, metaConfig) => { - const { baseDir, logger, importFn, blocking } = metaConfig; - - let composerFn = null; - - try { - composerFn = await utils.loadFromModuleExportExpression(composerFnPath, { - cwd: baseDir, - defaultExportName: "default", - importFn: importFn, - }); - } catch (err) { - logger.error("error while invoking local function %s", composerFnPath); - logger.error(err); - - return Promise.reject({ - status: "ERROR", - message: - err.message || `Unable to invoke local function ${composerFnPath}`, - }); - } - - return (data) => { - return new Promise((resolve, reject) => { - try { - if (!composerFn) { - reject({ - status: "ERROR", - message: `Unable to invoke local function ${composerFnPath}`, - }); - } - - logger.debug("Invoking local fn %o", composerFn); - - const result = composerFn(data); - - if (blocking) { - if (result instanceof Promise) { - timedPromise(result) - .then((res) => { - if (res.status.toUpperCase() === "SUCCESS") { - resolve(res); - } else { - reject(res); - } - }) - .catch((error) => { - logger.error( - "error while invoking local function %o", - composerFn - ); - logger.error(error); - - reject({ - status: "ERROR", - message: - error.message || - `Error while invoking local function ${composerFn}`, - }); - }); - } else { - if (result.status.toUpperCase() === "SUCCESS") { - resolve(result); - } else { - reject(result); - } - } - } else { - resolve({ - status: "SUCCESS", - message: "Local function invoked successfully", - }); - } - } catch (error) { - logger.error("error while invoking local function %o", composerFn); - logger.error(error); - - reject({ - status: "ERROR", - message: - error.message || - `Error while invoking local function ${composerFn}`, - }); - } - }); - }; -}; - -const isRemoteFn = (composer) => { - const urlRegex = - /^(https:\/\/)([\w-?%$-.+!*'(),&=]+\.)+[\w-]+[.a-zA-Z]+(\/[\/a-zA-Z0-9-?_%$-.+!*'(),&=]*)?$/; - - return urlRegex.test(composer); -}; - -/** - * Whether beforeAll has module reference. - * @param beforeAll - * @returns {boolean} - */ -const isModuleFn = (beforeAll) => { - return !!(beforeAll.module && beforeAll.fn); -} - -module.exports = { - invokeRemoteFunction, - invokeLocalModuleFunction, - invokeLocalFunction, - isRemoteFn, - isModuleFn, - importFn, -}; diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..4d7974f --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,321 @@ +/* +Copyright 2022 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +import { loadFromModuleExportExpression } from '@graphql-mesh/utils'; +import type { YogaLogger } from 'graphql-yoga'; +import type { ImportFn } from '@graphql-mesh/types'; +import { default as Timeout } from 'await-timeout'; +import makeCancellablePromise from 'make-cancellable-promise'; +import fetch from 'node-fetch'; +import { HookFunction, HookStatus, Module, HookResponse, HookFunctionPayload } from './types'; + +export interface MetaConfig { + logger: YogaLogger; + blocking: boolean; + baseDir: string; + importFn: ImportFn; +} + +/** + * Import a module. + * @param modulePath Module path. + */ +export async function importFn(modulePath: string) { + return Promise.resolve(import(modulePath)).then(module => module); +} + +/** + * Execute a promise with a timeout. Defaults to 30 seconds. + * @param promise Promise. + * @param ms Duration in ms. + */ +export async function timedPromise(promise: Promise, ms: number): Promise { + try { + const { promise: newPromise, cancel } = makeCancellablePromise(promise); + return Timeout.wrap(newPromise, ms, 'Timeout').catch((err: Error) => { + if (err.message === 'Timeout') { + cancel(); + } + return Promise.reject(err); + }); + } catch (err) { + return Promise.reject(err); + } +} + +/** + * Parse response body for hook response. + * @param rawBody Response body string. + * @param isOk Response status. + */ +export function parseResponseBody(rawBody: string, isOk: boolean): HookResponse { + try { + const body = JSON.parse(rawBody); + if (body.status) { + return body; + } else { + if (isOk) { + return { + status: HookStatus.SUCCESS, + message: rawBody, + }; + } else { + return { + status: HookStatus.ERROR, + message: rawBody, + }; + } + } + } catch { + if (isOk) { + return { + status: HookStatus.SUCCESS, + message: rawBody, + }; + } else { + return { + status: HookStatus.ERROR, + message: rawBody || 'Unable to parse hook function response', + }; + } + } +} + +/** + * Get remote hook function wrapped in utilities to handle timeouts, errors, and blocking state. + * @param url Remote function URL. + * @param metaConfig Meta configuration. + */ +export async function getWrappedRemoteHookFunction( + url: string, + metaConfig: MetaConfig, +): Promise { + return async (data: HookFunctionPayload): Promise => { + const { logger, blocking } = metaConfig; + try { + logger.debug('Invoking remote fn %s', url); + const requestOptions = { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-Type': 'application/json', + }, + }; + return new Promise(async (resolve, reject: (reason?: HookResponse) => void) => { + const response$ = fetch(url, requestOptions); + if (blocking) { + const response = await response$; + const rawBody = await response.text(); + const body = parseResponseBody(rawBody, response.ok); + if (body.status.toUpperCase() === HookStatus.SUCCESS) { + resolve(body); + } else { + reject(body); + } + } else { + resolve({ + status: HookStatus.SUCCESS, + message: 'Remote function invoked successfully', + }); + } + }); + } catch (error: unknown) { + logger.error('Error while invoking remote function %s', url); + logger.error(error); + return Promise.reject({ + status: HookStatus.ERROR, + message: + (error instanceof Error && error.message) || `Unable to invoke remote function ${url}`, + }); + } + }; +} + +/** + * Get local module hook function wrapped in utilities to handle timeouts, errors, and blocking state. + * @param mod Module. + * @param functionName Function name. + * @param metaConfig Meta configuration. + */ +export async function getWrappedLocalModuleHookFunction( + mod: Module, + functionName: string, + metaConfig: MetaConfig, +): Promise { + const { logger, blocking } = metaConfig; + const exportName = functionName || 'default'; + let composerFn: HookFunction | null = null; + try { + composerFn = (mod[exportName] || + (mod.default && mod.default[exportName]) || + mod.default || + mod) as HookFunction; + } catch (error: unknown) { + logger.error('Error while invoking local module function %s', composerFn); + logger.error(error); + return Promise.reject({ + status: HookStatus.ERROR, + message: + (error instanceof Error && error.message) || + `Unable to invoke local module function ${composerFn}`, + }); + } + return (data: HookFunctionPayload) => { + return new Promise((resolve, reject: (reason?: HookResponse) => void) => { + try { + if (!composerFn) { + reject({ + status: HookStatus.ERROR, + message: `Unable to invoke local function ${composerFn}`, + }); + } + logger.debug('Invoking local module function %o', composerFn); + const result = composerFn(data); + if (blocking) { + if (result instanceof Promise) { + timedPromise(result, 30000) + .then((res: HookResponse) => { + if (res.status.toUpperCase() === HookStatus.SUCCESS) { + resolve(res); + } else { + reject(res); + } + }) + .catch((error: unknown) => { + logger.error('Error while invoking local module function %o', composerFn); + logger.error(error); + reject({ + status: HookStatus.ERROR, + message: + (error instanceof Error && error.message) || + `Error while invoking local module function ${composerFn}`, + }); + }); + } else { + if (result.status.toUpperCase() === HookStatus.SUCCESS) { + resolve(result); + } else { + reject(result); + } + } + } else { + resolve({ + status: HookStatus.SUCCESS, + message: 'Local module function invoked successfully', + }); + } + } catch (error: unknown) { + logger.error('Error while invoking local module function %o', composerFn); + logger.error(error); + reject({ + status: HookStatus.ERROR, + message: + (error instanceof Error && error.message) || + `Error while invoking local module function ${composerFn}`, + }); + } + }); + }; +} + +/** + * Get local module hook function wrapped in utilities to handle timeouts, errors, and blocking state. + * @param composerFnPath Composer function path/function name delimited with `#`. Example: `./hooks.js#example`. + * @param metaConfig Meta configuration. + */ +export async function getWrappedLocalHookFunction( + composerFnPath: string, + metaConfig: MetaConfig, +): Promise { + const { baseDir, logger, importFn, blocking } = metaConfig; + let composerFn: HookFunction | null = null; + try { + composerFn = (await loadFromModuleExportExpression(composerFnPath, { + cwd: baseDir, + defaultExportName: 'default', + importFn, + })) as unknown as HookFunction; + } catch (error: unknown) { + logger.error('error while invoking local function %s', composerFnPath); + logger.error(error); + return Promise.reject({ + status: HookStatus.ERROR, + message: + (error instanceof Error && error.message) || + `Unable to invoke local function ${composerFnPath}`, + }); + } + return (data: HookFunctionPayload) => { + return new Promise((resolve, reject: (reason?: HookResponse) => void) => { + try { + if (!composerFn) { + reject({ + status: HookStatus.ERROR, + message: `Unable to invoke local function ${composerFnPath}`, + }); + } + logger.debug('Invoking local function %o', composerFn); + const result = composerFn(data); + if (blocking) { + if (result instanceof Promise) { + timedPromise(result, 30000) + .then((res: HookResponse) => { + if (res.status.toUpperCase() === HookStatus.SUCCESS) { + resolve(res); + } else { + reject(res); + } + }) + .catch((error: Error) => { + logger.error('error while invoking local function %o', composerFn); + logger.error(error); + reject({ + status: HookStatus.ERROR, + message: error.message || `Error while invoking local function ${composerFn}`, + }); + }); + } else { + if (result.status.toUpperCase() === HookStatus.SUCCESS) { + resolve(result); + } else { + reject(result); + } + } + } else { + resolve({ + status: HookStatus.SUCCESS, + message: 'Local function invoked successfully', + }); + } + } catch (error: unknown) { + logger.error('Error while invoking local function %o', composerFn); + logger.error(error); + reject({ + status: HookStatus.ERROR, + message: + (error instanceof Error && error.message) || + `Error while invoking local function ${composerFn}`, + }); + } + }); + }; +} + +export function isRemoteFn(composer: string): boolean { + const urlRegex = + /^(https:\/\/)([\w-?%$-.+!*'(),&=]+\.)+[\w-]+[.a-zA-Z]+(\/[\/a-zA-Z0-9-?_%$-.+!*'(),&=]*)?$/; + return urlRegex.test(composer); +} + +export function isModuleFn(beforeAll: { module?: unknown; fn?: string }): boolean { + return !!(beforeAll.module && beforeAll.fn); +} diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json new file mode 100644 index 0000000..45d2952 --- /dev/null +++ b/tsconfig.cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "dist/cjs" + } +} \ No newline at end of file diff --git a/tsconfig.esm.json b/tsconfig.esm.json new file mode 100644 index 0000000..4b6e0a4 --- /dev/null +++ b/tsconfig.esm.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "moduleResolution": "node" + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..529b0bb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "strict": true, + "declaration": true, + "declarationDir": "dist/types", + "skipLibCheck": true, + "isolatedModules": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "target": "es2020", + "outDir": "dist", + "rootDir": "src", + "moduleResolution": "node", + "module": "esnext" + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "examples", + "**/__mocks__/**/*", + "**/__fixtures__/**/*", + "**/__tests__/**/*", + "**/*.test.ts", + "**/*.spec.ts" + ] +} \ No newline at end of file diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..2b1bf18 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["vitest/globals"] + }, + "include": ["src/**/*"], + "exclude": [ + "node_modules", + "dist", + "examples" + ] +} \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..67bff5f --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,21 @@ +import { defineConfig, coverageConfigDefaults } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + typecheck: { + tsconfig: './tsconfig.test.json', + }, + coverage: { + exclude: [ + '**/dist/**', + '**/examples/**', + '**/scripts/**', + '**/__tests__/**', + '**/__fixtures__/**', + '**/__mocks__/**', + ...coverageConfigDefaults.exclude, + ], + }, + }, +}); diff --git a/yarn.lock b/yarn.lock index 513f2ae..0b04498 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,6 +15,14 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ampproject/remapping@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" @@ -99,11 +107,21 @@ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + "@babel/helper-validator-identifier@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + "@babel/helper-validator-option@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" @@ -124,6 +142,13 @@ dependencies: "@babel/types" "^7.26.7" +"@babel/parser@^7.25.4": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.2.tgz#577518bedb17a2ce4212afd052e01f7df0941127" + integrity sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw== + dependencies: + "@babel/types" "^7.27.1" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" @@ -252,11 +277,24 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.25.4", "@babel/types@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@bcoe/v8-coverage@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz#bbe12dca5b4ef983a0d0af4b07b9bc90ea0ababa" + integrity sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA== + "@envelop/core@^3.0.4": version "3.0.6" resolved "https://registry.npmjs.org/@envelop/core/-/core-3.0.6.tgz" @@ -265,6 +303,24 @@ "@envelop/types" "3.0.2" tslib "^2.5.0" +"@envelop/core@^5.0.0", "@envelop/core@^5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@envelop/core/-/core-5.2.3.tgz#ede1dd20b4397c7465ae2190e718829303bcef00" + integrity sha512-KfoGlYD/XXQSc3BkM1/k15+JQbkQ4ateHazeZoWl9P71FsLTDXSjGy6j7QqfhpIDSbxNISqhPMfZHYSbDFOofQ== + dependencies: + "@envelop/instrumentation" "^1.0.0" + "@envelop/types" "^5.2.1" + "@whatwg-node/promise-helpers" "^1.2.4" + tslib "^2.5.0" + +"@envelop/instrumentation@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@envelop/instrumentation/-/instrumentation-1.0.0.tgz#43268392e065d8ba975cacbdf4fc297dfe3e11e5" + integrity sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw== + dependencies: + "@whatwg-node/promise-helpers" "^1.2.1" + tslib "^2.5.0" + "@envelop/types@3.0.2": version "3.0.2" resolved "https://registry.npmjs.org/@envelop/types/-/types-3.0.2.tgz" @@ -272,6 +328,139 @@ dependencies: tslib "^2.5.0" +"@envelop/types@^5.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@envelop/types/-/types-5.2.1.tgz#6bc9713f2aea56d7de3ea39e8bb70035c0475b36" + integrity sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg== + dependencies: + "@whatwg-node/promise-helpers" "^1.0.0" + tslib "^2.5.0" + +"@esbuild/aix-ppc64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz#830d6476cbbca0c005136af07303646b419f1162" + integrity sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q== + +"@esbuild/android-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz#d11d4fc299224e729e2190cacadbcc00e7a9fd67" + integrity sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A== + +"@esbuild/android-arm@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz#5660bd25080553dd2a28438f2a401a29959bd9b1" + integrity sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ== + +"@esbuild/android-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz#18ddde705bf984e8cd9efec54e199ac18bc7bee1" + integrity sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ== + +"@esbuild/darwin-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz#b0b7fb55db8fc6f5de5a0207ae986eb9c4766e67" + integrity sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g== + +"@esbuild/darwin-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz#e6813fdeba0bba356cb350a4b80543fbe66bf26f" + integrity sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A== + +"@esbuild/freebsd-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz#dc11a73d3ccdc308567b908b43c6698e850759be" + integrity sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ== + +"@esbuild/freebsd-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz#91da08db8bd1bff5f31924c57a81dab26e93a143" + integrity sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ== + +"@esbuild/linux-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz#efc15e45c945a082708f9a9f73bfa8d4db49728a" + integrity sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ== + +"@esbuild/linux-arm@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz#9b93c3e54ac49a2ede6f906e705d5d906f6db9e8" + integrity sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ== + +"@esbuild/linux-ia32@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz#be8ef2c3e1d99fca2d25c416b297d00360623596" + integrity sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ== + +"@esbuild/linux-loong64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz#b0840a2707c3fc02eec288d3f9defa3827cd7a87" + integrity sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA== + +"@esbuild/linux-mips64el@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz#2a198e5a458c9f0e75881a4e63d26ba0cf9df39f" + integrity sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg== + +"@esbuild/linux-ppc64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz#64f4ae0b923d7dd72fb860b9b22edb42007cf8f5" + integrity sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag== + +"@esbuild/linux-riscv64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz#fb2844b11fdddd39e29d291c7cf80f99b0d5158d" + integrity sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA== + +"@esbuild/linux-s390x@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz#1466876e0aa3560c7673e63fdebc8278707bc750" + integrity sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g== + +"@esbuild/linux-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz#c10fde899455db7cba5f11b3bccfa0e41bf4d0cd" + integrity sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA== + +"@esbuild/netbsd-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz#02e483fbcbe3f18f0b02612a941b77be76c111a4" + integrity sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ== + +"@esbuild/netbsd-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz#ec401fb0b1ed0ac01d978564c5fc8634ed1dc2ed" + integrity sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw== + +"@esbuild/openbsd-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz#f272c2f41cfea1d91b93d487a51b5c5ca7a8c8c4" + integrity sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A== + +"@esbuild/openbsd-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz#2e25950bc10fa9db1e5c868e3d50c44f7c150fd7" + integrity sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw== + +"@esbuild/sunos-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz#cd596fa65a67b3b7adc5ecd52d9f5733832e1abd" + integrity sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q== + +"@esbuild/win32-arm64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz#b4dbcb57b21eeaf8331e424c3999b89d8951dc88" + integrity sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ== + +"@esbuild/win32-ia32@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz#410842e5d66d4ece1757634e297a87635eb82f7a" + integrity sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg== + +"@esbuild/win32-x64@0.25.4": + version "0.25.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz#0b17ec8a70b2385827d52314c1253160a0b9bacc" + integrity sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -279,6 +468,18 @@ dependencies: eslint-visitor-keys "^3.3.0" +"@eslint-community/eslint-utils@^4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + "@eslint-community/regexpp@^4.6.1": version "4.8.0" resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz" @@ -304,29 +505,66 @@ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz" integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== -"@graphql-mesh/string-interpolation@0.4.4": - version "0.4.4" - resolved "https://registry.npmjs.org/@graphql-mesh/string-interpolation/-/string-interpolation-0.4.4.tgz" - integrity sha512-IotswBYZRaPswOebcr2wuOFuzD3dHIJxVEkPiiQubqjUIR8HhQI22XHJv0WNiQZ65z8NR9+GYWwEDIc2JRCNfQ== +"@fastify/busboy@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-3.1.1.tgz#af3aea7f1e52ec916d8b5c9dcc0f09d4c060a3fc" + integrity sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw== + +"@graphql-hive/signal@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@graphql-hive/signal/-/signal-1.0.0.tgz#6e2193660a47c925abadbe72293dfc9430e24f8f" + integrity sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag== + +"@graphql-mesh/cross-helpers@^0.4.10": + version "0.4.10" + resolved "https://registry.yarnpkg.com/@graphql-mesh/cross-helpers/-/cross-helpers-0.4.10.tgz#a998699cdbf8ced55052beaa26bf17ca8a097a65" + integrity sha512-7xmYM4P3UCmhx1pqU3DY4xWNydMBSXdzlHJ2wQPoM/s+l7tuWhxdtvmFmy12VkvZYtMAHkCpYvQokscWctUyrA== + dependencies: + "@graphql-tools/utils" "^10.8.0" + path-browserify "1.0.1" + +"@graphql-mesh/string-interpolation@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@graphql-mesh/string-interpolation/-/string-interpolation-0.4.3.tgz#cdb8376fb2f567950b2e2a426677165fe7e6904d" + integrity sha512-snrlsJa7rXwyxQObLWQLU3I1eYX3YdFbYgnrJYaoc5NVTkgY/TbG3P8vt2mZnpOHokMukIr3TOVVwg7gUD3cDQ== dependencies: dayjs "1.11.7" json-pointer "0.6.2" lodash.get "4.4.2" -"@graphql-mesh/utils@^0.43.4": - version "0.43.23" - resolved "https://registry.npmjs.org/@graphql-mesh/utils/-/utils-0.43.23.tgz" - integrity sha512-3ZrgLGGE61geHzBnX/mXcBzl/hJ1bmTut4kYKkesT72HiFSX6N5YKXlGxh33NtvYWrU8rV86/2Fi+u4yA+y2fQ== +"@graphql-mesh/types@0.91.12": + version "0.91.12" + resolved "https://registry.yarnpkg.com/@graphql-mesh/types/-/types-0.91.12.tgz#8bc3c913da0d50ac4d8437a4d302ec91930f3a5a" + integrity sha512-9vvETkeSd5prZWGlC3jR6JM+HRqPim6elJfhUEKH4t5TC5asjiCG17HjUdVALWmcEFrtPXxLHTjMLqTrC1yQ/w== dependencies: - "@graphql-mesh/string-interpolation" "0.4.4" - "@graphql-tools/delegate" "9.0.31" + "@graphql-tools/batch-delegate" "8.4.21" + "@graphql-tools/delegate" "9.0.28" + "@graphql-typed-document-node/core" "3.2.0" + +"@graphql-mesh/utils@0.43.20": + version "0.43.20" + resolved "https://registry.yarnpkg.com/@graphql-mesh/utils/-/utils-0.43.20.tgz#ecfa2e62a39b5ed55567762bc5bdba5a77cfbf22" + integrity sha512-XDccNle+unlG7oHQ//FnNtBLTZkKWzrVni5hk8h61NkUkLSzEmAf4yn3g12MNU/vzTBks0ABnOrdqLcDdbIIYQ== + dependencies: + "@graphql-mesh/string-interpolation" "0.4.3" + "@graphql-tools/delegate" "9.0.28" dset "3.1.2" js-yaml "4.1.0" lodash.get "4.4.2" lodash.topath "4.5.2" tiny-lru "8.0.2" -"@graphql-tools/batch-execute@^8.5.19": +"@graphql-tools/batch-delegate@8.4.21": + version "8.4.21" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-delegate/-/batch-delegate-8.4.21.tgz#765476c7b09ef4699beb07af228f2eeb1a78204b" + integrity sha512-NrnMGF6SHv7b0OWSyPUURZDoPGKEFTmTyYwVQ+iM950ZPBx3gOUPODZaXWpFVlFK2UGVNk6atvbigPDHnwSZnw== + dependencies: + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/utils" "9.2.1" + dataloader "2.2.2" + tslib "^2.4.0" + +"@graphql-tools/batch-execute@^8.5.18": version "8.5.22" resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.22.tgz" integrity sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A== @@ -336,30 +574,65 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/delegate@9.0.31": - version "9.0.31" - resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.31.tgz" - integrity sha512-kQ08ssI9RMC3ENBCcwR/vP+IAvi5oWiyLBlydlS62N/UoIEHi1AgjT4dPkIlCXy/U/f2l6ETbsWCcdoN/2SQ7A== +"@graphql-tools/delegate@9.0.28": + version "9.0.28" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-9.0.28.tgz#026275094b2ff3f4cbbe99caff2d48775aeb67d6" + integrity sha512-8j23JCs2mgXqnp+5K0v4J3QBQU/5sXd9miaLvMfRf/6963DznOXTECyS9Gcvj1VEeR5CXIw6+aX/BvRDKDdN1g== dependencies: - "@graphql-tools/batch-execute" "^8.5.19" - "@graphql-tools/executor" "^0.0.17" - "@graphql-tools/schema" "^9.0.18" + "@graphql-tools/batch-execute" "^8.5.18" + "@graphql-tools/executor" "^0.0.15" + "@graphql-tools/schema" "^9.0.16" "@graphql-tools/utils" "^9.2.1" dataloader "^2.2.2" tslib "^2.5.0" value-or-promise "^1.0.12" -"@graphql-tools/executor@^0.0.17": - version "0.0.17" - resolved "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.17.tgz" - integrity sha512-DVKyMclsNY8ei14FUrR4jn24VHB3EuFldD8yGWrcJ8cudSh47sknznvXN6q0ffqDeAf0IlZSaBCHrOTBqA7OfQ== +"@graphql-tools/executor-common@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-common/-/executor-common-0.0.4.tgz#763603a6d7a22bb09d67ce682e84a0d730ff2bf9" + integrity sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q== dependencies: - "@graphql-tools/utils" "^9.2.1" - "@graphql-typed-document-node/core" "3.2.0" + "@envelop/core" "^5.2.3" + "@graphql-tools/utils" "^10.8.1" + +"@graphql-tools/executor-http@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-2.0.1.tgz#e95100ea27fc4cffe9435d1c9c7c957734a5e4fa" + integrity sha512-LOFdfMczd7leKmmFzyPd8zqJeYsdtWLikgonwM19XxXWjaokPRe7rKQmLnGMBjDAkW/JeYhrB/pev+yjOtsf9Q== + dependencies: + "@graphql-hive/signal" "^1.0.0" + "@graphql-tools/executor-common" "^0.0.4" + "@graphql-tools/utils" "^10.8.1" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/disposablestack" "^0.0.6" + "@whatwg-node/fetch" "^0.10.6" + "@whatwg-node/promise-helpers" "^1.3.0" + meros "^1.2.1" + tslib "^2.8.1" + +"@graphql-tools/executor@^0.0.15": + version "0.0.15" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-0.0.15.tgz#cbd29af2ec54213a52f6c516a7792b3e626a4c49" + integrity sha512-6U7QLZT8cEUxAMXDP4xXVplLi6RBwx7ih7TevlBto66A/qFp3PDb6o/VFo07yBKozr8PGMZ4jMfEWBGxmbGdxA== + dependencies: + "@graphql-tools/utils" "9.2.1" + "@graphql-typed-document-node/core" "3.1.2" "@repeaterjs/repeater" "3.0.4" tslib "^2.4.0" value-or-promise "1.0.12" +"@graphql-tools/executor@^1.2.5": + version "1.4.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-1.4.7.tgz#86bf0b26f2add5b686ec96e866ee22d1b81f9b6b" + integrity sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA== + dependencies: + "@graphql-tools/utils" "^10.8.6" + "@graphql-typed-document-node/core" "^3.2.0" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/disposablestack" "^0.0.6" + "@whatwg-node/promise-helpers" "^1.0.0" + tslib "^2.4.0" + "@graphql-tools/merge@^8.4.1": version "8.4.2" resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz" @@ -368,7 +641,24 @@ "@graphql-tools/utils" "^9.2.1" tslib "^2.4.0" -"@graphql-tools/schema@^9.0.18": +"@graphql-tools/merge@^9.0.24": + version "9.0.24" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.24.tgz#1f366e85588894cb496bd1c332be7665db143df2" + integrity sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw== + dependencies: + "@graphql-tools/utils" "^10.8.6" + tslib "^2.4.0" + +"@graphql-tools/schema@^10.0.0": + version "10.0.23" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.23.tgz#d8865e96f37a04ca43303d7024add7edbe0c5ed4" + integrity sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A== + dependencies: + "@graphql-tools/merge" "^9.0.24" + "@graphql-tools/utils" "^10.8.6" + tslib "^2.4.0" + +"@graphql-tools/schema@^9.0.16": version "9.0.19" resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz" integrity sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w== @@ -378,7 +668,7 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/utils@^9.2.1": +"@graphql-tools/utils@9.2.1", "@graphql-tools/utils@^9.2.1": version "9.2.1" resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz" integrity sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A== @@ -386,11 +676,52 @@ "@graphql-typed-document-node/core" "^3.1.1" tslib "^2.4.0" -"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.1.1": +"@graphql-tools/utils@^10.1.0", "@graphql-tools/utils@^10.8.0", "@graphql-tools/utils@^10.8.1", "@graphql-tools/utils@^10.8.6": + version "10.8.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.8.6.tgz#69ef29e408a27919108b2b2227fe8b465acf9e5c" + integrity sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@whatwg-node/promise-helpers" "^1.0.0" + cross-inspect "1.0.1" + dset "^3.1.4" + tslib "^2.4.0" + +"@graphql-typed-document-node/core@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.2.tgz#6fc464307cbe3c8ca5064549b806360d84457b04" + integrity sha512-9anpBMM9mEgZN4wr2v8wHJI2/u5TnnggewRN6OlvXTTnuVyoY19X6rOv9XTqKRw6dcGKwZsBi8n0kDE2I5i4VA== + +"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@graphql-yoga/logger@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@graphql-yoga/logger/-/logger-2.0.1.tgz#b3d18371c07bb2fe03417e3920ddcaebb2ee0262" + integrity sha512-Nv0BoDGLMg9QBKy9cIswQ3/6aKaKjlTh87x3GiBg2Z4RrjyrM48DvOOK0pJh1C1At+b0mUIM67cwZcFTDLN4sA== + dependencies: + tslib "^2.8.1" + +"@graphql-yoga/subscription@^5.0.0": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@graphql-yoga/subscription/-/subscription-5.0.5.tgz#55e1dc472de866185d7c122e2c534023a331f65c" + integrity sha512-oCMWOqFs6QV96/NZRt/ZhTQvzjkGB4YohBOpKM4jH/lDT4qb7Lex/aGCxpi/JD9njw3zBBtMqxbaC22+tFHVvw== + dependencies: + "@graphql-yoga/typed-event-target" "^3.0.2" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/events" "^0.1.0" + tslib "^2.8.1" + +"@graphql-yoga/typed-event-target@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@graphql-yoga/typed-event-target/-/typed-event-target-3.0.2.tgz#af29ed2a5a84062ffab8e404b335ec4d4c37ceb4" + integrity sha512-ZpJxMqB+Qfe3rp6uszCQoag4nSw42icURnBRfFYSOmTgEeOe4rD0vYlbA8spvCu2TlCesNTlEN9BLWtQqLxabA== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.8.1" + "@humanwhocodes/config-array@^0.11.10": version "0.11.11" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz" @@ -410,6 +741,18 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -642,7 +985,12 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -650,6 +998,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@kamilkisiela/fast-url-parser@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz#9d68877a489107411b953c54ea65d0658b515809" + integrity sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -658,12 +1011,12 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -671,11 +1024,131 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.4.tgz#d897170a2b0ba51f78a099edccd968f7b103387c" + integrity sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw== + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.29" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" + integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== + "@repeaterjs/repeater@3.0.4": version "3.0.4" resolved "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz" integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== +"@repeaterjs/repeater@^3.0.4": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.6.tgz#be23df0143ceec3c69f8b6c2517971a5578fdaa2" + integrity sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA== + +"@rollup/rollup-android-arm-eabi@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz#c228d00a41f0dbd6fb8b7ea819bbfbf1c1157a10" + integrity sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg== + +"@rollup/rollup-android-arm64@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz#e2b38d0c912169fd55d7e38d723aada208d37256" + integrity sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw== + +"@rollup/rollup-darwin-arm64@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz#1fddb3690f2ae33df16d334c613377f05abe4878" + integrity sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w== + +"@rollup/rollup-darwin-x64@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz#818298d11c8109e1112590165142f14be24b396d" + integrity sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ== + +"@rollup/rollup-freebsd-arm64@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz#91a28dc527d5bed7f9ecf0e054297b3012e19618" + integrity sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ== + +"@rollup/rollup-freebsd-x64@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz#28acadefa76b5c7bede1576e065b51d335c62c62" + integrity sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz#819691464179cbcd9a9f9d3dc7617954840c6186" + integrity sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q== + +"@rollup/rollup-linux-arm-musleabihf@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz#d149207039e4189e267e8724050388effc80d704" + integrity sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg== + +"@rollup/rollup-linux-arm64-gnu@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz#fa72ebddb729c3c6d88973242f1a2153c83e86ec" + integrity sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg== + +"@rollup/rollup-linux-arm64-musl@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz#2054216e34469ab8765588ebf343d531fc3c9228" + integrity sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg== + +"@rollup/rollup-linux-loongarch64-gnu@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz#818de242291841afbfc483a84f11e9c7a11959bc" + integrity sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz#0bb4cb8fc4a2c635f68c1208c924b2145eb647cb" + integrity sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q== + +"@rollup/rollup-linux-riscv64-gnu@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz#4b3b8e541b7b13e447ae07774217d98c06f6926d" + integrity sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg== + +"@rollup/rollup-linux-riscv64-musl@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz#e065405e67d8bd64a7d0126c931bd9f03910817f" + integrity sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg== + +"@rollup/rollup-linux-s390x-gnu@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz#dda3265bbbfe16a5d0089168fd07f5ebb2a866fe" + integrity sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ== + +"@rollup/rollup-linux-x64-gnu@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz#90993269b8b995b4067b7b9d72ff1c360ef90a17" + integrity sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng== + +"@rollup/rollup-linux-x64-musl@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz#fdf5b09fd121eb8d977ebb0fda142c7c0167b8de" + integrity sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA== + +"@rollup/rollup-win32-arm64-msvc@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz#6397e1e012db64dfecfed0774cb9fcf89503d716" + integrity sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg== + +"@rollup/rollup-win32-ia32-msvc@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz#df0991464a52a35506103fe18d29913bf8798a0c" + integrity sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA== + +"@rollup/rollup-win32-x64-msvc@4.40.2": + version "4.40.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz#8dae04d01a2cbd84d6297d99356674c6b993f0fc" + integrity sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA== + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" @@ -695,6 +1168,11 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@types/await-timeout@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@types/await-timeout/-/await-timeout-0.3.4.tgz#9dd20bbe22aa8c982dc867d5d8107e7934a0470e" + integrity sha512-e9L0SaLat1lWNpr8VP8CbzMS7IcQPzL8EfRuq2BZtF5EO0b9DjSJqpbGSs0dTSwcYDOTU7ikbX408Rhj/oNQeQ== + "@types/babel__core@^7.1.14": version "7.20.1" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" @@ -728,6 +1206,11 @@ dependencies: "@babel/types" "^7.20.7" +"@types/estree@1.0.7", "@types/estree@^1.0.0": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" @@ -754,11 +1237,26 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/node-fetch@^2.6.12": + version "2.6.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + "@types/node@*": version "20.5.7" resolved "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz" integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== +"@types/node@^22.15.18": + version "22.15.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.18.tgz#2f8240f7e932f571c2d45f555ba0b6c3f7a75963" + integrity sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg== + dependencies: + undici-types "~6.21.0" + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" @@ -776,6 +1274,279 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz#9185b3eaa3b083d8318910e12d56c68b3c4f45b4" + integrity sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.32.1" + "@typescript-eslint/type-utils" "8.32.1" + "@typescript-eslint/utils" "8.32.1" + "@typescript-eslint/visitor-keys" "8.32.1" + graphemer "^1.4.0" + ignore "^7.0.0" + natural-compare "^1.4.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/parser@^8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.32.1.tgz#18b0e53315e0bc22b2619d398ae49a968370935e" + integrity sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg== + dependencies: + "@typescript-eslint/scope-manager" "8.32.1" + "@typescript-eslint/types" "8.32.1" + "@typescript-eslint/typescript-estree" "8.32.1" + "@typescript-eslint/visitor-keys" "8.32.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz#9a6bf5fb2c5380e14fe9d38ccac6e4bbe17e8afc" + integrity sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA== + dependencies: + "@typescript-eslint/types" "8.32.1" + "@typescript-eslint/visitor-keys" "8.32.1" + +"@typescript-eslint/type-utils@8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz#b9292a45f69ecdb7db74d1696e57d1a89514d21e" + integrity sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA== + dependencies: + "@typescript-eslint/typescript-estree" "8.32.1" + "@typescript-eslint/utils" "8.32.1" + debug "^4.3.4" + ts-api-utils "^2.1.0" + +"@typescript-eslint/types@8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.32.1.tgz#b19fe4ac0dc08317bae0ce9ec1168123576c1d4b" + integrity sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg== + +"@typescript-eslint/typescript-estree@8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz#9023720ca4ecf4f59c275a05b5fed69b1276face" + integrity sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg== + dependencies: + "@typescript-eslint/types" "8.32.1" + "@typescript-eslint/visitor-keys" "8.32.1" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/utils@8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.32.1.tgz#4d6d5d29b9e519e9a85e9a74e9f7bdb58abe9704" + integrity sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.32.1" + "@typescript-eslint/types" "8.32.1" + "@typescript-eslint/typescript-estree" "8.32.1" + +"@typescript-eslint/visitor-keys@8.32.1": + version "8.32.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz#4321395cc55c2eb46036cbbb03e101994d11ddca" + integrity sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w== + dependencies: + "@typescript-eslint/types" "8.32.1" + eslint-visitor-keys "^4.2.0" + +"@vitest/coverage-v8@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-3.1.3.tgz#d40e21d11384ef55d12ece1cb711b32930deb499" + integrity sha512-cj76U5gXCl3g88KSnf80kof6+6w+K4BjOflCl7t6yRJPDuCrHtVu0SgNYOUARJOL5TI8RScDbm5x4s1/P9bvpw== + dependencies: + "@ampproject/remapping" "^2.3.0" + "@bcoe/v8-coverage" "^1.0.2" + debug "^4.4.0" + istanbul-lib-coverage "^3.2.2" + istanbul-lib-report "^3.0.1" + istanbul-lib-source-maps "^5.0.6" + istanbul-reports "^3.1.7" + magic-string "^0.30.17" + magicast "^0.3.5" + std-env "^3.9.0" + test-exclude "^7.0.1" + tinyrainbow "^2.0.0" + +"@vitest/expect@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.1.3.tgz#bbca175cd2f23d7de9448a215baed8f3d7abd7b7" + integrity sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg== + dependencies: + "@vitest/spy" "3.1.3" + "@vitest/utils" "3.1.3" + chai "^5.2.0" + tinyrainbow "^2.0.0" + +"@vitest/mocker@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.1.3.tgz#121d0f2fcca20c9ccada9e2d6e761f7fc687f4ce" + integrity sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ== + dependencies: + "@vitest/spy" "3.1.3" + estree-walker "^3.0.3" + magic-string "^0.30.17" + +"@vitest/pretty-format@3.1.3", "@vitest/pretty-format@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.1.3.tgz#760b9eab5f253d7d2e7dcd28ef34570f584023d4" + integrity sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/pretty-format@3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.1.4.tgz#da3e98c250cde3ce39fe8e709339814607b185e8" + integrity sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/runner@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.1.3.tgz#b268fa90fca38fab363f1107f057c0a2a141ee45" + integrity sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA== + dependencies: + "@vitest/utils" "3.1.3" + pathe "^2.0.3" + +"@vitest/snapshot@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.1.3.tgz#39a8f9f8c6ba732ffde59adeacf0a549bef11e76" + integrity sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ== + dependencies: + "@vitest/pretty-format" "3.1.3" + magic-string "^0.30.17" + pathe "^2.0.3" + +"@vitest/spy@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.1.3.tgz#ca81e2b4f0c3d6c75f35defa77c3336f39c8f605" + integrity sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ== + dependencies: + tinyspy "^3.0.2" + +"@vitest/ui@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-3.1.4.tgz#ece30f41330bd26f656f737cda57c35b5121175b" + integrity sha512-CFc2Bpb3sz4Sdt53kdNGq+qZKLftBwX4qZLC03CBUc0N1LJrOoL0ZeK0oq/708mtnpwccL0BZCY9d1WuiBSr7Q== + dependencies: + "@vitest/utils" "3.1.4" + fflate "^0.8.2" + flatted "^3.3.3" + pathe "^2.0.3" + sirv "^3.0.1" + tinyglobby "^0.2.13" + tinyrainbow "^2.0.0" + +"@vitest/utils@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.1.3.tgz#4f31bdfd646cd82d30bfa730d7410cb59d529669" + integrity sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg== + dependencies: + "@vitest/pretty-format" "3.1.3" + loupe "^3.1.3" + tinyrainbow "^2.0.0" + +"@vitest/utils@3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.1.4.tgz#f9f20d92f1384a9d66548c480885390760047b5e" + integrity sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg== + dependencies: + "@vitest/pretty-format" "3.1.4" + loupe "^3.1.3" + tinyrainbow "^2.0.0" + +"@whatwg-node/disposablestack@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz#2064a1425ea66194def6df0c7a1851b6939c82bb" + integrity sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw== + dependencies: + "@whatwg-node/promise-helpers" "^1.0.0" + tslib "^2.6.3" + +"@whatwg-node/events@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.1.2.tgz#23f7c7ad887d7fd448e9ce3261eac9ef319ddd7c" + integrity sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ== + dependencies: + tslib "^2.6.3" + +"@whatwg-node/fetch@^0.10.5": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.10.7.tgz#f5f6839ba4af694259480f191d528ffef91e0361" + integrity sha512-sL31zX8BqZovZc38ovBFmKEfao9AzZ/24sWSHKNhDhcnzIO/PYAX2xF6vYtgU9hinrEGlvScTTyKSMynHGdfEA== + dependencies: + "@whatwg-node/node-fetch" "^0.7.19" + urlpattern-polyfill "^10.0.0" + +"@whatwg-node/fetch@^0.10.6": + version "0.10.8" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.10.8.tgz#1467f9505826fa7271c67dfaf0d7251ab8c2b9cc" + integrity sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg== + dependencies: + "@whatwg-node/node-fetch" "^0.7.21" + urlpattern-polyfill "^10.0.0" + +"@whatwg-node/fetch@^0.9.17": + version "0.9.23" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.23.tgz#eeb953f5fbf6b83ba944cc71a0eef59d8164b01d" + integrity sha512-7xlqWel9JsmxahJnYVUj/LLxWcnA93DR4c9xlw3U814jWTiYalryiH1qToik1hOxweKKRLi4haXHM5ycRksPBA== + dependencies: + "@whatwg-node/node-fetch" "^0.6.0" + urlpattern-polyfill "^10.0.0" + +"@whatwg-node/node-fetch@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.6.0.tgz#9f6903319ff041eb6fadeba9009662bc64ab1707" + integrity sha512-tcZAhrpx6oVlkEsRngeTEEE7I5/QdLjeEz4IlekabGaESP7+Dkm/6a9KcF1KdCBB7mO9PXtBkwCuTCt8+UPg8Q== + dependencies: + "@kamilkisiela/fast-url-parser" "^1.1.4" + busboy "^1.6.0" + fast-querystring "^1.1.1" + tslib "^2.6.3" + +"@whatwg-node/node-fetch@^0.7.19": + version "0.7.19" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.7.19.tgz#b8c09eb785782512972137f3bc7e0dad78667cbc" + integrity sha512-ippPt75epj7Tg6H5znI9lBBQ4gi+x23QsIF7UN1Z02MUqzhbkjhGsUtNnYGS3osrqvyKtbGKmEya6IqIPRmtdw== + dependencies: + "@fastify/busboy" "^3.1.1" + "@whatwg-node/disposablestack" "^0.0.6" + "@whatwg-node/promise-helpers" "^1.3.2" + tslib "^2.6.3" + +"@whatwg-node/node-fetch@^0.7.21": + version "0.7.21" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.7.21.tgz#ba944eea7684047c91ac7f50097243633f6c9f5f" + integrity sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw== + dependencies: + "@fastify/busboy" "^3.1.1" + "@whatwg-node/disposablestack" "^0.0.6" + "@whatwg-node/promise-helpers" "^1.3.2" + tslib "^2.6.3" + +"@whatwg-node/promise-helpers@^1.0.0", "@whatwg-node/promise-helpers@^1.2.1", "@whatwg-node/promise-helpers@^1.2.2", "@whatwg-node/promise-helpers@^1.2.4", "@whatwg-node/promise-helpers@^1.3.0", "@whatwg-node/promise-helpers@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz#3b54987ad6517ef6db5920c66a6f0dada606587d" + integrity sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA== + dependencies: + tslib "^2.6.3" + +"@whatwg-node/server@^0.9.33": + version "0.9.71" + resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.9.71.tgz#5715011b58ab8a0a8abb25759a426ff50d2dce4b" + integrity sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g== + dependencies: + "@whatwg-node/disposablestack" "^0.0.6" + "@whatwg-node/fetch" "^0.10.5" + "@whatwg-node/promise-helpers" "^1.2.2" + tslib "^2.6.3" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" @@ -808,6 +1579,11 @@ ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" @@ -820,6 +1596,11 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^3.0.3: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" @@ -840,6 +1621,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + await-timeout@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/await-timeout/-/await-timeout-1.1.1.tgz" @@ -918,6 +1709,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" @@ -947,6 +1745,26 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" @@ -967,6 +1785,17 @@ caniuse-lite@^1.0.30001688: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz" integrity sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ== +chai@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.2.0.tgz#1358ee106763624114addf84ab02697e411c9c05" + integrity sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@^4.0.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -980,6 +1809,11 @@ char-regex@^1.0.2: resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + ci-info@^3.2.0: version "3.8.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" @@ -1021,6 +1855,13 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -1036,6 +1877,13 @@ convert-source-map@^2.0.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cross-inspect@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cross-inspect/-/cross-inspect-1.0.1.tgz#15f6f65e4ca963cf4cc1a2b5fef18f6ca328712b" + integrity sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A== + dependencies: + tslib "^2.4.0" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -1045,7 +1893,16 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -dataloader@^2.2.2: +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +dataloader@2.2.2, dataloader@^2.2.2: version "2.2.2" resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz" integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== @@ -1062,11 +1919,23 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: dependencies: ms "2.1.2" +debug@^4.3.4, debug@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + dedent@^1.0.0: version "1.5.1" resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -1077,6 +1946,11 @@ deepmerge@^4.2.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" @@ -1099,6 +1973,25 @@ dset@3.1.2: resolved "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz" integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== +dset@^3.1.1, dset@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.4.tgz#f8eaf5f023f068a036d08cd07dc9ffb7d0065248" + integrity sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + electron-to-chromium@^1.5.73: version "1.5.91" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.91.tgz" @@ -1114,6 +2007,11 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" @@ -1121,6 +2019,69 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +esbuild@^0.25.0: + version "0.25.4" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.4.tgz#bb9a16334d4ef2c33c7301a924b8b863351a0854" + integrity sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.4" + "@esbuild/android-arm" "0.25.4" + "@esbuild/android-arm64" "0.25.4" + "@esbuild/android-x64" "0.25.4" + "@esbuild/darwin-arm64" "0.25.4" + "@esbuild/darwin-x64" "0.25.4" + "@esbuild/freebsd-arm64" "0.25.4" + "@esbuild/freebsd-x64" "0.25.4" + "@esbuild/linux-arm" "0.25.4" + "@esbuild/linux-arm64" "0.25.4" + "@esbuild/linux-ia32" "0.25.4" + "@esbuild/linux-loong64" "0.25.4" + "@esbuild/linux-mips64el" "0.25.4" + "@esbuild/linux-ppc64" "0.25.4" + "@esbuild/linux-riscv64" "0.25.4" + "@esbuild/linux-s390x" "0.25.4" + "@esbuild/linux-x64" "0.25.4" + "@esbuild/netbsd-arm64" "0.25.4" + "@esbuild/netbsd-x64" "0.25.4" + "@esbuild/openbsd-arm64" "0.25.4" + "@esbuild/openbsd-x64" "0.25.4" + "@esbuild/sunos-x64" "0.25.4" + "@esbuild/win32-arm64" "0.25.4" + "@esbuild/win32-ia32" "0.25.4" + "@esbuild/win32-x64" "0.25.4" + escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" @@ -1136,6 +2097,19 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@^10.1.5: + version "10.1.5" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz#00c18d7225043b6fbce6a665697377998d453782" + integrity sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw== + +eslint-plugin-prettier@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz#54d4748904e58eaf1ffe26c4bffa4986ca7f952b" + integrity sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.11.0" + eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" @@ -1149,6 +2123,11 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + eslint@^8.31.0: version "8.48.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz" @@ -1225,6 +2204,13 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -1250,6 +2236,11 @@ exit@^0.1.2: resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expect-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.1.tgz#af76d8b357cf5fa76c41c09dafb79c549e75f71f" + integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== + expect@^29.6.4: version "29.6.4" resolved "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz" @@ -1261,11 +2252,32 @@ expect@^29.6.4: jest-message-util "^29.6.3" jest-util "^29.6.3" +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" @@ -1276,6 +2288,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-querystring@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" + integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== + dependencies: + fast-decode-uri-component "^1.0.1" + fastq@^1.6.0: version "1.15.0" resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" @@ -1290,6 +2309,16 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fdir@^6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== + +fflate@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" @@ -1334,17 +2363,40 @@ flatted@^3.2.7: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + foreach@^2.0.4: version "2.0.6" resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz" integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.12" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -1354,6 +2406,11 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" @@ -1364,16 +2421,47 @@ get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" @@ -1381,6 +2469,18 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob@^10.2.5, glob@^10.4.1: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -1405,6 +2505,11 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" @@ -1415,6 +2520,23 @@ graphemer@^1.4.0: resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql-yoga@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-5.3.1.tgz#8d6385f97e4f1b1921f344653a6b57482cd7abdc" + integrity sha512-n918QV6TF7xTjb9ASnozgsr4ydMc08c+x4eRAWKxxWVwSnzdP2xeN2zw1ljIzRD0ccSCNoBajGDKwcZkJDitPA== + dependencies: + "@envelop/core" "^5.0.0" + "@graphql-tools/executor" "^1.2.5" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.1.0" + "@graphql-yoga/logger" "^2.0.0" + "@graphql-yoga/subscription" "^5.0.0" + "@whatwg-node/fetch" "^0.9.17" + "@whatwg-node/server" "^0.9.33" + dset "^3.1.1" + lru-cache "^10.0.0" + tslib "^2.5.2" + graphql@^16.6.0: version "16.8.0" resolved "https://registry.npmjs.org/graphql/-/graphql-16.8.0.tgz" @@ -1425,6 +2547,18 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" @@ -1432,6 +2566,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" @@ -1447,6 +2588,11 @@ ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.4.tgz#a12c70d0f2607c5bf508fb65a40c75f037d7a078" + integrity sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" @@ -1508,7 +2654,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -1540,6 +2686,11 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== +istanbul-lib-coverage@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" @@ -1562,7 +2713,7 @@ istanbul-lib-instrument@^6.0.0: istanbul-lib-coverage "^3.2.0" semver "^7.5.4" -istanbul-lib-report@^3.0.0: +istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== @@ -1580,6 +2731,15 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" +istanbul-lib-source-maps@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" + integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== + dependencies: + "@jridgewell/trace-mapping" "^0.3.23" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + istanbul-reports@^3.1.3: version "3.1.6" resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz" @@ -1588,6 +2748,23 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +istanbul-reports@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-changed-files@^29.6.3: version "29.6.3" resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz" @@ -2063,6 +3240,16 @@ lodash.topath@4.5.2: resolved "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz" integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== +loupe@^3.1.0, loupe@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.3.tgz#042a8f7986d77f3d0f98ef7990a2b2fef18b0fd2" + integrity sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug== + +lru-cache@^10.0.0, lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" @@ -2077,6 +3264,22 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +magicast@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.5.tgz#8301c3c7d66704a0771eb1bad74274f0ec036739" + integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== + dependencies: + "@babel/parser" "^7.25.4" + "@babel/types" "^7.25.4" + source-map-js "^1.2.0" + make-cancellable-promise@^1.1.0: version "1.3.1" resolved "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.1.tgz" @@ -2096,12 +3299,27 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^4.0.4: +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +meros@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.3.0.tgz#c617d2092739d55286bf618129280f362e6242f2" + integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== + +micromatch@^4.0.4, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -2109,6 +3327,18 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -2121,11 +3351,38 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mrmime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== + ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -2219,6 +3476,11 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -2236,6 +3498,11 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +path-browserify@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" @@ -2256,6 +3523,24 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" @@ -2266,6 +3551,11 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pirates@^4.0.4: version "4.0.6" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" @@ -2278,11 +3568,32 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +postcss@^8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== + pretty-format@^29.6.3: version "29.7.0" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" @@ -2361,6 +3672,13 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.1.tgz#0881323ab94ad45fec7c0221f27ea1a142f3f0d0" + integrity sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg== + dependencies: + glob "^10.2.5" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" @@ -2368,6 +3686,35 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup@^4.34.9: + version "4.40.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.2.tgz#778e88b7a197542682b3e318581f7697f55f0619" + integrity sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg== + dependencies: + "@types/estree" "1.0.7" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.40.2" + "@rollup/rollup-android-arm64" "4.40.2" + "@rollup/rollup-darwin-arm64" "4.40.2" + "@rollup/rollup-darwin-x64" "4.40.2" + "@rollup/rollup-freebsd-arm64" "4.40.2" + "@rollup/rollup-freebsd-x64" "4.40.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.40.2" + "@rollup/rollup-linux-arm-musleabihf" "4.40.2" + "@rollup/rollup-linux-arm64-gnu" "4.40.2" + "@rollup/rollup-linux-arm64-musl" "4.40.2" + "@rollup/rollup-linux-loongarch64-gnu" "4.40.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.40.2" + "@rollup/rollup-linux-riscv64-gnu" "4.40.2" + "@rollup/rollup-linux-riscv64-musl" "4.40.2" + "@rollup/rollup-linux-s390x-gnu" "4.40.2" + "@rollup/rollup-linux-x64-gnu" "4.40.2" + "@rollup/rollup-linux-x64-musl" "4.40.2" + "@rollup/rollup-win32-arm64-msvc" "4.40.2" + "@rollup/rollup-win32-ia32-msvc" "4.40.2" + "@rollup/rollup-win32-x64-msvc" "4.40.2" + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -2387,6 +3734,11 @@ semver@^7.5.3, semver@^7.5.4: dependencies: lru-cache "^6.0.0" +semver@^7.6.0: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -2399,11 +3751,30 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sirv@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.1.tgz#32a844794655b727f9e2867b777e0060fbe07bf3" + integrity sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -2414,6 +3785,11 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +source-map-js@^1.2.0, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" @@ -2439,6 +3815,21 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" @@ -2447,6 +3838,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -2456,6 +3856,22 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -2463,6 +3879,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" @@ -2497,6 +3920,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.11.0: + version "0.11.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.5.tgz#258b3185736512f7ef11a42d67c4f3ad49da1744" + integrity sha512-frqvfWyDA5VPVdrWfH24uM6SI/O8NLpVbIIJxb8t/a3YGsp4AW9CYgSKC0OaSEfexnp7Y1pVh2Y6IHO8ggGDmA== + dependencies: + "@pkgr/core" "^0.2.4" + tslib "^2.8.1" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -2506,6 +3937,15 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +test-exclude@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.1.tgz#20b3ba4906ac20994e275bbcafd68d510264c2a2" + integrity sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^10.4.1" + minimatch "^9.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -2516,6 +3956,39 @@ tiny-lru@8.0.2: resolved "https://registry.npmjs.org/tiny-lru/-/tiny-lru-8.0.2.tgz" integrity sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +tinypool@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" + integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== + +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" @@ -2528,16 +4001,31 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + tr46@~0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-api-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== + tslib@^2.4.0, tslib@^2.5.0: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.5.2, tslib@^2.6.3, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -2560,6 +4048,16 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +typescript@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + update-browserslist-db@^1.1.1: version "1.1.2" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz" @@ -2575,6 +4073,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urlpattern-polyfill@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz#1b2517e614136c73ba32948d5e7a3a063cba8e74" + integrity sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw== + v8-to-istanbul@^9.0.1: version "9.1.0" resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" @@ -2589,6 +4092,58 @@ value-or-promise@1.0.12, value-or-promise@^1.0.12: resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz" integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== +vite-node@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.1.3.tgz#d021ced40b5a057305eaea9ce62c610c33b60a48" + integrity sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA== + dependencies: + cac "^6.7.14" + debug "^4.4.0" + es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0" + +"vite@^5.0.0 || ^6.0.0": + version "6.3.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.5.tgz#fec73879013c9c0128c8d284504c6d19410d12a3" + integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== + dependencies: + esbuild "^0.25.0" + fdir "^6.4.4" + picomatch "^4.0.2" + postcss "^8.5.3" + rollup "^4.34.9" + tinyglobby "^0.2.13" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.1.3.tgz#0b0b01932408cd3af61867f4468d28bd83406ffb" + integrity sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw== + dependencies: + "@vitest/expect" "3.1.3" + "@vitest/mocker" "3.1.3" + "@vitest/pretty-format" "^3.1.3" + "@vitest/runner" "3.1.3" + "@vitest/snapshot" "3.1.3" + "@vitest/spy" "3.1.3" + "@vitest/utils" "3.1.3" + chai "^5.2.0" + debug "^4.4.0" + expect-type "^1.2.1" + magic-string "^0.30.17" + pathe "^2.0.3" + std-env "^3.9.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.13" + tinypool "^1.0.2" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0" + vite-node "3.1.3" + why-is-node-running "^2.3.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" @@ -2616,6 +4171,23 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -2625,6 +4197,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"