From 6c480a4375e2b5afa9e2f65d8677231c6df021ae Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 29 Mar 2026 12:44:00 +0200 Subject: [PATCH] perf: replace node-fetch with undici (#10537) Replace node-fetch with native undici for HTTP requests throughout pnpm. Key changes: - Replace node-fetch with undici's fetch() and dispatcher system - Replace @pnpm/network.agent with a new dispatcher module in @pnpm/network.fetch - Cache dispatchers via LRU cache keyed by connection parameters - Handle proxies via undici ProxyAgent instead of http/https-proxy-agent - Convert test mocking from nock to undici MockAgent where applicable - Add minimatch@9 override to fix ESM incompatibility with brace-expansion --- .changeset/replace-node-fetch-with-undici.md | 13 + .../reporterForClient/reportRequestRetry.ts | 5 +- .../test/reportingRequestRetry.ts | 8 +- core/core-loggers/src/requestRetryLogger.ts | 15 +- cspell.json | 2 + deps/compliance/audit/package.json | 4 +- deps/compliance/audit/src/index.ts | 10 +- deps/compliance/audit/test/index.ts | 179 +- deps/compliance/audit/tsconfig.json | 3 + deps/compliance/commands/package.json | 1 + deps/compliance/commands/src/audit/audit.ts | 2 +- deps/compliance/commands/test/audit/fix.ts | 22 +- .../commands/test/audit/fixWithUpdate.ts | 55 +- deps/compliance/commands/test/audit/ignore.ts | 26 +- deps/compliance/commands/test/audit/index.ts | 79 +- .../test/audit/preserveReferenceOverrides.ts | 20 +- .../commands/test/audit/utils/options.ts | 2 +- .../test/audit/utils/responses/update.ts | 2 +- deps/compliance/commands/tsconfig.json | 3 + engine/pm/commands/package.json | 4 +- .../test/self-updater/selfUpdate.test.ts | 117 +- engine/pm/commands/tsconfig.json | 3 + fetching/pick-fetcher/package.json | 4 +- fetching/pick-fetcher/test/customFetch.ts | 220 +- fetching/tarball-fetcher/package.json | 4 +- .../src/remoteTarballFetcher.ts | 36 +- fetching/tarball-fetcher/test/fetch.ts | 235 +- fetching/types/package.json | 3 +- fetching/types/src/index.ts | 5 +- installing/client/src/index.ts | 4 +- installing/commands/package.json | 2 +- installing/commands/test/saveCatalog.ts | 14 +- installing/commands/tsconfig.json | 3 + installing/deps-installer/package.json | 1 + .../test/install/blockExoticSubdeps.ts | 18 +- .../test/install/denoRuntime.ts | 29 +- .../deps-installer/test/install/errors.ts | 25 +- .../deps-installer/test/install/fromRepo.ts | 69 +- installing/deps-installer/test/lockfile.ts | 53 +- installing/deps-installer/tsconfig.json | 3 + installing/package-requester/package.json | 2 +- installing/package-requester/test/index.ts | 45 +- installing/package-requester/tsconfig.json | 3 + lockfile/to-pnp/src/index.ts | 1 - network/fetch/package.json | 12 +- network/fetch/src/dispatcher.ts | 348 ++ network/fetch/src/fetch.ts | 64 +- network/fetch/src/fetchFromRegistry.ts | 47 +- network/fetch/src/index.ts | 5 +- network/fetch/test/dispatcher.test.ts | 271 + network/fetch/test/fetchFromRegistry.test.ts | 251 +- network/fetch/tsconfig.json | 3 + pnpm-lock.yaml | 4669 +++++++++-------- pnpm-workspace.yaml | 11 +- resolving/default-resolver/package.json | 3 +- .../default-resolver/test/customResolver.ts | 1 - .../git-resolver/__mocks__/@pnpm/fetch.js | 2 +- resolving/git-resolver/package.json | 1 - resolving/git-resolver/src/index.ts | 4 +- .../git-resolver/src/parseBareSpecifier.ts | 17 +- resolving/git-resolver/test/index.ts | 10 +- resolving/npm-resolver/package.json | 2 +- resolving/npm-resolver/src/fetch.ts | 10 +- .../npm-resolver/test/clearCache.test.ts | 22 +- .../npm-resolver/test/distTagsByDate.test.ts | 32 +- resolving/npm-resolver/test/index.ts | 332 +- .../test/optionalDependencies.test.ts | 47 +- .../npm-resolver/test/publishedBy.test.ts | 28 +- .../npm-resolver/test/resolveJsr.test.ts | 44 +- resolving/npm-resolver/test/utils/index.ts | 2 + resolving/npm-resolver/tsconfig.json | 3 + testing/mock-agent/package.json | 46 + testing/mock-agent/src/index.ts | 35 + testing/mock-agent/tsconfig.json | 16 + testing/mock-agent/tsconfig.lint.json | 8 + 75 files changed, 4411 insertions(+), 3289 deletions(-) create mode 100644 .changeset/replace-node-fetch-with-undici.md create mode 100644 network/fetch/src/dispatcher.ts create mode 100644 network/fetch/test/dispatcher.test.ts create mode 100644 testing/mock-agent/package.json create mode 100644 testing/mock-agent/src/index.ts create mode 100644 testing/mock-agent/tsconfig.json create mode 100644 testing/mock-agent/tsconfig.lint.json diff --git a/.changeset/replace-node-fetch-with-undici.md b/.changeset/replace-node-fetch-with-undici.md new file mode 100644 index 0000000000..02ac36e7ec --- /dev/null +++ b/.changeset/replace-node-fetch-with-undici.md @@ -0,0 +1,13 @@ +--- +"@pnpm/network.fetch": major +"@pnpm/fetching.types": major +"pnpm": minor +--- + +Replace node-fetch with undici as the HTTP client [#10537](https://github.com/pnpm/pnpm/pull/10537). + +- Use undici's native `fetch()` with dispatcher-based connection management +- Support HTTP, HTTPS, SOCKS4, and SOCKS5 proxies +- Cache dispatchers via LRU cache keyed by connection parameters +- Handle per-registry client certificates via nerf-dart URL matching +- Convert test HTTP mocking from nock to undici MockAgent diff --git a/cli/default-reporter/src/reporterForClient/reportRequestRetry.ts b/cli/default-reporter/src/reporterForClient/reportRequestRetry.ts index 03879e4f96..ac8d4f4924 100644 --- a/cli/default-reporter/src/reporterForClient/reportRequestRetry.ts +++ b/cli/default-reporter/src/reporterForClient/reportRequestRetry.ts @@ -11,7 +11,10 @@ export function reportRequestRetry ( return requestRetry$.pipe( map((log) => { const retriesLeft = log.maxRetries - log.attempt + 1 - const errorCode = log.error.httpStatusCode ?? log.error.status ?? log.error.errno ?? log.error.code + // Extract error code from various possible locations + // HTTP status codes are numeric, system error codes are strings + const errorCode = log.error.status ?? log.error.statusCode ?? log.error.code ?? log.error.errno ?? + log.error.cause?.code ?? log.error.cause?.errno ?? 'unknown' const msg = `${log.method} ${log.url} error (${errorCode}). \ Will retry in ${prettyMilliseconds(log.timeout, { verbose: true })}. \ ${retriesLeft} retries left.` diff --git a/cli/default-reporter/test/reportingRequestRetry.ts b/cli/default-reporter/test/reportingRequestRetry.ts index e577840a6f..e2f90697b8 100644 --- a/cli/default-reporter/test/reportingRequestRetry.ts +++ b/cli/default-reporter/test/reportingRequestRetry.ts @@ -17,7 +17,11 @@ test('print warning about request retry', async () => { requestRetryLogger.debug({ attempt: 2, - error: new Error(), + error: { + name: 'Error', + message: 'Connection failed', + code: 'ECONNREFUSED', + }, maxRetries: 5, method: 'GET', timeout: 12500, @@ -27,5 +31,5 @@ test('print warning about request retry', async () => { expect.assertions(1) const output = await firstValueFrom(output$) - expect(output).toBe(formatWarn('GET https://foo.bar/qar error (undefined). Will retry in 12.5 seconds. 4 retries left.')) + expect(output).toBe(formatWarn('GET https://foo.bar/qar error (ECONNREFUSED). Will retry in 12.5 seconds. 4 retries left.')) }) diff --git a/core/core-loggers/src/requestRetryLogger.ts b/core/core-loggers/src/requestRetryLogger.ts index 4737b51753..44c5e8f3d6 100644 --- a/core/core-loggers/src/requestRetryLogger.ts +++ b/core/core-loggers/src/requestRetryLogger.ts @@ -5,11 +5,20 @@ import { export const requestRetryLogger = logger('request-retry') -export interface RequestRetryError extends Error { - httpStatusCode?: string - status?: string +export interface RequestRetryError { + name?: string + message?: string + // HTTP status codes (numeric) + status?: number + statusCode?: number + // System error properties errno?: number code?: string + // undici wraps the actual error in a cause property + cause?: { + code?: string + errno?: number + } } export interface RequestRetryMessage { diff --git a/cspell.json b/cspell.json index d3763ea84f..16918ff1b3 100644 --- a/cspell.json +++ b/cspell.json @@ -2,6 +2,8 @@ "words": [ "adduser", "adipiscing", + "agentkeepalive", + "agentkeepalive's", "amet", "andreineculau", "appdata", diff --git a/deps/compliance/audit/package.json b/deps/compliance/audit/package.json index 41ce803716..d5cd51a8f9 100644 --- a/deps/compliance/audit/package.json +++ b/deps/compliance/audit/package.json @@ -52,8 +52,8 @@ "@pnpm/deps.compliance.audit": "workspace:*", "@pnpm/logger": "workspace:*", "@pnpm/test-fixtures": "workspace:*", - "@types/ramda": "catalog:", - "nock": "catalog:" + "@pnpm/testing.mock-agent": "workspace:*", + "@types/ramda": "catalog:" }, "engines": { "node": ">=22.13" diff --git a/deps/compliance/audit/src/index.ts b/deps/compliance/audit/src/index.ts index c21b21ed3a..1a3fb997fe 100644 --- a/deps/compliance/audit/src/index.ts +++ b/deps/compliance/audit/src/index.ts @@ -1,7 +1,7 @@ import { PnpmError } from '@pnpm/error' import type { GetAuthHeader } from '@pnpm/fetching.types' import type { EnvLockfile, LockfileObject } from '@pnpm/lockfile.types' -import { type AgentOptions, fetchWithAgent, type RetryTimeoutOptions } from '@pnpm/network.fetch' +import { type DispatcherOptions, fetchWithDispatcher, type RetryTimeoutOptions } from '@pnpm/network.fetch' import type { DependenciesField } from '@pnpm/types' import { lockfileToAuditTree } from './lockfileToAuditTree.js' @@ -13,7 +13,7 @@ export async function audit ( lockfile: LockfileObject, getAuthHeader: GetAuthHeader, opts: { - agentOptions?: AgentOptions + dispatcherOptions?: DispatcherOptions envLockfile?: EnvLockfile | null include?: { [dependenciesField in DependenciesField]: boolean } lockfileDir: string @@ -34,7 +34,7 @@ export async function audit ( ...getAuthHeaders(authHeaderValue), } const requestOptions = { - agentOptions: opts.agentOptions ?? {}, + dispatcherOptions: opts.dispatcherOptions ?? {}, body: requestBody, headers: requestHeaders, method: 'POST', @@ -42,13 +42,13 @@ export async function audit ( timeout: opts.timeout, } - const quickRes = await fetchWithAgent(quickAuditUrl, requestOptions) + const quickRes = await fetchWithDispatcher(quickAuditUrl, requestOptions) if (quickRes.status === 200) { return (quickRes.json() as Promise) } - const res = await fetchWithAgent(auditUrl, requestOptions) + const res = await fetchWithDispatcher(auditUrl, requestOptions) if (res.status === 200) { return (res.json() as Promise) } diff --git a/deps/compliance/audit/test/index.ts b/deps/compliance/audit/test/index.ts index 8aa4ac4c8d..341fe12ce8 100644 --- a/deps/compliance/audit/test/index.ts +++ b/deps/compliance/audit/test/index.ts @@ -2,8 +2,8 @@ import { LOCKFILE_VERSION } from '@pnpm/constants' import { audit } from '@pnpm/deps.compliance.audit' import type { PnpmError } from '@pnpm/error' import { fixtures } from '@pnpm/test-fixtures' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import type { DepPath, ProjectId } from '@pnpm/types' -import nock from 'nock' import { lockfileToAuditTree } from '../lib/lockfileToAuditTree.js' @@ -460,53 +460,51 @@ describe('audit', () => { test('an error is thrown if the audit endpoint responds with a non-OK code', async () => { const registry = 'http://registry.registry/' const getAuthHeader = () => undefined - nock(registry, { - badheaders: ['authorization'], - }) - .post('/-/npm/v1/security/audits/quick') + await setupMockAgent() + getMockAgent().get('http://registry.registry') + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(500, { message: 'Something bad happened' }) - nock(registry, { - badheaders: ['authorization'], - }) - .post('/-/npm/v1/security/audits') + getMockAgent().get('http://registry.registry') + .intercept({ path: '/-/npm/v1/security/audits', method: 'POST' }) .reply(500, { message: 'Fallback failed too' }) - let err!: PnpmError try { - await audit({ - importers: {}, - lockfileVersion: LOCKFILE_VERSION, - }, - getAuthHeader, - { - lockfileDir: f.find('one-project'), - registry, - retry: { - retries: 0, + let err!: PnpmError + try { + await audit({ + importers: {}, + lockfileVersion: LOCKFILE_VERSION, }, - virtualStoreDirMaxLength: 120, - }) - } catch (_err: any) { // eslint-disable-line - err = _err - } + getAuthHeader, + { + lockfileDir: f.find('one-project'), + registry, + retry: { + retries: 0, + }, + virtualStoreDirMaxLength: 120, + }) + } catch (_err: any) { // eslint-disable-line + err = _err + } - expect(err).toBeDefined() - expect(err.code).toBe('ERR_PNPM_AUDIT_BAD_RESPONSE') - expect(err.message).toBe('The audit endpoint (at http://registry.registry/-/npm/v1/security/audits/quick) responded with 500: {"message":"Something bad happened"}. Fallback endpoint (at http://registry.registry/-/npm/v1/security/audits) responded with 500: {"message":"Fallback failed too"}') + expect(err).toBeDefined() + expect(err.code).toBe('ERR_PNPM_AUDIT_BAD_RESPONSE') + expect(err.message).toBe('The audit endpoint (at http://registry.registry/-/npm/v1/security/audits/quick) responded with 500: {"message":"Something bad happened"}. Fallback endpoint (at http://registry.registry/-/npm/v1/security/audits) responded with 500: {"message":"Fallback failed too"}') + } finally { + await teardownMockAgent() + } }) test('falls back to /audits if /audits/quick fails', async () => { const registry = 'http://registry.registry/' const getAuthHeader = () => undefined - nock(registry, { - badheaders: ['authorization'], - }) - .post('/-/npm/v1/security/audits/quick') + await setupMockAgent() + getMockAgent().get('http://registry.registry') + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(500, { message: 'Something bad happened' }) - nock(registry, { - badheaders: ['authorization'], - }) - .post('/-/npm/v1/security/audits') + getMockAgent().get('http://registry.registry') + .intercept({ path: '/-/npm/v1/security/audits', method: 'POST' }) .reply(200, { actions: [], advisories: {}, @@ -526,35 +524,88 @@ describe('audit', () => { muted: [], }) - expect(await audit({ - importers: {}, - lockfileVersion: LOCKFILE_VERSION, - }, - getAuthHeader, - { - lockfileDir: f.find('one-project'), - registry, - retry: { - retries: 0, + try { + expect(await audit({ + importers: {}, + lockfileVersion: LOCKFILE_VERSION, }, - virtualStoreDirMaxLength: 120, - })).toEqual({ - actions: [], - advisories: {}, - metadata: { - dependencies: 0, - devDependencies: 0, - optionalDependencies: 0, - totalDependencies: 0, - vulnerabilities: { - critical: 0, - high: 0, - info: 0, - low: 0, - moderate: 0, + getAuthHeader, + { + lockfileDir: f.find('one-project'), + registry, + retry: { + retries: 0, }, - }, - muted: [], - }) + virtualStoreDirMaxLength: 120, + })).toEqual({ + actions: [], + advisories: {}, + metadata: { + dependencies: 0, + devDependencies: 0, + optionalDependencies: 0, + totalDependencies: 0, + vulnerabilities: { + critical: 0, + high: 0, + info: 0, + low: 0, + moderate: 0, + }, + }, + muted: [], + }) + } finally { + await teardownMockAgent() + } + }) + + test('sends authorization header when getAuthHeader returns a value', async () => { + const registry = 'http://registry.registry/' + const getAuthHeader = () => 'Bearer test-token' + await setupMockAgent() + // intercept will only match if the authorization header is present and correct + getMockAgent().get('http://registry.registry') + .intercept({ + path: '/-/npm/v1/security/audits/quick', + method: 'POST', + headers: { authorization: 'Bearer test-token' }, + }) + .reply(200, { actions: [], advisories: {}, metadata: { dependencies: 0, devDependencies: 0, optionalDependencies: 0, totalDependencies: 0, vulnerabilities: { critical: 0, high: 0, info: 0, low: 0, moderate: 0 } }, muted: [] }) + + try { + const result = await audit( + { importers: {}, lockfileVersion: LOCKFILE_VERSION }, + getAuthHeader, + { lockfileDir: f.find('one-project'), registry, retry: { retries: 0 }, virtualStoreDirMaxLength: 120 } + ) + expect(result.advisories).toEqual({}) + } finally { + await teardownMockAgent() + } + }) + + test('does not send authorization header when getAuthHeader returns undefined', async () => { + const registry = 'http://registry.registry/' + const getAuthHeader = () => undefined + await setupMockAgent() + let capturedHeaders: Record = {} + getMockAgent().get('http://registry.registry') + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) + .reply(200, (opts) => { + capturedHeaders = opts.headers as Record + return { actions: [], advisories: {}, metadata: { dependencies: 0, devDependencies: 0, optionalDependencies: 0, totalDependencies: 0, vulnerabilities: { critical: 0, high: 0, info: 0, low: 0, moderate: 0 } }, muted: [] } + }) + + try { + await audit( + { importers: {}, lockfileVersion: LOCKFILE_VERSION }, + getAuthHeader, + { lockfileDir: f.find('one-project'), registry, retry: { retries: 0 }, virtualStoreDirMaxLength: 120 } + ) + expect(capturedHeaders).not.toHaveProperty('authorization') + } finally { + await teardownMockAgent() + } }) }) diff --git a/deps/compliance/audit/tsconfig.json b/deps/compliance/audit/tsconfig.json index 523e24f237..5fa9a769e3 100644 --- a/deps/compliance/audit/tsconfig.json +++ b/deps/compliance/audit/tsconfig.json @@ -45,6 +45,9 @@ { "path": "../../../network/fetch" }, + { + "path": "../../../testing/mock-agent" + }, { "path": "../../../workspace/project-manifest-reader" } diff --git a/deps/compliance/commands/package.json b/deps/compliance/commands/package.json index 762b85a86e..769ed2da55 100644 --- a/deps/compliance/commands/package.json +++ b/deps/compliance/commands/package.json @@ -68,6 +68,7 @@ "@pnpm/prepare": "workspace:*", "@pnpm/registry-mock": "catalog:", "@pnpm/test-fixtures": "workspace:*", + "@pnpm/testing.mock-agent": "workspace:*", "@pnpm/workspace.projects-filter": "workspace:*", "@types/ramda": "catalog:", "@types/semver": "catalog:", diff --git a/deps/compliance/commands/src/audit/audit.ts b/deps/compliance/commands/src/audit/audit.ts index 8ea0cc67ce..5785d313ba 100644 --- a/deps/compliance/commands/src/audit/audit.ts +++ b/deps/compliance/commands/src/audit/audit.ts @@ -190,7 +190,7 @@ export async function handler (opts: AuditOptions): Promise<{ exitCode: number, const getAuthHeader = createGetAuthHeaderByURI({ allSettings: opts.rawConfig, userSettings: opts.userConfig }) try { auditReport = await audit(lockfile, getAuthHeader, { - agentOptions: { + dispatcherOptions: { ca: opts.ca, cert: opts.cert, httpProxy: opts.httpProxy, diff --git a/deps/compliance/commands/test/audit/fix.ts b/deps/compliance/commands/test/audit/fix.ts index cd808a049b..e6afc07da8 100644 --- a/deps/compliance/commands/test/audit/fix.ts +++ b/deps/compliance/commands/test/audit/fix.ts @@ -2,7 +2,7 @@ import path from 'node:path' import { audit } from '@pnpm/deps.compliance.commands' import { fixtures } from '@pnpm/test-fixtures' -import nock from 'nock' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { readYamlFileSync } from 'read-yaml-file' import { AUDIT_REGISTRY, AUDIT_REGISTRY_OPTS } from './utils/options.js' @@ -10,11 +10,19 @@ import * as responses from './utils/responses/index.js' const f = fixtures(import.meta.dirname) +beforeEach(async () => { + await setupMockAgent() +}) + +afterEach(async () => { + await teardownMockAgent() +}) + test('overrides are added for vulnerable dependencies', async () => { const tmp = f.prepare('has-vulnerabilities') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ @@ -36,8 +44,8 @@ test('overrides are added for vulnerable dependencies', async () => { test('no overrides are added if no vulnerabilities are found', async () => { const tmp = f.prepare('fixture') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.NO_VULN_RESP) const { exitCode, output } = await audit.handler({ @@ -55,8 +63,8 @@ test('no overrides are added if no vulnerabilities are found', async () => { test('CVEs found in the allow list are not added as overrides', async () => { const tmp = f.prepare('has-vulnerabilities') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ diff --git a/deps/compliance/commands/test/audit/fixWithUpdate.ts b/deps/compliance/commands/test/audit/fixWithUpdate.ts index c0f5bdff04..5a03f65814 100644 --- a/deps/compliance/commands/test/audit/fixWithUpdate.ts +++ b/deps/compliance/commands/test/audit/fixWithUpdate.ts @@ -5,11 +5,11 @@ import { audit } from '@pnpm/deps.compliance.commands' import { readWantedLockfile } from '@pnpm/lockfile.fs' import { addDistTag } from '@pnpm/registry-mock' import { fixtures } from '@pnpm/test-fixtures' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import type { DepPath } from '@pnpm/types' import { readProjectManifest } from '@pnpm/workspace.project-manifest-reader' import { filterProjectsFromDir } from '@pnpm/workspace.projects-filter' import chalk from 'chalk' -import nock from 'nock' import { readYamlFileSync } from 'read-yaml-file' import { MOCK_REGISTRY, MOCK_REGISTRY_OPTS } from './utils/options.js' @@ -17,7 +17,14 @@ import { MOCK_REGISTRY, MOCK_REGISTRY_OPTS } from './utils/options.js' const f = fixtures(import.meta.dirname) describe('audit fix with update', () => { - afterEach(() => nock.cleanAll()) + beforeEach(async () => { + await setupMockAgent() + // These tests need real connections to the mock registry + getMockAgent().enableNetConnect(/localhost/) + }) + afterEach(async () => { + await teardownMockAgent() + }) test('top-level vulnerability is fixed by updating the vulnerable package', async () => { const tmp = f.prepare('update-single-depth-2') @@ -38,8 +45,8 @@ describe('audit fix with update', () => { const mockResponse = await readFile(join(tmp, 'responses', 'top-level-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { exitCode, output } = await audit.handler({ @@ -104,8 +111,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'top-level-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { exitCode, output } = await audit.handler({ @@ -165,8 +172,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'depth-2-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { exitCode, output } = await audit.handler({ @@ -216,8 +223,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'depth-3-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { exitCode, output } = await audit.handler({ @@ -270,8 +277,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'unfixable-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { exitCode, output } = await audit.handler({ @@ -334,8 +341,8 @@ The remaining vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'form-data-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { exitCode, output } = await audit.handler({ @@ -400,8 +407,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'top-level-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { @@ -474,8 +481,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'depth-2-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { @@ -555,8 +562,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'top-level-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { @@ -646,8 +653,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'top-level-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { @@ -734,8 +741,8 @@ The fixed vulnerabilities are: const mockResponse = await readFile(join(tmp, 'responses', 'top-level-vulnerability.json'), 'utf-8') expect(mockResponse).toBeTruthy() - nock(MOCK_REGISTRY, { allowUnmocked: true }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(MOCK_REGISTRY) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, mockResponse) const { diff --git a/deps/compliance/commands/test/audit/ignore.ts b/deps/compliance/commands/test/audit/ignore.ts index 6fcee0bc2e..b29febb971 100644 --- a/deps/compliance/commands/test/audit/ignore.ts +++ b/deps/compliance/commands/test/audit/ignore.ts @@ -2,7 +2,7 @@ import path from 'node:path' import { audit } from '@pnpm/deps.compliance.commands' import { fixtures } from '@pnpm/test-fixtures' -import nock from 'nock' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { readYamlFileSync } from 'read-yaml-file' import { AUDIT_REGISTRY, AUDIT_REGISTRY_OPTS } from './utils/options.js' @@ -10,11 +10,19 @@ import * as responses from './utils/responses/index.js' const f = fixtures(import.meta.dirname) +beforeEach(async () => { + await setupMockAgent() +}) + +afterEach(async () => { + await teardownMockAgent() +}) + test('ignores are added for vulnerable dependencies with no resolutions', async () => { const tmp = f.prepare('has-vulnerabilities') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ @@ -38,8 +46,8 @@ test('ignores are added for vulnerable dependencies with no resolutions', async test('the specified vulnerabilities are ignored', async () => { const tmp = f.prepare('has-vulnerabilities') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ @@ -61,8 +69,8 @@ test('the specified vulnerabilities are ignored', async () => { test('no ignores are added if no vulnerabilities are found', async () => { const tmp = f.prepare('fixture') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.NO_VULN_RESP) const { exitCode, output } = await audit.handler({ @@ -87,8 +95,8 @@ test('ignored CVEs are not duplicated', async () => { 'CVE-2017-16024', ] - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ diff --git a/deps/compliance/commands/test/audit/index.ts b/deps/compliance/commands/test/audit/index.ts index 65e3a7bfc9..8f4532f635 100644 --- a/deps/compliance/commands/test/audit/index.ts +++ b/deps/compliance/commands/test/audit/index.ts @@ -5,7 +5,7 @@ import { AuditEndpointNotExistsError } from '@pnpm/deps.compliance.audit' import { audit } from '@pnpm/deps.compliance.commands' import { install } from '@pnpm/installing.commands' import { fixtures } from '@pnpm/test-fixtures' -import nock from 'nock' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { AUDIT_REGISTRY, AUDIT_REGISTRY_OPTS, DEFAULT_OPTS } from './utils/options.js' import * as responses from './utils/responses/index.js' @@ -21,12 +21,15 @@ describe('plugin-commands-audit', () => { dir: hasVulnerabilitiesDir, }) }) - afterEach(() => { - nock.cleanAll() + beforeEach(async () => { + await setupMockAgent() + }) + afterEach(async () => { + await teardownMockAgent() }) test('audit', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { output, exitCode } = await audit.handler({ @@ -39,8 +42,8 @@ describe('plugin-commands-audit', () => { }) test('audit --dev', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.DEV_VULN_ONLY_RESP) const { output, exitCode } = await audit.handler({ @@ -56,8 +59,8 @@ describe('plugin-commands-audit', () => { }) test('audit --audit-level', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { output, exitCode } = await audit.handler({ @@ -72,8 +75,8 @@ describe('plugin-commands-audit', () => { }) test('audit: no vulnerabilities', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.NO_VULN_RESP) const { output, exitCode } = await audit.handler({ @@ -87,8 +90,8 @@ describe('plugin-commands-audit', () => { }) test('audit --json', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { output, exitCode } = await audit.handler({ @@ -104,8 +107,8 @@ describe('plugin-commands-audit', () => { }) test.skip('audit does not exit with code 1 if the found vulnerabilities are having lower severity then what we asked for', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.DEV_VULN_ONLY_RESP) const { output, exitCode } = await audit.handler({ @@ -122,8 +125,8 @@ describe('plugin-commands-audit', () => { }) test('audit --json respects audit-level', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.DEV_VULN_ONLY_RESP) const { exitCode, output } = await audit.handler({ @@ -141,8 +144,8 @@ describe('plugin-commands-audit', () => { }) test('audit --json filters advisories by audit-level', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.DEV_VULN_ONLY_RESP) const { exitCode, output } = await audit.handler({ @@ -165,11 +168,11 @@ describe('plugin-commands-audit', () => { }) test('audit does not exit with code 1 if the registry responds with a non-200 response and ignoreRegistryErrors is used', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(500, { message: 'Something bad happened' }) - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits', method: 'POST' }) .reply(500, { message: 'Fallback failed too' }) const { output, exitCode } = await audit.handler({ ...AUDIT_REGISTRY_OPTS, @@ -186,10 +189,12 @@ describe('plugin-commands-audit', () => { }) test('audit sends authToken', async () => { - nock(AUDIT_REGISTRY, { - reqheaders: { authorization: 'Bearer 123' }, - }) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ + path: '/-/npm/v1/security/audits/quick', + method: 'POST', + headers: { authorization: 'Bearer 123' }, + }) .reply(200, responses.NO_VULN_RESP) const { output, exitCode } = await audit.handler({ @@ -207,11 +212,11 @@ describe('plugin-commands-audit', () => { }) test('audit endpoint does not exist', async () => { - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(404, {}) - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits', method: 'POST' }) .reply(404, {}) await expect(audit.handler({ @@ -228,8 +233,8 @@ describe('plugin-commands-audit', () => { test('audit: CVEs in ignoreCves do not show up', async () => { const tmp = f.prepare('has-vulnerabilities') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ @@ -255,8 +260,8 @@ describe('plugin-commands-audit', () => { test('audit: CVEs in ignoreGhsas do not show up', async () => { const tmp = f.prepare('has-vulnerabilities') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ @@ -282,8 +287,8 @@ describe('plugin-commands-audit', () => { test('audit: CVEs in ignoreCves do not show up when JSON output is used', async () => { const tmp = f.prepare('has-vulnerabilities') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(AUDIT_REGISTRY.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { exitCode, output } = await audit.handler({ diff --git a/deps/compliance/commands/test/audit/preserveReferenceOverrides.ts b/deps/compliance/commands/test/audit/preserveReferenceOverrides.ts index 834f2b6b99..5cf8adb806 100644 --- a/deps/compliance/commands/test/audit/preserveReferenceOverrides.ts +++ b/deps/compliance/commands/test/audit/preserveReferenceOverrides.ts @@ -2,26 +2,36 @@ import path from 'node:path' import { audit } from '@pnpm/deps.compliance.commands' import { fixtures } from '@pnpm/test-fixtures' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { readProjectManifest } from '@pnpm/workspace.project-manifest-reader' -import nock from 'nock' import { readYamlFileSync } from 'read-yaml-file' -import { AUDIT_REGISTRY, AUDIT_REGISTRY_OPTS } from './utils/options.js' +import { DEFAULT_OPTS } from './utils/options.js' import * as responses from './utils/responses/index.js' const f = fixtures(import.meta.dirname) +const registries = DEFAULT_OPTS.registries + +beforeEach(async () => { + await setupMockAgent() +}) + +afterEach(async () => { + await teardownMockAgent() +}) + test('overrides with references (via $) are preserved during audit --fix', async () => { const tmp = f.prepare('preserve-reference-overrides') - nock(AUDIT_REGISTRY) - .post('/-/npm/v1/security/audits/quick') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/-/npm/v1/security/audits/quick', method: 'POST' }) .reply(200, responses.ALL_VULN_RESP) const { manifest: initialManifest } = await readProjectManifest(tmp) const { exitCode, output } = await audit.handler({ - ...AUDIT_REGISTRY_OPTS, + ...DEFAULT_OPTS, auditLevel: 'moderate', dir: tmp, rootProjectManifestDir: tmp, diff --git a/deps/compliance/commands/test/audit/utils/options.ts b/deps/compliance/commands/test/audit/utils/options.ts index 8914d64692..a27b533100 100644 --- a/deps/compliance/commands/test/audit/utils/options.ts +++ b/deps/compliance/commands/test/audit/utils/options.ts @@ -48,7 +48,7 @@ export const DEFAULT_OPTS = { registry: registries.default, sort: true, storeDir: '../store', - strictSsl: false, + strictSsl: true, userAgent: 'pnpm', userConfig: {}, useRunningStoreServer: false, diff --git a/deps/compliance/commands/test/audit/utils/responses/update.ts b/deps/compliance/commands/test/audit/utils/responses/update.ts index 35e3ee59d5..aa5d7b552f 100644 --- a/deps/compliance/commands/test/audit/utils/responses/update.ts +++ b/deps/compliance/commands/test/audit/utils/responses/update.ts @@ -20,7 +20,7 @@ async function writeResponse (lockfileDir: string, filename: string, opts: { } // @ts-expect-error const auditReport = await audit(lockfile!, { - agentOptions: {}, + dispatcherOptions: {}, include, registry: 'https://registry.npmjs.org/', }) diff --git a/deps/compliance/commands/tsconfig.json b/deps/compliance/commands/tsconfig.json index 255b180028..09b8930447 100644 --- a/deps/compliance/commands/tsconfig.json +++ b/deps/compliance/commands/tsconfig.json @@ -67,6 +67,9 @@ { "path": "../../../store/path" }, + { + "path": "../../../testing/mock-agent" + }, { "path": "../../../workspace/project-manifest-reader" }, diff --git a/engine/pm/commands/package.json b/engine/pm/commands/package.json index 49c32e9b94..e49b1cc825 100644 --- a/engine/pm/commands/package.json +++ b/engine/pm/commands/package.json @@ -66,11 +66,11 @@ "@pnpm/logger": "workspace:*", "@pnpm/prepare": "workspace:*", "@pnpm/shell.path": "workspace:*", + "@pnpm/testing.mock-agent": "workspace:*", "@types/cross-spawn": "catalog:", "@types/ramda": "catalog:", "@types/semver": "catalog:", - "cross-spawn": "catalog:", - "nock": "catalog:" + "cross-spawn": "catalog:" }, "engines": { "node": ">=22.13" diff --git a/engine/pm/commands/test/self-updater/selfUpdate.test.ts b/engine/pm/commands/test/self-updater/selfUpdate.test.ts index c61d6ef281..892d42fede 100644 --- a/engine/pm/commands/test/self-updater/selfUpdate.test.ts +++ b/engine/pm/commands/test/self-updater/selfUpdate.test.ts @@ -5,8 +5,8 @@ import path from 'node:path' import { jest } from '@jest/globals' import { prepare as prepareWithPkg, tempDir } from '@pnpm/prepare' import { prependDirsToPath } from '@pnpm/shell.path' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import spawn from 'cross-spawn' -import nock from 'nock' const require = createRequire(import.meta.dirname) const pnpmTarballPath = require.resolve('@pnpm/tgz-fixtures/tgz/pnpm-9.1.0.tgz') @@ -23,13 +23,13 @@ jest.unstable_mockModule('@pnpm/cli.meta', () => { }) const { selfUpdate, installPnpm, linkExePlatformBinary } = await import('@pnpm/engine.pm.commands') -afterEach(() => { - nock.cleanAll() - nock.disableNetConnect() +beforeEach(async () => { + await setupMockAgent() + getMockAgent().enableNetConnect() }) -beforeEach(() => { - nock.enableNetConnect() +afterEach(async () => { + await teardownMockAgent() }) function prepare (manifest: object = {}) { @@ -112,8 +112,8 @@ function createExeMetadata (version: string, registry: string) { * This prevents install() from making real HTTP requests for @pnpm/exe. */ function mockExeMetadata (registry: string, version: string) { - nock(registry) - .get('/@pnpm%2Fexe') // cspell:disable-line + getMockAgent().get(registry.replace(/\/$/, '')) + .intercept({ path: '/@pnpm%2Fexe', method: 'GET' }) // cspell:disable-line .reply(200, createExeMetadata(version, registry)) } @@ -123,14 +123,14 @@ function mockExeMetadata (registry: string, version: string) { */ function mockRegistryForUpdate (registry: string, version: string, metadata: object) { // Use persist for metadata since multiple components request it - nock(registry) - .persist() - .get('/pnpm') - .reply(200, metadata) + getMockAgent().get(registry.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, metadata).persist() mockExeMetadata(registry, version) - nock(registry) - .get(`/pnpm/-/pnpm-${version}.tgz`) - .replyWithFile(200, pnpmTarballPath) + const tgzData = fs.readFileSync(pnpmTarballPath) + getMockAgent().get(registry.replace(/\/$/, '')) + .intercept({ path: `/pnpm/-/pnpm-${version}.tgz`, method: 'GET' }) + .reply(200, tgzData) } test('self-update', async () => { @@ -161,14 +161,15 @@ test('self-update', async () => { test('self-update by exact version', async () => { const opts = prepare() const metadata = createMetadata('9.2.0', opts.registries.default, ['9.1.0']) - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, metadata) + const registry = opts.registries.default.replace(/\/$/, '') + getMockAgent().get(registry) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, metadata).persist() mockExeMetadata(opts.registries.default, '9.1.0') - nock(opts.registries.default) - .get('/pnpm/-/pnpm-9.1.0.tgz') - .replyWithFile(200, pnpmTarballPath) + const tgzData = fs.readFileSync(pnpmTarballPath) + getMockAgent().get(registry) + .intercept({ path: '/pnpm/-/pnpm-9.1.0.tgz', method: 'GET' }) + .reply(200, tgzData) await selfUpdate.handler(opts, ['9.1.0']) @@ -193,8 +194,8 @@ test('self-update by exact version', async () => { test('self-update does nothing when pnpm is up to date', async () => { const opts = prepare() - nock(opts.registries.default) - .get('/pnpm') + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) .reply(200, createMetadata('9.0.0', opts.registries.default)) const output = await selfUpdate.handler(opts, []) @@ -208,8 +209,8 @@ test('should update packageManager field when a newer pnpm version is available' fs.writeFileSync(pkgJsonPath, JSON.stringify({ packageManager: 'pnpm@8.0.0', }), 'utf8') - nock(opts.registries.default) - .get('/pnpm') + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) .reply(200, createMetadata('9.0.0', opts.registries.default)) const output = await selfUpdate.handler({ @@ -231,8 +232,8 @@ test('should not update packageManager field when current version matches latest fs.writeFileSync(pkgJsonPath, JSON.stringify({ packageManager: 'pnpm@9.0.0', }), 'utf8') - nock(opts.registries.default) - .get('/pnpm') + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) .reply(200, createMetadata('9.0.0', opts.registries.default)) const output = await selfUpdate.handler({ @@ -255,10 +256,9 @@ test('should update devEngines.packageManager version when a newer pnpm version }, }) const pkgJsonPath = path.join(opts.dir, 'package.json') - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, createMetadata('9.0.0', opts.registries.default)) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, createMetadata('9.0.0', opts.registries.default)).persist() mockExeMetadata(opts.registries.default, '9.0.0') const output = await selfUpdate.handler({ @@ -286,10 +286,9 @@ test('should update pnpm entry in devEngines.packageManager array', async () => }, }) const pkgJsonPath = path.join(opts.dir, 'package.json') - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, createMetadata('9.0.0', opts.registries.default)) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, createMetadata('9.0.0', opts.registries.default)).persist() mockExeMetadata(opts.registries.default, '9.0.0') const output = await selfUpdate.handler({ @@ -315,10 +314,9 @@ test('should not modify devEngines.packageManager range when resolved version st }, }) const pkgJsonPath = path.join(opts.dir, 'package.json') - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, createMetadata('9.0.0', opts.registries.default)) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, createMetadata('9.0.0', opts.registries.default)).persist() mockExeMetadata(opts.registries.default, '9.0.0') const output = await selfUpdate.handler({ @@ -346,10 +344,9 @@ test('should fall back to ^version when complex range cannot accommodate the new }, }) const pkgJsonPath = path.join(opts.dir, 'package.json') - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, createMetadata('9.0.0', opts.registries.default)) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, createMetadata('9.0.0', opts.registries.default)).persist() mockExeMetadata(opts.registries.default, '9.0.0') await selfUpdate.handler({ @@ -372,10 +369,9 @@ test('should update devEngines.packageManager range when resolved version no lon }, }) const pkgJsonPath = path.join(opts.dir, 'package.json') - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, createMetadata('9.0.0', opts.registries.default)) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, createMetadata('9.0.0', opts.registries.default)).persist() mockExeMetadata(opts.registries.default, '9.0.0') const output = await selfUpdate.handler({ @@ -408,10 +404,9 @@ console.log('9.2.0')`, 'utf8') // Create a hash symlink pointing to the install dir (like handleGlobalAdd does) fs.symlinkSync(installDir, path.join(globalDir, 'fake-hash')) - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, createMetadata('9.2.0', opts.registries.default)) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, createMetadata('9.2.0', opts.registries.default)).persist() mockExeMetadata(opts.registries.default, '9.2.0') const output = await selfUpdate.handler(opts, []) @@ -480,8 +475,8 @@ test('self-update updates the packageManager field in package.json', async () => version: '9.0.0', }, } - nock(opts.registries.default) - .get('/pnpm') + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) .reply(200, createMetadata('9.1.0', opts.registries.default)) const output = await selfUpdate.handler(opts, []) @@ -494,13 +489,13 @@ test('self-update updates the packageManager field in package.json', async () => test('installPnpm without env lockfile uses resolution path', async () => { const opts = prepare() - nock(opts.registries.default) - .persist() - .get('/pnpm') - .reply(200, createMetadata('9.1.0', opts.registries.default)) - nock(opts.registries.default) - .get('/pnpm/-/pnpm-9.1.0.tgz') - .replyWithFile(200, pnpmTarballPath) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm', method: 'GET' }) + .reply(200, createMetadata('9.1.0', opts.registries.default)).persist() + const tgzData = fs.readFileSync(pnpmTarballPath) + getMockAgent().get(opts.registries.default.replace(/\/$/, '')) + .intercept({ path: '/pnpm/-/pnpm-9.1.0.tgz', method: 'GET' }) + .reply(200, tgzData) const result = await installPnpm('9.1.0', opts) diff --git a/engine/pm/commands/tsconfig.json b/engine/pm/commands/tsconfig.json index e32594c69c..b65f46295d 100644 --- a/engine/pm/commands/tsconfig.json +++ b/engine/pm/commands/tsconfig.json @@ -70,6 +70,9 @@ { "path": "../../../store/controller" }, + { + "path": "../../../testing/mock-agent" + }, { "path": "../../../workspace/project-manifest-reader" } diff --git a/fetching/pick-fetcher/package.json b/fetching/pick-fetcher/package.json index 2fe4cd866f..07283e13f5 100644 --- a/fetching/pick-fetcher/package.json +++ b/fetching/pick-fetcher/package.json @@ -45,8 +45,8 @@ "@pnpm/store.create-cafs-store": "workspace:*", "@pnpm/store.index": "workspace:*", "@pnpm/test-fixtures": "workspace:*", - "nock": "catalog:", - "tempy": "catalog:" + "tempy": "catalog:", + "undici": "catalog:" }, "engines": { "node": ">=22.13" diff --git a/fetching/pick-fetcher/test/customFetch.ts b/fetching/pick-fetcher/test/customFetch.ts index 03c0d82049..678716661c 100644 --- a/fetching/pick-fetcher/test/customFetch.ts +++ b/fetching/pick-fetcher/test/customFetch.ts @@ -1,3 +1,4 @@ +import fs from 'node:fs' import path from 'node:path' import { jest } from '@jest/globals' @@ -5,19 +6,28 @@ import type { Fetchers, FetchFunction, FetchOptions } from '@pnpm/fetching.fetch import { pickFetcher } from '@pnpm/fetching.pick-fetcher' import { createTarballFetcher } from '@pnpm/fetching.tarball-fetcher' import type { CustomFetcher } from '@pnpm/hooks.types' -import { createFetchFromRegistry } from '@pnpm/network.fetch' +import { clearDispatcherCache, createFetchFromRegistry } from '@pnpm/network.fetch' import type { AtomicResolution } from '@pnpm/resolving.resolver-base' import type { Cafs } from '@pnpm/store.cafs-types' import { createCafsStore } from '@pnpm/store.create-cafs-store' import { StoreIndex } from '@pnpm/store.index' import { fixtures } from '@pnpm/test-fixtures' -import nock from 'nock' import { temporaryDirectory } from 'tempy' +import { type Dispatcher, getGlobalDispatcher, MockAgent, setGlobalDispatcher } from 'undici' const f = fixtures(import.meta.dirname) const storeIndex = new StoreIndex(temporaryDirectory()) + + +let originalDispatcher: Dispatcher + +beforeAll(() => { + originalDispatcher = getGlobalDispatcher() +}) + afterAll(() => { storeIndex.close() + setGlobalDispatcher(originalDispatcher) }) // Test helpers to reduce type casting @@ -271,58 +281,67 @@ describe('custom fetcher implementation examples', () => { const tarballIntegrity = 'sha1-HssnaJydJVE+rbyZFKc/VAi+enY=' test('custom fetcher can delegate to remoteTarball fetcher', async () => { - const scope = nock(registry) - .get('/custom-pkg.tgz') - .replyWithFile(200, tarballPath, { - 'Content-Length': '1279', - }) + clearDispatcherCache() + const mockAgent = new MockAgent() + mockAgent.disableNetConnect() + setGlobalDispatcher(mockAgent) - const storeDir = temporaryDirectory() - const cafs = createCafsStore(storeDir) - const filesIndexFile = path.join(storeDir, 'index.json') - - // Create standard fetchers to pass to custom fetcher - const fetchFromRegistry = createFetchFromRegistry({}) - const tarballFetchers = createTarballFetcher( - fetchFromRegistry, - () => undefined, - { rawConfig: {}, storeIndex } - ) - - // Custom fetcher that maps custom URLs to tarballs - const customFetcher = createMockCustomFetcher( - (_pkgId, resolution) => resolution.type === 'custom:url' && Boolean((resolution as any).customUrl), // eslint-disable-line @typescript-eslint/no-explicit-any - async (cafs, resolution, opts, fetchers) => { - // Map custom resolution to tarball resolution - const tarballResolution = { - tarball: (resolution as any).customUrl, // eslint-disable-line @typescript-eslint/no-explicit-any - integrity: tarballIntegrity, - } - - // Delegate to standard tarball fetcher (passed via fetchers parameter) - return fetchers.remoteTarball(cafs, tarballResolution, opts) - } - ) - - const customResolution = createMockResolution({ - type: 'custom:url', - customUrl: `${registry}custom-pkg.tgz`, + const tarballContent = fs.readFileSync(tarballPath) + const mockPool = mockAgent.get('http://localhost:4873') + mockPool.intercept({ path: '/custom-pkg.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'content-length': String(tarballContent.length) }, }) - const fetcher = await pickFetcher( - tarballFetchers as Fetchers, - customResolution, - { customFetchers: [customFetcher], packageId: 'custom-pkg@1.0.0' } - ) + try { + const storeDir = temporaryDirectory() + const cafs = createCafsStore(storeDir) + const filesIndexFile = path.join(storeDir, 'index.json') - const result = await fetcher( - cafs, - customResolution, - createMockFetchOptions({ filesIndexFile, lockfileDir: process.cwd() }) - ) + // Create standard fetchers to pass to custom fetcher + const fetchFromRegistry = createFetchFromRegistry({}) + const tarballFetchers = createTarballFetcher( + fetchFromRegistry, + () => undefined, + { rawConfig: {}, storeIndex } + ) - expect(result.filesMap.get('package.json')).toBeTruthy() - expect(scope.isDone()).toBeTruthy() + // Custom fetcher that maps custom URLs to tarballs + const customFetcher = createMockCustomFetcher( + (_pkgId, resolution) => resolution.type === 'custom:url' && Boolean((resolution as any).customUrl), // eslint-disable-line @typescript-eslint/no-explicit-any + async (cafs, resolution, opts, fetchers) => { + // Map custom resolution to tarball resolution + const tarballResolution = { + tarball: (resolution as any).customUrl, // eslint-disable-line @typescript-eslint/no-explicit-any + integrity: tarballIntegrity, + } + + // Delegate to standard tarball fetcher (passed via fetchers parameter) + return fetchers.remoteTarball(cafs, tarballResolution, opts) + } + ) + + const customResolution = createMockResolution({ + type: 'custom:url', + customUrl: `${registry}custom-pkg.tgz`, + }) + + const fetcher = await pickFetcher( + tarballFetchers as Fetchers, + customResolution, + { customFetchers: [customFetcher], packageId: 'custom-pkg@1.0.0' } + ) + + const result = await fetcher( + cafs, + customResolution, + createMockFetchOptions({ filesIndexFile, lockfileDir: process.cwd() }) + ) + + expect(result.filesMap.get('package.json')).toBeTruthy() + } finally { + await mockAgent.close() + setGlobalDispatcher(originalDispatcher) + } }) test('custom fetcher can delegate to localTarball fetcher', async () => { @@ -371,58 +390,67 @@ describe('custom fetcher implementation examples', () => { }) test('custom fetcher can transform resolution before delegating to tarball fetcher', async () => { - const scope = nock(registry) - .get('/transformed-pkg.tgz') - .replyWithFile(200, tarballPath, { - 'Content-Length': '1279', - }) + clearDispatcherCache() + const mockAgent = new MockAgent() + mockAgent.disableNetConnect() + setGlobalDispatcher(mockAgent) - const storeDir = temporaryDirectory() - const cafs = createCafsStore(storeDir) - const filesIndexFile = path.join(storeDir, 'index.json') - - const fetchFromRegistry = createFetchFromRegistry({}) - const tarballFetchers = createTarballFetcher( - fetchFromRegistry, - () => undefined, - { rawConfig: {}, storeIndex } - ) - - // Custom fetcher that transforms custom resolution to tarball URL - const customFetcher = createMockCustomFetcher( - (_pkgId, resolution) => resolution.type === 'custom:registry', - async (cafs, resolution, opts, fetchers) => { - // Transform custom registry format to standard tarball URL - const tarballUrl = `${registry}${(resolution as any).packageName}.tgz` // eslint-disable-line @typescript-eslint/no-explicit-any - - const tarballResolution = { - tarball: tarballUrl, - integrity: tarballIntegrity, - } - - return fetchers.remoteTarball(cafs, tarballResolution, opts) - } - ) - - const customResolution = createMockResolution({ - type: 'custom:registry', - packageName: 'transformed-pkg', + const tarballContent = fs.readFileSync(tarballPath) + const mockPool = mockAgent.get('http://localhost:4873') + mockPool.intercept({ path: '/transformed-pkg.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'content-length': String(tarballContent.length) }, }) - const fetcher = await pickFetcher( - tarballFetchers as Fetchers, - customResolution, - { customFetchers: [customFetcher], packageId: 'transformed-pkg@1.0.0' } - ) + try { + const storeDir = temporaryDirectory() + const cafs = createCafsStore(storeDir) + const filesIndexFile = path.join(storeDir, 'index.json') - const result = await fetcher( - cafs, - customResolution, - createMockFetchOptions({ filesIndexFile, lockfileDir: process.cwd() }) - ) + const fetchFromRegistry = createFetchFromRegistry({}) + const tarballFetchers = createTarballFetcher( + fetchFromRegistry, + () => undefined, + { rawConfig: {}, storeIndex } + ) - expect(result.filesMap.get('package.json')).toBeTruthy() - expect(scope.isDone()).toBeTruthy() + // Custom fetcher that transforms custom resolution to tarball URL + const customFetcher = createMockCustomFetcher( + (_pkgId, resolution) => resolution.type === 'custom:registry', + async (cafs, resolution, opts, fetchers) => { + // Transform custom registry format to standard tarball URL + const tarballUrl = `${registry}${(resolution as any).packageName}.tgz` // eslint-disable-line @typescript-eslint/no-explicit-any + + const tarballResolution = { + tarball: tarballUrl, + integrity: tarballIntegrity, + } + + return fetchers.remoteTarball(cafs, tarballResolution, opts) + } + ) + + const customResolution = createMockResolution({ + type: 'custom:registry', + packageName: 'transformed-pkg', + }) + + const fetcher = await pickFetcher( + tarballFetchers as Fetchers, + customResolution, + { customFetchers: [customFetcher], packageId: 'transformed-pkg@1.0.0' } + ) + + const result = await fetcher( + cafs, + customResolution, + createMockFetchOptions({ filesIndexFile, lockfileDir: process.cwd() }) + ) + + expect(result.filesMap.get('package.json')).toBeTruthy() + } finally { + await mockAgent.close() + setGlobalDispatcher(originalDispatcher) + } }) test('custom fetcher can use gitHostedTarball fetcher for custom git URLs', async () => { diff --git a/fetching/tarball-fetcher/package.json b/fetching/tarball-fetcher/package.json index be4c6e5864..1169b39bcf 100644 --- a/fetching/tarball-fetcher/package.json +++ b/fetching/tarball-fetcher/package.json @@ -65,9 +65,9 @@ "@types/ramda": "catalog:", "@types/retry": "catalog:", "@types/ssri": "catalog:", - "nock": "catalog:", "ssri": "catalog:", - "tempy": "catalog:" + "tempy": "catalog:", + "undici": "catalog:" }, "engines": { "node": ">=22.13" diff --git a/fetching/tarball-fetcher/src/remoteTarballFetcher.ts b/fetching/tarball-fetcher/src/remoteTarballFetcher.ts index 0a272ee0bf..2ae0254320 100644 --- a/fetching/tarball-fetcher/src/remoteTarballFetcher.ts +++ b/fetching/tarball-fetcher/src/remoteTarballFetcher.ts @@ -1,4 +1,3 @@ -import assert from 'node:assert' import type { IncomingMessage } from 'node:http' import util from 'node:util' @@ -88,9 +87,25 @@ export function createDownloader ( reject(op.mainError()) return } + // Extract error properties into a plain object because Error properties + // are non-enumerable and don't serialize well through the logging system + const errorInfo = { + name: error.name, + message: error.message, + code: error.code, + errno: error.errno, + // For HTTP errors from our ResponseError class + status: error.status, + statusCode: error.statusCode, + // undici wraps the actual network error in a cause property + cause: error.cause ? { + code: error.cause.code, + errno: error.cause.errno, + } : undefined, + } requestRetryLogger.debug({ attempt, - error, + error: errorInfo, maxRetries: retryOpts.retries, method: 'GET', timeout, @@ -131,11 +146,10 @@ export function createDownloader ( : undefined const startTime = Date.now() let downloaded = 0 - const chunks: Buffer[] = [] - // This will handle the 'data', 'error', and 'end' events. + const chunks: Uint8Array[] = [] for await (const chunk of res.body!) { - chunks.push(chunk as Buffer) - downloaded += chunk.length + chunks.push(chunk as Uint8Array) + downloaded += (chunk as Uint8Array).byteLength onProgress?.(downloaded) } if (size !== null && size !== downloaded) { @@ -155,16 +169,16 @@ export function createDownloader ( data = Buffer.from(new SharedArrayBuffer(downloaded)) let offset: number = 0 for (const chunk of chunks) { - chunk.copy(data, offset) - offset += chunk.length + data.set(chunk, offset) + offset += chunk.byteLength } } catch (err: unknown) { - assert(util.types.isNativeError(err)) - Object.assign(err, { + const error = util.types.isNativeError(err) ? err : new Error(String(err), { cause: err }) + Object.assign(error, { attempts: currentAttempt, resource: url, }) - throw err + throw error } return addFilesFromTarball({ buffer: data, diff --git a/fetching/tarball-fetcher/test/fetch.ts b/fetching/tarball-fetcher/test/fetch.ts index 252177d95f..91d73696f4 100644 --- a/fetching/tarball-fetcher/test/fetch.ts +++ b/fetching/tarball-fetcher/test/fetch.ts @@ -9,9 +9,9 @@ import { createCafsStore } from '@pnpm/store.create-cafs-store' import { StoreIndex } from '@pnpm/store.index' import { fixtures } from '@pnpm/test-fixtures' import { lexCompare } from '@pnpm/util.lex-comparator' -import nock from 'nock' import ssri from 'ssri' import { temporaryDirectory } from 'tempy' +import { type Dispatcher, getGlobalDispatcher, MockAgent, setGlobalDispatcher } from 'undici' const originalModule = await import('@pnpm/logger') @@ -29,8 +29,26 @@ const { TarballIntegrityError, } = await import('@pnpm/fetching.tarball-fetcher') +let mockAgent: MockAgent +let originalDispatcher: Dispatcher + +beforeAll(() => { + originalDispatcher = getGlobalDispatcher() +}) + beforeEach(() => { jest.mocked(globalWarn).mockClear() + mockAgent = new MockAgent() + mockAgent.disableNetConnect() + setGlobalDispatcher(mockAgent) +}) + +afterEach(async () => { + await mockAgent.close() +}) + +afterAll(() => { + setGlobalDispatcher(originalDispatcher) }) const storeDir = temporaryDirectory() @@ -46,12 +64,12 @@ const f = fixtures(import.meta.dirname) const tarballPath = f.find('babel-helper-hoist-variables-6.24.1.tgz') const tarballSize = 1279 const tarballIntegrity = 'sha1-HssnaJydJVE+rbyZFKc/VAi+enY=' -const registry = 'http://example.com/' +const registry = 'http://example.com' const fetchFromRegistry = createFetchFromRegistry({}) const getAuthHeader = () => undefined const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { - rawConfig: {}, storeIndex, + rawConfig: {}, retry: { maxTimeout: 100, minTimeout: 0, @@ -61,12 +79,17 @@ const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { const pkg = {} test('fail when tarball size does not match content-length', async () => { - const scope = nock(registry) - .get('/foo.tgz') - .times(2) - .replyWithFile(200, tarballPath, { - 'Content-Length': (1024 * 1024).toString(), - }) + const tarballContent = fs.readFileSync(tarballPath) + const mockPool = mockAgent.get(registry) + + // First request + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'Content-Length': (1024 * 1024).toString() }, + }) + // Retry request + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'Content-Length': (1024 * 1024).toString() }, + }) process.chdir(temporaryDirectory()) @@ -76,7 +99,7 @@ test('fail when tarball size does not match content-length', async () => { // Content-Length mismatch, // which indicates bad network connection. (see https://github.com/pnpm/pnpm/issues/1235) integrity: 'sha1-HssnaJydJVE+rbzZFKc/VAi+enY=', - tarball: `${registry}foo.tgz`, + tarball: `${registry}/foo.tgz`, } await expect( @@ -92,25 +115,24 @@ test('fail when tarball size does not match content-length', async () => { tarballUrl: resolution.tarball, }) ) - expect(scope.isDone()).toBeTruthy() }) test('retry when tarball size does not match content-length', async () => { - nock(registry) - .get('/foo.tgz') - .replyWithFile(200, tarballPath, { - 'Content-Length': (1024 * 1024).toString(), - }) + const tarballContent = fs.readFileSync(tarballPath) + const mockPool = mockAgent.get(registry) - nock(registry) - .get('/foo.tgz') - .replyWithFile(200, tarballPath, { - 'Content-Length': tarballSize.toString(), - }) + // First request with wrong content-length + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'Content-Length': (1024 * 1024).toString() }, + }) + // Retry with correct content-length + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'Content-Length': tarballSize.toString() }, + }) process.chdir(temporaryDirectory()) - const resolution = { tarball: 'http://example.com/foo.tgz' } + const resolution = { tarball: `${registry}/foo.tgz` } const result = await fetch.remoteTarball(cafs, resolution, { filesIndexFile, @@ -119,22 +141,26 @@ test('retry when tarball size does not match content-length', async () => { }) expect(result.filesMap).toBeTruthy() - expect(nock.isDone()).toBeTruthy() }) test('fail when integrity check fails two times in a row', async () => { - const scope = nock(registry) - .get('/foo.tgz') - .times(2) - .replyWithFile(200, f.find('babel-helper-hoist-variables-7.0.0-alpha.10.tgz'), { - 'Content-Length': '1194', - }) + const wrongTarball = f.find('babel-helper-hoist-variables-7.0.0-alpha.10.tgz') + const wrongTarballContent = fs.readFileSync(wrongTarball) + const mockPool = mockAgent.get(registry) + + // Both requests return wrong tarball + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, wrongTarballContent, { + headers: { 'Content-Length': '1194' }, + }) + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, wrongTarballContent, { + headers: { 'Content-Length': '1194' }, + }) process.chdir(temporaryDirectory()) const resolution = { integrity: tarballIntegrity, - tarball: 'http://example.com/foo.tgz', + tarball: `${registry}/foo.tgz`, } await expect( @@ -152,25 +178,28 @@ test('fail when integrity check fails two times in a row', async () => { url: resolution.tarball, }) ) - expect(scope.isDone()).toBeTruthy() }) test('retry when integrity check fails', async () => { - const scope = nock(registry) - .get('/foo.tgz') - .replyWithFile(200, f.find('babel-helper-hoist-variables-7.0.0-alpha.10.tgz'), { - 'Content-Length': '1194', - }) - .get('/foo.tgz') - .replyWithFile(200, tarballPath, { - 'Content-Length': tarballSize.toString(), - }) + const wrongTarball = f.find('babel-helper-hoist-variables-7.0.0-alpha.10.tgz') + const wrongTarballContent = fs.readFileSync(wrongTarball) + const tarballContent = fs.readFileSync(tarballPath) + const mockPool = mockAgent.get(registry) + + // First request returns wrong tarball + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, wrongTarballContent, { + headers: { 'Content-Length': '1194' }, + }) + // Retry returns correct tarball + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'Content-Length': tarballSize.toString() }, + }) process.chdir(temporaryDirectory()) const resolution = { integrity: tarballIntegrity, - tarball: 'http://example.com/foo.tgz', + tarball: `${registry}/foo.tgz`, } const params: Array<[number | null, number]> = [] @@ -185,8 +214,6 @@ test('retry when integrity check fails', async () => { expect(params[0]).toStrictEqual([1194, 1]) expect(params[1]).toStrictEqual([tarballSize, 2]) - - expect(scope.isDone()).toBeTruthy() }) test('fail when integrity check of local file fails', async () => { @@ -245,9 +272,9 @@ test("don't fail when fetching a local tarball in offline mode", async () => { } const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { + storeIndex, offline: true, rawConfig: {}, - storeIndex, retry: { maxTimeout: 100, minTimeout: 0, @@ -269,13 +296,13 @@ test('fail when trying to fetch a non-local tarball in offline mode', async () = const tarballAbsoluteLocation = f.find('babel-helper-hoist-variables-7.0.0-alpha.10.tgz') const resolution = { integrity: await getFileIntegrity(tarballAbsoluteLocation), - tarball: `${registry}foo.tgz`, + tarball: `${registry}/foo.tgz`, } const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { + storeIndex, offline: true, rawConfig: {}, - storeIndex, retry: { maxTimeout: 100, minTimeout: 0, @@ -296,19 +323,21 @@ The missing package may be downloaded from ${resolution.tarball}.`) }) test('retry on server error', async () => { - const scope = nock(registry) - .get('/foo.tgz') - .reply(500) - .get('/foo.tgz') - .replyWithFile(200, tarballPath, { - 'Content-Length': tarballSize.toString(), - }) + const tarballContent = fs.readFileSync(tarballPath) + const mockPool = mockAgent.get(registry) + + // First request returns 500 + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(500, 'Internal Server Error') + // Retry returns success + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'Content-Length': tarballSize.toString() }, + }) process.chdir(temporaryDirectory()) const resolution = { integrity: tarballIntegrity, - tarball: 'http://example.com/foo.tgz', + tarball: `${registry}/foo.tgz`, } const index = await fetch.remoteTarball(cafs, resolution, { @@ -318,20 +347,17 @@ test('retry on server error', async () => { }) expect(index).toBeTruthy() - - expect(scope.isDone()).toBeTruthy() }) test('throw error when accessing private package w/o authorization', async () => { - const scope = nock(registry) - .get('/foo.tgz') - .reply(403) + const mockPool = mockAgent.get(registry) + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(403, 'Forbidden') process.chdir(temporaryDirectory()) const resolution = { integrity: tarballIntegrity, - tarball: 'http://example.com/foo.tgz', + tarball: `${registry}/foo.tgz`, } await expect( @@ -347,24 +373,21 @@ test('throw error when accessing private package w/o authorization', async () => }, { status: 403, - // statusText: 'Forbidden', - statusText: '', + statusText: 'Forbidden', } ) ) - expect(scope.isDone()).toBeTruthy() }) test('do not retry when package does not exist', async () => { - const scope = nock(registry) - .get('/foo.tgz') - .reply(404) + const mockPool = mockAgent.get(registry) + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(404, 'Not Found') process.chdir(temporaryDirectory()) const resolution = { integrity: tarballIntegrity, - tarball: 'http://example.com/foo.tgz', + tarball: `${registry}/foo.tgz`, } await expect( @@ -380,33 +403,32 @@ test('do not retry when package does not exist', async () => { }, { status: 404, - statusText: '', + statusText: 'Not Found', } ) ) - expect(scope.isDone()).toBeTruthy() }) test('accessing private packages', async () => { - const scope = nock( - registry, - { - reqheaders: { - authorization: 'Bearer ofjergrg349gj3f2', - }, - } - ) - .get('/foo.tgz') - .replyWithFile(200, tarballPath, { - 'Content-Length': tarballSize.toString(), - }) + const tarballContent = fs.readFileSync(tarballPath) + const mockPool = mockAgent.get(registry) + + mockPool.intercept({ + path: '/foo.tgz', + method: 'GET', + headers: { + authorization: 'Bearer ofjergrg349gj3f2', + }, + }).reply(200, tarballContent, { + headers: { 'Content-Length': tarballSize.toString() }, + }) process.chdir(temporaryDirectory()) const getAuthHeader = () => 'Bearer ofjergrg349gj3f2' const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { - rawConfig: {}, storeIndex, + rawConfig: {}, retry: { maxTimeout: 100, minTimeout: 0, @@ -416,8 +438,8 @@ test('accessing private packages', async () => { const resolution = { integrity: tarballIntegrity, - registry, - tarball: 'http://example.com/foo.tgz', + registry: `${registry}/`, + tarball: `${registry}/foo.tgz`, } const index = await fetch.remoteTarball(cafs, resolution, { @@ -427,8 +449,6 @@ test('accessing private packages', async () => { }) expect(index).toBeTruthy() - - expect(scope.isDone()).toBeTruthy() }) async function getFileIntegrity (filename: string) { @@ -437,6 +457,9 @@ async function getFileIntegrity (filename: string) { // Covers the regression reported in https://github.com/pnpm/pnpm/issues/4064 test('fetch a big repository', async () => { + // Enable network for this test + mockAgent.enableNetConnect(/codeload\.github\.com/) + process.chdir(temporaryDirectory()) const resolution = { tarball: 'https://codeload.github.com/sveltejs/action-deploy-docs/tar.gz/a65fbf5a90f53c9d72fed4daaca59da50f074355' } @@ -451,6 +474,9 @@ test('fetch a big repository', async () => { }) test('fail when preparing a git-hosted package', async () => { + // Enable network for this test + mockAgent.enableNetConnect(/codeload\.github\.com/) + process.chdir(temporaryDirectory()) const resolution = { tarball: 'https://codeload.github.com/pnpm-e2e/prepare-script-fails/tar.gz/ba58874aae1210a777eb309dd01a9fdacc7e54e7' } @@ -466,6 +492,9 @@ test('fail when preparing a git-hosted package', async () => { }) test('take only the files included in the package, when fetching a git-hosted package', async () => { + // Enable network for this test + mockAgent.enableNetConnect(/codeload\.github\.com/) + process.chdir(temporaryDirectory()) const resolution = { tarball: 'https://codeload.github.com/pnpm-e2e/pkg-with-ignored-files/tar.gz/958d6d487217512bb154d02836e9b5b922a600d8' } @@ -484,15 +513,16 @@ test('take only the files included in the package, when fetching a git-hosted pa }) test('fail when extracting a broken tarball', async () => { - const scope = nock(registry) - .get('/foo.tgz') - .times(2) - .reply(200, 'this is not a valid tarball') + const mockPool = mockAgent.get(registry) + + // Both requests return invalid tarball content + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, 'this is not a valid tarball') + mockPool.intercept({ path: '/foo.tgz', method: 'GET' }).reply(200, 'this is not a valid tarball') process.chdir(temporaryDirectory()) const resolution = { - tarball: `${registry}foo.tgz`, + tarball: `${registry}/foo.tgz`, } await expect( @@ -501,21 +531,23 @@ test('fail when extracting a broken tarball', async () => { lockfileDir: process.cwd(), pkg, }) - ).rejects.toThrow(`Failed to add tarball from "${registry}foo.tgz" to store: Invalid checksum for TAR header at offset 0. Expected 0, got NaN` + ).rejects.toThrow(`Failed to add tarball from "${registry}/foo.tgz" to store: Invalid checksum for TAR header at offset 0. Expected 0, got NaN` ) - expect(scope.isDone()).toBeTruthy() }) test('do not build the package when scripts are ignored', async () => { + // Enable network for this test + mockAgent.enableNetConnect(/codeload\.github\.com/) + process.chdir(temporaryDirectory()) const tarball = 'https://codeload.github.com/pnpm-e2e/prepare-script-works/tar.gz/55416a9c468806a935636c0ad0371a14a64df8c9' const resolution = { tarball } const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { + storeIndex, ignoreScripts: true, rawConfig: {}, - storeIndex, retry: { maxTimeout: 100, minTimeout: 0, @@ -551,6 +583,9 @@ test('when extracting files with the same name, pick the last ones', async () => }) test('use the subfolder when path is present', async () => { + // Enable network for this test + mockAgent.enableNetConnect(/codeload\.github\.com/) + process.chdir(temporaryDirectory()) const resolution = { @@ -559,9 +594,9 @@ test('use the subfolder when path is present', async () => { } const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { + storeIndex, ignoreScripts: true, rawConfig: {}, - storeIndex, retry: { maxTimeout: 100, minTimeout: 0, @@ -579,6 +614,9 @@ test('use the subfolder when path is present', async () => { }) test('prevent directory traversal attack when path is present', async () => { + // Enable network for this test + mockAgent.enableNetConnect(/codeload\.github\.com/) + process.chdir(temporaryDirectory()) const tarball = 'https://codeload.github.com/RexSkz/test-git-subfolder-fetch/tar.gz/2b42a57a945f19f8ffab8ecbd2021fdc2c58ee22' @@ -586,9 +624,9 @@ test('prevent directory traversal attack when path is present', async () => { const resolution = { tarball, path } const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { + storeIndex, ignoreScripts: true, rawConfig: {}, - storeIndex, retry: { maxTimeout: 100, minTimeout: 0, @@ -604,6 +642,9 @@ test('prevent directory traversal attack when path is present', async () => { }) test('fail when path is not exists', async () => { + // Enable network for this test + mockAgent.enableNetConnect(/codeload\.github\.com/) + process.chdir(temporaryDirectory()) const tarball = 'https://codeload.github.com/RexSkz/test-git-subfolder-fetch/tar.gz/2b42a57a945f19f8ffab8ecbd2021fdc2c58ee22' @@ -611,9 +652,9 @@ test('fail when path is not exists', async () => { const resolution = { tarball, path } const fetch = createTarballFetcher(fetchFromRegistry, getAuthHeader, { + storeIndex, ignoreScripts: true, rawConfig: {}, - storeIndex, retry: { maxTimeout: 100, minTimeout: 0, diff --git a/fetching/types/package.json b/fetching/types/package.json index cd1a5df374..11712b145d 100644 --- a/fetching/types/package.json +++ b/fetching/types/package.json @@ -31,8 +31,7 @@ "test": "pn compile" }, "dependencies": { - "@zkochan/retry": "catalog:", - "node-fetch": "catalog:" + "@zkochan/retry": "catalog:" }, "devDependencies": { "@pnpm/fetching.types": "workspace:*" diff --git a/fetching/types/src/index.ts b/fetching/types/src/index.ts index 526ef95f5f..c6693ab5ed 100644 --- a/fetching/types/src/index.ts +++ b/fetching/types/src/index.ts @@ -1,9 +1,8 @@ import type { RetryTimeoutOptions } from '@zkochan/retry' -import type { RequestInit as NodeRequestInit, Response } from 'node-fetch' -export type { Response, RetryTimeoutOptions } +export type { RetryTimeoutOptions } -export interface RequestInit extends NodeRequestInit { +export interface RequestInit extends globalThis.RequestInit { retry?: RetryTimeoutOptions timeout?: number } diff --git a/installing/client/src/index.ts b/installing/client/src/index.ts index 3191d1b374..d7ffd8e277 100644 --- a/installing/client/src/index.ts +++ b/installing/client/src/index.ts @@ -6,7 +6,7 @@ import { createTarballFetcher, type TarballFetchers } from '@pnpm/fetching.tarba import type { FetchFromRegistry, GetAuthHeader, RetryTimeoutOptions } from '@pnpm/fetching.types' import type { CustomFetcher, CustomResolver } from '@pnpm/hooks.types' import { createGetAuthHeaderByURI } from '@pnpm/network.auth-header' -import { type AgentOptions, createFetchFromRegistry } from '@pnpm/network.fetch' +import { createFetchFromRegistry, type DispatcherOptions } from '@pnpm/network.fetch' import { createResolver as _createResolver, type ResolveFunction, @@ -35,7 +35,7 @@ export type ClientOptions = { includeOnlyPackageFiles?: boolean preserveAbsolutePaths?: boolean fetchMinSpeedKiBps?: number -} & ResolverFactoryOptions & AgentOptions +} & ResolverFactoryOptions & DispatcherOptions export interface Client { fetchers: Fetchers diff --git a/installing/commands/package.json b/installing/commands/package.json index 5f9dcc94ec..5d57a371b2 100644 --- a/installing/commands/package.json +++ b/installing/commands/package.json @@ -106,6 +106,7 @@ "@pnpm/store.index": "workspace:*", "@pnpm/test-fixtures": "workspace:*", "@pnpm/test-ipc-server": "workspace:*", + "@pnpm/testing.mock-agent": "workspace:*", "@pnpm/worker": "workspace:*", "@pnpm/workspace.projects-filter": "workspace:*", "@types/normalize-path": "catalog:", @@ -117,7 +118,6 @@ "ci-info": "catalog:", "delay": "catalog:", "jest-diff": "catalog:", - "nock": "catalog:", "path-name": "catalog:", "proxyquire": "catalog:", "read-yaml-file": "catalog:", diff --git a/installing/commands/test/saveCatalog.ts b/installing/commands/test/saveCatalog.ts index e4cf642c90..0b404133a2 100644 --- a/installing/commands/test/saveCatalog.ts +++ b/installing/commands/test/saveCatalog.ts @@ -5,8 +5,8 @@ import { add } from '@pnpm/installing.commands' import type { LockfileFile } from '@pnpm/lockfile.types' import { prepare, preparePackages } from '@pnpm/prepare' import { addDistTag } from '@pnpm/registry-mock' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { loadJsonFileSync } from 'load-json-file' -import nock from 'nock' import { readYamlFileSync } from 'read-yaml-file' import { DEFAULT_OPTS } from './utils/index.js' @@ -20,9 +20,8 @@ const createOptions = (saveCatalogName = 'default'): add.AddCommandOptions => ({ storeDir: path.resolve('store'), }) -afterEach(() => { - nock.abortPendingRequests() - nock.cleanAll() +afterEach(async () => { + await teardownMockAgent() }) test('saveCatalogName creates new workspace manifest with the new catalogs', async () => { @@ -79,8 +78,10 @@ test('saveCatalogName works with different protocols', async () => { }) // Mock the HEAD request that isRepoPublic() in @pnpm/resolving.git-resolver makes. // Without this, transient network failures cause fallback to git+https:// resolution. - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/kevva/is-positive') + await setupMockAgent() + getMockAgent().enableNetConnect() + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-positive', method: 'HEAD' }) .reply(200) const options = createOptions() @@ -139,7 +140,6 @@ test('saveCatalogName works with different protocols', async () => { }, }, } as Partial)) - githubNock.done() }) test('saveCatalogName does not work with local dependencies', async () => { diff --git a/installing/commands/tsconfig.json b/installing/commands/tsconfig.json index 09cb23474d..74b76c598e 100644 --- a/installing/commands/tsconfig.json +++ b/installing/commands/tsconfig.json @@ -105,6 +105,9 @@ { "path": "../../store/index" }, + { + "path": "../../testing/mock-agent" + }, { "path": "../../worker" }, diff --git a/installing/deps-installer/package.json b/installing/deps-installer/package.json index 4fd976de0c..271e36f802 100644 --- a/installing/deps-installer/package.json +++ b/installing/deps-installer/package.json @@ -139,6 +139,7 @@ "@pnpm/store.path": "workspace:*", "@pnpm/test-fixtures": "workspace:*", "@pnpm/test-ipc-server": "workspace:*", + "@pnpm/testing.mock-agent": "workspace:*", "@pnpm/testing.temp-store": "workspace:*", "@types/fs-extra": "catalog:", "@types/is-windows": "catalog:", diff --git a/installing/deps-installer/test/install/blockExoticSubdeps.ts b/installing/deps-installer/test/install/blockExoticSubdeps.ts index 61c6fd564f..87e712ce2d 100644 --- a/installing/deps-installer/test/install/blockExoticSubdeps.ts +++ b/installing/deps-installer/test/install/blockExoticSubdeps.ts @@ -1,12 +1,16 @@ import { addDependenciesToPackage } from '@pnpm/installing.deps-installer' import { prepareEmpty } from '@pnpm/prepare' -import nock from 'nock' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { testDefaults } from '../utils/index.js' -afterEach(() => { - nock.abortPendingRequests() - nock.cleanAll() +beforeEach(async () => { + await setupMockAgent() + getMockAgent().enableNetConnect() +}) + +afterEach(async () => { + await teardownMockAgent() }) test('blockExoticSubdeps disallows git dependencies in subdependencies', async () => { @@ -23,8 +27,8 @@ test('blockExoticSubdeps allows git dependencies in direct dependencies', async // Mock the HEAD request that isRepoPublic() in @pnpm/resolving.git-resolver makes to check if the repo is public. // Without this, transient network failures cause the resolver to fall back to git+https:// instead of // resolving via the codeload tarball URL. - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/kevva/is-negative') + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-negative', method: 'HEAD' }) .reply(200) const project = prepareEmpty() @@ -41,8 +45,6 @@ test('blockExoticSubdeps allows git dependencies in direct dependencies', async expect(manifest.dependencies).toStrictEqual({ 'is-negative': 'github:kevva/is-negative#1.0.0', }) - - githubNock.done() }) test('blockExoticSubdeps allows registry dependencies in subdependencies', async () => { diff --git a/installing/deps-installer/test/install/denoRuntime.ts b/installing/deps-installer/test/install/denoRuntime.ts index 6cc703712b..d79782994f 100644 --- a/installing/deps-installer/test/install/denoRuntime.ts +++ b/installing/deps-installer/test/install/denoRuntime.ts @@ -2,15 +2,19 @@ import { LOCKFILE_VERSION, WANTED_LOCKFILE } from '@pnpm/constants' import { addDependenciesToPackage, install } from '@pnpm/installing.deps-installer' import { prepareEmpty } from '@pnpm/prepare' import { getIntegrity } from '@pnpm/registry-mock' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { rimrafSync } from '@zkochan/rimraf' -import nock from 'nock' import { writeYamlFileSync } from 'write-yaml-file' import { testDefaults } from '../utils/index.js' -afterEach(() => { - nock.abortPendingRequests() - nock.cleanAll() +beforeEach(async () => { + await setupMockAgent() + getMockAgent().enableNetConnect() +}) + +afterEach(async () => { + await teardownMockAgent() }) const RESOLUTIONS = [ @@ -95,8 +99,7 @@ const RESOLUTIONS = [ }, ] -// Derive SHA256 hex values from RESOLUTIONS integrity fields -const PLATFORM_HEX_DIGESTS: Record = Object.fromEntries( +const PLATFORM_HEX_DIGESTS = Object.fromEntries( RESOLUTIONS.map(({ resolution }) => { const platform = resolution.url.match(/deno-(.+)\.zip$/)![1] const hex = Buffer.from(resolution.integrity.replace('sha256-', ''), 'base64').toString('hex') @@ -107,19 +110,20 @@ const PLATFORM_HEX_DIGESTS: Record = Object.fromEntries( test('installing Deno runtime', async () => { // Mock GitHub API to avoid network flakiness const assetNames = Object.keys(PLATFORM_HEX_DIGESTS).map((platform) => `deno-${platform}`) - const githubApiNock = nock('https://api.github.com', { allowUnmocked: true }) - .get('/repos/denoland/deno/releases/tags/v2.4.2') + const githubApiPool = getMockAgent().get('https://api.github.com') + githubApiPool + .intercept({ path: '/repos/denoland/deno/releases/tags/v2.4.2', method: 'GET' }) .reply(200, { assets: assetNames.map((name) => ({ name: `${name}.zip.sha256sum`, browser_download_url: `https://github.com/denoland/deno/releases/download/v2.4.2/${name}.zip.sha256sum`, })), }) - const githubDownloadNock = nock('https://github.com', { allowUnmocked: true }) + const githubPool = getMockAgent().get('https://github.com') for (const [platform, hex] of Object.entries(PLATFORM_HEX_DIGESTS)) { const name = `deno-${platform}` - githubDownloadNock - .get(`/denoland/deno/releases/download/v2.4.2/${name}.zip.sha256sum`) + githubPool + .intercept({ path: `/denoland/deno/releases/download/v2.4.2/${name}.zip.sha256sum`, method: 'GET' }) .reply(200, `${hex} ${name}.zip`) } @@ -207,9 +211,6 @@ test('installing Deno runtime', async () => { '@pnpm.e2e/dep-of-pkg-with-1-dep@100.1.0': {}, }, }) - - githubApiNock.done() - githubDownloadNock.done() }) test('installing Deno runtime fails if offline mode is used and Deno not found locally', async () => { diff --git a/installing/deps-installer/test/install/errors.ts b/installing/deps-installer/test/install/errors.ts index 7115178571..c26db2b143 100644 --- a/installing/deps-installer/test/install/errors.ts +++ b/installing/deps-installer/test/install/errors.ts @@ -1,11 +1,13 @@ +import fs from 'node:fs' + import type { PnpmError } from '@pnpm/error' import { addDependenciesToPackage, mutateModulesInSingleProject } from '@pnpm/installing.deps-installer' import { prepareEmpty } from '@pnpm/prepare' import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock' import { fixtures } from '@pnpm/test-fixtures' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import type { ProjectRootDir } from '@pnpm/types' import { loadJsonFileSync } from 'load-json-file' -import nock from 'nock' import { testDefaults } from '../utils/index.js' @@ -44,27 +46,26 @@ test('fail if none of the available resolvers support a version spec', async () test('fail if a package cannot be fetched', async () => { prepareEmpty() + await setupMockAgent() + const mockPool = getMockAgent().get(`http://localhost:${REGISTRY_MOCK_PORT}`) /* eslint-disable @typescript-eslint/no-explicit-any */ - nock(`http://localhost:${REGISTRY_MOCK_PORT}/`) - .get('/@pnpm.e2e%2Fpkg-with-1-dep') // cspell:disable-line + mockPool.intercept({ path: '/@pnpm.e2e%2Fpkg-with-1-dep', method: 'GET' }) // cspell:disable-line .reply(200, loadJsonFileSync(f.find('pkg-with-1-dep.json'))) - nock(`http://localhost:${REGISTRY_MOCK_PORT}/`) - .get('/@pnpm.e2e%2Fdep-of-pkg-with-1-dep') // cspell:disable-line + mockPool.intercept({ path: '/@pnpm.e2e%2Fdep-of-pkg-with-1-dep', method: 'GET' }) // cspell:disable-line .reply(200, loadJsonFileSync(f.find('dep-of-pkg-with-1-dep.json'))) /* eslint-enable @typescript-eslint/no-explicit-any */ - nock(`http://localhost:${REGISTRY_MOCK_PORT}/`) - .get('/@pnpm.e2e/pkg-with-1-dep/-/@pnpm.e2e/pkg-with-1-dep-100.0.0.tgz') - .replyWithFile(200, f.find('pkg-with-1-dep-100.0.0.tgz')) - nock(`http://localhost:${REGISTRY_MOCK_PORT}/`) - .get('/@pnpm.e2e/dep-of-pkg-with-1-dep/-/@pnpm.e2e/dep-of-pkg-with-1-dep-100.1.0.tgz') - .reply(403) + const tarballContent = fs.readFileSync(f.find('pkg-with-1-dep-100.0.0.tgz')) + mockPool.intercept({ path: '/@pnpm.e2e/pkg-with-1-dep/-/@pnpm.e2e/pkg-with-1-dep-100.0.0.tgz', method: 'GET' }) + .reply(200, tarballContent, { headers: { 'content-length': String(tarballContent.length) } }) + mockPool.intercept({ path: '/@pnpm.e2e/dep-of-pkg-with-1-dep/-/@pnpm.e2e/dep-of-pkg-with-1-dep-100.1.0.tgz', method: 'GET' }) + .reply(403, 'Forbidden', { headers: { 'content-type': 'text/plain' } }) let err!: PnpmError try { await addDependenciesToPackage({}, ['@pnpm.e2e/pkg-with-1-dep@100.0.0'], testDefaults({}, {}, { retry: { retries: 0 } })) throw new Error('should have failed') } catch (_err: any) { // eslint-disable-line - nock.restore() + await teardownMockAgent() err = _err } expect(err.code).toBe('ERR_PNPM_FETCH_403') diff --git a/installing/deps-installer/test/install/fromRepo.ts b/installing/deps-installer/test/install/fromRepo.ts index 2a27a1f7d9..ac5e0beb4f 100644 --- a/installing/deps-installer/test/install/fromRepo.ts +++ b/installing/deps-installer/test/install/fromRepo.ts @@ -11,26 +11,30 @@ import { } from '@pnpm/installing.deps-installer' import { prepareEmpty } from '@pnpm/prepare' import { fixtures } from '@pnpm/test-fixtures' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { rimrafSync } from '@zkochan/rimraf' import { isCI } from 'ci-info' -import nock from 'nock' import { testDefaults } from '../utils/index.js' const f = fixtures(import.meta.dirname) const withGitProtocolDepFixture = f.find('with-git-protocol-dep') -afterEach(() => { - nock.abortPendingRequests() - nock.cleanAll() +beforeEach(async () => { + await setupMockAgent() + getMockAgent().enableNetConnect() +}) + +afterEach(async () => { + await teardownMockAgent() }) test('from a github repo', async () => { const project = prepareEmpty() // Mock the HEAD request that isRepoPublic() in @pnpm/resolving.git-resolver makes. // Without this, transient network failures cause fallback to git+https:// resolution. - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/kevva/is-negative') + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-negative', method: 'HEAD' }) .reply(200) const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['kevva/is-negative'], testDefaults()) @@ -40,13 +44,12 @@ test('from a github repo', async () => { expect(manifest.dependencies).toStrictEqual({ 'is-negative': 'github:kevva/is-negative', }) - githubNock.done() }) test('from a github repo through URL', async () => { const project = prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/kevva/is-negative') + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-negative', method: 'HEAD' }) .reply(200) const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['https://github.com/kevva/is-negative'], testDefaults()) @@ -54,13 +57,12 @@ test('from a github repo through URL', async () => { project.has('is-negative') expect(manifest.dependencies).toStrictEqual({ 'is-negative': 'github:kevva/is-negative' }) - githubNock.done() }) test('from a github repo with different name via named installation', async () => { const project = prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/zkochan/hi') + getMockAgent().get('https://github.com') + .intercept({ path: '/zkochan/hi', method: 'HEAD' }) .reply(200) const reporter = jest.fn() @@ -98,14 +100,13 @@ test('from a github repo with different name via named installation', async () = project.isExecutable('.bin/hi') project.isExecutable('.bin/szia') - githubNock.done() }) // This used to fail. Maybe won't be needed once api/install.ts gets refactored and covered with dedicated unit tests test('from a github repo with different name', async () => { const project = prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/zkochan/hi') + getMockAgent().get('https://github.com') + .intercept({ path: '/zkochan/hi', method: 'HEAD' }) .reply(200) const reporter = jest.fn() @@ -145,13 +146,12 @@ test('from a github repo with different name', async () => { project.isExecutable('.bin/hi') project.isExecutable('.bin/szia') - githubNock.done() }) test('a subdependency is from a github repo with different name', async () => { const project = prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/zkochan/hi') + getMockAgent().get('https://github.com') + .intercept({ path: '/zkochan/hi', method: 'HEAD' }) .reply(200) await addDependenciesToPackage({}, ['@pnpm.e2e/has-aliased-git-dependency'], testDefaults({ fastUnpack: false })) @@ -170,7 +170,6 @@ test('a subdependency is from a github repo with different name', async () => { project.isExecutable('@pnpm.e2e/has-aliased-git-dependency/node_modules/.bin/szia') expect(fs.existsSync(path.resolve(`node_modules/.pnpm/${depPathToFilename('@pnpm.e2e/has-say-hi-peer@1.0.0(hi@https://codeload.github.com/zkochan/hi/tar.gz/4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd)', 120)}/node_modules/@pnpm.e2e/has-say-hi-peer`))).toBeTruthy() - githubNock.done() }) test('from a git repo', async () => { @@ -207,9 +206,11 @@ test.skip('from a non-github git repo', async () => { test('from a github repo the has no package.json file', async () => { const project = prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/pnpm/for-testing.no-package-json') - .times(2) + getMockAgent().get('https://github.com') + .intercept({ path: '/pnpm/for-testing.no-package-json', method: 'HEAD' }) + .reply(200) + getMockAgent().get('https://github.com') + .intercept({ path: '/pnpm/for-testing.no-package-json', method: 'HEAD' }) .reply(200) const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['pnpm/for-testing.no-package-json'], testDefaults()) @@ -227,7 +228,6 @@ test('from a github repo the has no package.json file', async () => { // e.g. thrown: "Exceeded timeout of 240000 ms for a test. await addDependenciesToPackage({}, ['pnpm/for-testing.no-package-json'], testDefaults()) project.has('for-testing.no-package-json') - githubNock.done() }) test.skip('from a github repo that needs to be built. isolated node linker is used', async () => { @@ -276,9 +276,11 @@ test.skip('from a github repo that needs to be built. hoisted node linker is us test('re-adding a git repo with a different tag', async () => { const project = prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/kevva/is-negative') - .times(2) + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-negative', method: 'HEAD' }) + .reply(200) + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-negative', method: 'HEAD' }) .reply(200) let { updatedManifest: manifest } = await addDependenciesToPackage({}, ['kevva/is-negative#1.0.0'], testDefaults()) project.has('is-negative') @@ -317,7 +319,6 @@ test('re-adding a git repo with a different tag', async () => { }, } ) - githubNock.done() }) test('should not update when adding unrelated dependency', async () => { @@ -365,9 +366,11 @@ test('git-hosted repository is not added to the store if it fails to be built', test('from subdirectories of a git repo', async () => { const project = prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/RexSkz/test-git-subfolder-fetch') - .times(2) + getMockAgent().get('https://github.com') + .intercept({ path: '/RexSkz/test-git-subfolder-fetch', method: 'HEAD' }) + .reply(200) + getMockAgent().get('https://github.com') + .intercept({ path: '/RexSkz/test-git-subfolder-fetch', method: 'HEAD' }) .reply(200) const { updatedManifest: manifest } = await addDependenciesToPackage({}, [ @@ -382,13 +385,12 @@ test('from subdirectories of a git repo', async () => { '@my-namespace/simple-express-server': 'github:RexSkz/test-git-subfolder-fetch#path:/packages/simple-express-server', '@my-namespace/simple-react-app': 'github:RexSkz/test-git-subfolder-fetch#path:/packages/simple-react-app', }) - githubNock.done() }) test('no hash character for github subdirectory install', async () => { prepareEmpty() - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/pnpm/only-allow') + getMockAgent().get('https://github.com') + .intercept({ path: '/pnpm/only-allow', method: 'HEAD' }) .reply(200) await addDependenciesToPackage({}, [ @@ -397,5 +399,4 @@ test('no hash character for github subdirectory install', async () => { expect(fs.readdirSync('./node_modules/.pnpm')) .toContain('only-allow@https+++codeload.github.com+pnpm+only-allow+tar.gz+91ab41994c6a1b7319869fa8864163c9954f56ec+path++') - githubNock.done() }) diff --git a/installing/deps-installer/test/lockfile.ts b/installing/deps-installer/test/lockfile.ts index 132767d362..7394a4434b 100644 --- a/installing/deps-installer/test/lockfile.ts +++ b/installing/deps-installer/test/lockfile.ts @@ -19,20 +19,15 @@ import { readPackageJsonFromDir } from '@pnpm/pkg-manifest.reader' import { prepareEmpty, preparePackages, tempDir } from '@pnpm/prepare' import { addDistTag, getIntegrity, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock' import { fixtures } from '@pnpm/test-fixtures' +import { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import type { DepPath, ProjectManifest, ProjectRootDir } from '@pnpm/types' import { rimrafSync } from '@zkochan/rimraf' import { loadJsonFileSync } from 'load-json-file' -import nock from 'nock' import { readYamlFileSync } from 'read-yaml-file' import { writeYamlFileSync } from 'write-yaml-file' import { testDefaults } from './utils/index.js' -afterEach(() => { - nock.abortPendingRequests() - nock.cleanAll() -}) - const f = fixtures(import.meta.dirname) const LOCKFILE_WARN_LOG = { @@ -46,8 +41,10 @@ test('lockfile has correct format', async () => { // Mock the HEAD request that isRepoPublic() in @pnpm/resolving.git-resolver makes to check if the repo is public. // Without this, transient network failures cause the resolver to fall back to git+https:// instead of // resolving via the codeload tarball URL. - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/kevva/is-negative') + await setupMockAgent() + getMockAgent().enableNetConnect() + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-negative', method: 'HEAD' }) .reply(200) const project = prepareEmpty() @@ -81,7 +78,7 @@ test('lockfile has correct format', async () => { expect((lockfile.packages[id].resolution as TarballResolution).tarball).toBeFalsy() expect(lockfile.packages).toHaveProperty(['is-negative@https://codeload.github.com/kevva/is-negative/tar.gz/1d7e288222b53a0cab90a331f1865220ec29560c']) - githubNock.done() + await teardownMockAgent() }) test('lockfile has dev deps even when installing for prod only', async () => { @@ -825,8 +822,10 @@ test('lockfile file has correct format when lockfile directory does not equal th // Mock the HEAD request that isRepoPublic() in @pnpm/resolving.git-resolver makes to check if the repo is public. // Without this, transient network failures cause the resolver to fall back to git+https:// instead of // resolving via the codeload tarball URL. - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/kevva/is-negative') + await setupMockAgent() + getMockAgent().enableNetConnect() + getMockAgent().get('https://github.com') + .intercept({ path: '/kevva/is-negative', method: 'HEAD' }) .reply(200) prepareEmpty() @@ -902,7 +901,7 @@ test('lockfile file has correct format when lockfile directory does not equal th expect(lockfile.packages).toHaveProperty(['is-negative@https://codeload.github.com/kevva/is-negative/tar.gz/1d7e288222b53a0cab90a331f1865220ec29560c']) } - githubNock.done() + await teardownMockAgent() }) test(`doing named installation when shared ${WANTED_LOCKFILE} exists already`, async () => { @@ -1089,13 +1088,15 @@ const isPositiveMeta = loadJsonFileSync(path.join(REGISTRY_MIRROR_DIR, 'is- const tarballPath = f.find('is-positive-3.1.0.tgz') test('tarball domain differs from registry domain', async () => { - nock('https://registry.example.com', { allowUnmocked: true }) - .get('/is-positive') + await setupMockAgent() + getMockAgent().enableNetConnect(/localhost/) + getMockAgent().get('https://registry.example.com') + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) - - nock('https://registry.npmjs.org', { allowUnmocked: true }) - .get('/is-positive/-/is-positive-3.1.0.tgz') - .replyWithFile(200, tarballPath) + const tarballContent = fs.readFileSync(tarballPath) + getMockAgent().get('https://registry.npmjs.org') + .intercept({ path: '/is-positive/-/is-positive-3.1.0.tgz', method: 'GET' }) + .reply(200, tarballContent, { headers: { 'content-length': String(tarballContent.length) } }) const project = prepareEmpty() @@ -1144,15 +1145,18 @@ test('tarball domain differs from registry domain', async () => { 'is-positive@3.1.0': {}, }, }) + await teardownMockAgent() }) test('tarball installed through non-standard URL endpoint from the registry domain', async () => { - nock('https://registry.npmjs.org', { allowUnmocked: true }) - .head('/is-positive/download/is-positive-3.1.0.tgz') - .reply(200, '') - nock('https://registry.npmjs.org', { allowUnmocked: true }) - .get('/is-positive/download/is-positive-3.1.0.tgz') - .replyWithFile(200, tarballPath) + await setupMockAgent() + getMockAgent().enableNetConnect(/localhost/) + const mockPool = getMockAgent().get('https://registry.npmjs.org') + mockPool.intercept({ path: '/is-positive/download/is-positive-3.1.0.tgz', method: 'HEAD' }) + .reply(200, '').persist() + const tarballContent2 = fs.readFileSync(tarballPath) + mockPool.intercept({ path: '/is-positive/download/is-positive-3.1.0.tgz', method: 'GET' }) + .reply(200, tarballContent2, { headers: { 'content-length': String(tarballContent2.length) } }).persist() const project = prepareEmpty() @@ -1201,6 +1205,7 @@ test('tarball installed through non-standard URL endpoint from the registry doma 'is-positive@https://registry.npmjs.org/is-positive/download/is-positive-3.1.0.tgz': {}, }, }) + await teardownMockAgent() }) // TODO: fix merge conflicts with the new lockfile format (TODOv8) diff --git a/installing/deps-installer/tsconfig.json b/installing/deps-installer/tsconfig.json index 9144a93536..47533ea976 100644 --- a/installing/deps-installer/tsconfig.json +++ b/installing/deps-installer/tsconfig.json @@ -162,6 +162,9 @@ { "path": "../../store/path" }, + { + "path": "../../testing/mock-agent" + }, { "path": "../../testing/temp-store" }, diff --git a/installing/package-requester/package.json b/installing/package-requester/package.json index 8ddfc90dbf..1932781b0a 100644 --- a/installing/package-requester/package.json +++ b/installing/package-requester/package.json @@ -70,12 +70,12 @@ "@pnpm/store.cafs-types": "workspace:*", "@pnpm/store.create-cafs-store": "workspace:*", "@pnpm/test-fixtures": "workspace:*", + "@pnpm/testing.mock-agent": "workspace:*", "@types/normalize-path": "catalog:", "@types/ramda": "catalog:", "@types/semver": "catalog:", "@types/ssri": "catalog:", "delay": "catalog:", - "nock": "catalog:", "normalize-path": "catalog:", "tempy": "catalog:" }, diff --git a/installing/package-requester/test/index.ts b/installing/package-requester/test/index.ts index e8cb1644d4..cf491332f8 100644 --- a/installing/package-requester/test/index.ts +++ b/installing/package-requester/test/index.ts @@ -13,9 +13,9 @@ import type { PkgRequestFetchResult, PkgResolutionId, RequestPackageOptions } fr import { createCafsStore } from '@pnpm/store.create-cafs-store' import { StoreIndex } from '@pnpm/store.index' import { fixtures } from '@pnpm/test-fixtures' +import { setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' import { restartWorkerPool } from '@pnpm/worker' import delay from 'delay' -import nock from 'nock' import normalize from 'normalize-path' import { temporaryDirectory } from 'tempy' @@ -57,9 +57,8 @@ function createFetchersForStore (storeDir: string) { }).fetchers } -afterEach(() => { - nock.abortPendingRequests() - nock.cleanAll() +afterEach(async () => { + await teardownMockAgent() }) test('request package', async () => { @@ -583,14 +582,18 @@ test('fetchPackageToStore() concurrency check', async () => { }) test('fetchPackageToStore() does not cache errors', async () => { - nock(registry) - .get('/is-positive/-/is-positive-1.0.0.tgz') - .reply(404) - - nock(registry) - .get('/is-positive/-/is-positive-1.0.0.tgz') - .replyWithFile(200, IS_POSITIVE_TARBALL) + const agent = await setupMockAgent() + const mockPool = agent.get(registry) + // First request returns 404 + mockPool.intercept({ path: '/is-positive/-/is-positive-1.0.0.tgz', method: 'GET' }).reply(404, {}) + // Second request returns the tarball + const tarballContent = fs.readFileSync(IS_POSITIVE_TARBALL) + mockPool.intercept({ path: '/is-positive/-/is-positive-1.0.0.tgz', method: 'GET' }).reply(200, tarballContent, { + headers: { 'content-length': String(tarballContent.length) }, + }) + const noRetryStoreIndex = new StoreIndex('.store') + storeIndexes.push(noRetryStoreIndex) const noRetry = createClient({ authConfig, rawConfig: {}, @@ -647,7 +650,7 @@ test('fetchPackageToStore() does not cache errors', async () => { expect(Array.from(files.filesMap.keys()).sort((a, b) => a.localeCompare(b))).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort((a, b) => a.localeCompare(b))) expect(files.resolvedFrom).toBe('remote') - expect(nock.isDone()).toBeTruthy() + await teardownMockAgent() }) // This test was added to cover the issue described here: https://github.com/pnpm/supi/issues/65 @@ -709,9 +712,13 @@ test('always return a package manifest in the response', async () => { // Covers https://github.com/pnpm/pnpm/issues/1293 test('fetchPackageToStore() fetch raw manifest of cached package', async () => { - nock(registry) - .get('/is-positive/-/is-positive-1.0.0.tgz') - .replyWithFile(200, IS_POSITIVE_TARBALL) + const agent = await setupMockAgent() + const tarballContent = fs.readFileSync(IS_POSITIVE_TARBALL) + agent.get(registry) + .intercept({ path: '/is-positive/-/is-positive-1.0.0.tgz', method: 'GET' }) + .reply(200, tarballContent, { + headers: { 'content-length': String(tarballContent.length) }, + }) const storeDir = temporaryDirectory() const cafs = createCafsStore(storeDir) @@ -755,6 +762,7 @@ test('fetchPackageToStore() fetch raw manifest of cached package', async () => { ]) expect((await fetchResults[1].fetching()).bundledManifest).toBeTruthy() + await teardownMockAgent() }) test('refetch package to store if it has been modified', async () => { @@ -883,12 +891,6 @@ test('fetch a git package without a package.json', async () => { const repo = 'denolib/camelcase' const commit = 'aeb6b15f9c9957c8fa56f9731e914c4d8a6d2f2b' - // Mock the HEAD request that isRepoPublic() in @pnpm/resolving.git-resolver makes to check if the repo is public. - // Without this, transient network failures cause the resolver to fall back to git+https:// instead of - // resolving via the codeload tarball URL. - const githubNock = nock('https://github.com', { allowUnmocked: true }) - .head('/denolib/camelcase') - .reply(200) const storeDir = temporaryDirectory() const cafs = createCafsStore(storeDir) const requestPackage = createPackageRequester({ @@ -916,7 +918,6 @@ test('fetch a git package without a package.json', async () => { expect(pkgResponse.body.isInstallable).toBeFalsy() expect(pkgResponse.body.id).toBe(`https://codeload.github.com/${repo}/tar.gz/${commit}`) } - githubNock.done() }) test('throw exception if the package data in the store differs from the expected data', async () => { diff --git a/installing/package-requester/tsconfig.json b/installing/package-requester/tsconfig.json index ef5a5fbf8a..818837f84f 100644 --- a/installing/package-requester/tsconfig.json +++ b/installing/package-requester/tsconfig.json @@ -60,6 +60,9 @@ { "path": "../../store/index" }, + { + "path": "../../testing/mock-agent" + }, { "path": "../../worker" }, diff --git a/lockfile/to-pnp/src/index.ts b/lockfile/to-pnp/src/index.ts index 284f055559..5de38dc61f 100644 --- a/lockfile/to-pnp/src/index.ts +++ b/lockfile/to-pnp/src/index.ts @@ -26,7 +26,6 @@ export async function writePnpFile ( dependencyTreeRoots: [], ignorePattern: undefined, packageRegistry, - pnpZipBackend: 'libzip', shebang: undefined, }) await fs.writeFile(path.join(opts.lockfileDir, '.pnp.cjs'), loaderFile, 'utf8') diff --git a/network/fetch/package.json b/network/fetch/package.json index aa889de0bc..51936cad8a 100644 --- a/network/fetch/package.json +++ b/network/fetch/package.json @@ -1,7 +1,7 @@ { "name": "@pnpm/network.fetch", "version": "1000.2.6", - "description": "node-fetch with retries", + "description": "Native fetch with retries", "keywords": [ "pnpm", "pnpm11", @@ -33,12 +33,15 @@ ".test": "cross-env NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules --disable-warning=ExperimentalWarning --disable-warning=DEP0169\" jest" }, "dependencies": { + "@pnpm/config.nerf-dart": "catalog:", "@pnpm/core-loggers": "workspace:*", + "@pnpm/error": "workspace:*", "@pnpm/fetching.types": "workspace:*", - "@pnpm/network.agent": "catalog:", "@pnpm/types": "workspace:*", "@zkochan/retry": "catalog:", - "node-fetch": "catalog:" + "lru-cache": "catalog:", + "socks": "catalog:", + "undici": "catalog:" }, "peerDependencies": { "@pnpm/logger": "catalog:" @@ -46,8 +49,7 @@ "devDependencies": { "@pnpm/logger": "workspace:*", "@pnpm/network.fetch": "workspace:*", - "https-proxy-server-express": "catalog:", - "nock": "catalog:" + "https-proxy-server-express": "catalog:" }, "engines": { "node": ">=22.13" diff --git a/network/fetch/src/dispatcher.ts b/network/fetch/src/dispatcher.ts new file mode 100644 index 0000000000..8979a85029 --- /dev/null +++ b/network/fetch/src/dispatcher.ts @@ -0,0 +1,348 @@ +import net from 'node:net' +import tls from 'node:tls' +import { URL } from 'node:url' + +import { nerfDart } from '@pnpm/config.nerf-dart' +import { PnpmError } from '@pnpm/error' +import type { SslConfig } from '@pnpm/types' +import { LRUCache } from 'lru-cache' +import { SocksClient } from 'socks' +import { Agent, type Dispatcher, ProxyAgent } from 'undici' + +const DEFAULT_MAX_SOCKETS = 50 + +const DISPATCHER_CACHE = new LRUCache({ + max: 50, + dispose: (dispatcher) => { + if (typeof (dispatcher as Agent).close === 'function') { + void (dispatcher as Agent).close() + } + }, +}) + +export interface DispatcherOptions { + ca?: string | string[] | Buffer + cert?: string | string[] | Buffer + key?: string | Buffer + localAddress?: string + maxSockets?: number + strictSsl?: boolean + timeout?: number + httpProxy?: string + httpsProxy?: string + noProxy?: boolean | string + clientCertificates?: Record +} + +/** + * Clear the dispatcher cache. Useful for testing. + */ +export function clearDispatcherCache (): void { + DISPATCHER_CACHE.clear() +} + +/** + * Get a dispatcher for the given URI and options. + * Returns undefined if no special configuration is needed (to use global dispatcher). + */ +export function getDispatcher (uri: string, opts: DispatcherOptions): Dispatcher | undefined { + // If no special options are set, use the global dispatcher + if (!needsCustomDispatcher(opts)) { + return undefined + } + + const parsedUri = new URL(uri) + + if ((opts.httpProxy || opts.httpsProxy) && !checkNoProxy(parsedUri, opts)) { + const proxyDispatcher = getProxyDispatcher(parsedUri, opts) + if (proxyDispatcher) return proxyDispatcher + } + return getNonProxyDispatcher(parsedUri, opts) +} + +function needsCustomDispatcher (opts: DispatcherOptions): boolean { + return Boolean( + opts.httpProxy || + opts.httpsProxy || + opts.ca || + opts.cert || + opts.key || + opts.localAddress || + opts.strictSsl === false || + opts.clientCertificates || + opts.maxSockets + ) +} + +function parseProxyUrl (proxy: string, protocol: string): URL { + let proxyUrl = proxy + if (!proxyUrl.includes('://')) { + proxyUrl = `${protocol}//${proxyUrl}` + } + try { + return new URL(proxyUrl) + } catch { + throw new PnpmError('INVALID_PROXY', "Couldn't parse proxy URL", { + hint: 'If your proxy URL contains a username and password, make sure to URL-encode them ' + + '(you may use the encodeURIComponent function). For instance, ' + + 'https-proxy=https://use%21r:pas%2As@my.proxy:1234/foo. ' + + 'Do not encode the colon (:) between the username and password.', + }) + } +} + + +function getSocksProxyType (protocol: string): 4 | 5 { + switch (protocol.replace(':', '')) { + case 'socks4': + case 'socks4a': + return 4 + default: + return 5 + } +} + +function getProxyDispatcher (parsedUri: URL, opts: DispatcherOptions): Dispatcher | null { + const isHttps = parsedUri.protocol === 'https:' + const proxy = isHttps ? opts.httpsProxy : opts.httpProxy + + if (!proxy) return null + + const proxyUrl = parseProxyUrl(proxy, parsedUri.protocol) + + const sslConfig = pickSettingByUrl(opts.clientCertificates, parsedUri.href) + const { ca, cert, key: certKey } = { ...opts, ...sslConfig } + + const key = [ + `proxy:${proxyUrl.protocol}//${proxyUrl.username}:${proxyUrl.password}@${proxyUrl.host}:${proxyUrl.port}`, + `https:${isHttps.toString()}`, + `local-address:${opts.localAddress ?? '>no-local-address<'}`, + `max-sockets:${(opts.maxSockets ?? DEFAULT_MAX_SOCKETS).toString()}`, + `strict-ssl:${isHttps ? Boolean(opts.strictSsl).toString() : '>no-strict-ssl<'}`, + `ca:${(isHttps && ca?.toString()) || '-'}`, + `cert:${(isHttps && cert?.toString()) || '-'}`, + `key:${(isHttps && certKey?.toString()) || '-'}`, + ].join(':') + + if (DISPATCHER_CACHE.has(key)) { + return DISPATCHER_CACHE.get(key)! + } + + let dispatcher: Dispatcher + + if (proxyUrl.protocol.startsWith('socks')) { + dispatcher = createSocksDispatcher(proxyUrl, parsedUri, opts, { ca, cert, key: certKey }) + } else { + dispatcher = createHttpProxyDispatcher(proxyUrl, isHttps, opts, { ca, cert, key: certKey }) + } + + DISPATCHER_CACHE.set(key, dispatcher) + return dispatcher +} + +function createHttpProxyDispatcher ( + proxyUrl: URL, + isHttps: boolean, + opts: DispatcherOptions, + tlsConfig: { ca?: string | string[] | Buffer, cert?: string | string[] | Buffer, key?: string | Buffer } +): Dispatcher { + return new ProxyAgent({ + uri: proxyUrl.href, + token: proxyUrl.username + ? `Basic ${Buffer.from(`${decodeURIComponent(proxyUrl.username)}:${decodeURIComponent(proxyUrl.password)}`).toString('base64')}` + : undefined, + connections: opts.maxSockets ?? DEFAULT_MAX_SOCKETS, + requestTls: isHttps + ? { + ca: tlsConfig.ca, + cert: tlsConfig.cert, + key: tlsConfig.key, + rejectUnauthorized: opts.strictSsl ?? true, + localAddress: opts.localAddress, + } + : undefined, + proxyTls: { + ca: opts.ca, + rejectUnauthorized: opts.strictSsl ?? true, + }, + }) +} + +function createSocksDispatcher ( + proxyUrl: URL, + targetUri: URL, + opts: DispatcherOptions, + tlsConfig: { ca?: string | string[] | Buffer, cert?: string | string[] | Buffer, key?: string | Buffer } +): Dispatcher { + const isHttps = targetUri.protocol === 'https:' + const socksType = getSocksProxyType(proxyUrl.protocol) + const proxyHost = proxyUrl.hostname + const proxyPort = parseInt(proxyUrl.port, 10) || (socksType === 4 ? 1080 : 1080) + + return new Agent({ + connections: opts.maxSockets ?? DEFAULT_MAX_SOCKETS, + connect: async (connectOpts, callback) => { + try { + const { socket } = await SocksClient.createConnection({ + proxy: { + host: proxyHost, + port: proxyPort, + type: socksType, + userId: proxyUrl.username ? decodeURIComponent(proxyUrl.username) : undefined, + password: proxyUrl.password ? decodeURIComponent(proxyUrl.password) : undefined, + }, + command: 'connect', + destination: { + host: connectOpts.hostname!, + port: parseInt(String(connectOpts.port!), 10), + }, + }) + + if (isHttps) { + const tlsOpts: tls.ConnectionOptions = { + socket: socket as net.Socket, + servername: connectOpts.hostname!, + ca: tlsConfig.ca, + cert: tlsConfig.cert, + key: tlsConfig.key, + rejectUnauthorized: opts.strictSsl ?? true, + } + const tlsSocket = tls.connect(tlsOpts) + tlsSocket.on('secureConnect', () => { + callback(null, tlsSocket) + }) + tlsSocket.on('error', (err) => { + callback(err, null) + }) + } else { + callback(null, socket as net.Socket) + } + } catch (err) { + callback(err as Error, null) + } + }, + }) +} + +function getNonProxyDispatcher (parsedUri: URL, opts: DispatcherOptions): Dispatcher { + const isHttps = parsedUri.protocol === 'https:' + + const sslConfig = pickSettingByUrl(opts.clientCertificates, parsedUri.href) + const { ca, cert, key: certKey } = { ...opts, ...sslConfig } + + const key = [ + `https:${isHttps.toString()}`, + `local-address:${opts.localAddress ?? '>no-local-address<'}`, + `max-sockets:${(opts.maxSockets ?? DEFAULT_MAX_SOCKETS).toString()}`, + `strict-ssl:${isHttps ? Boolean(opts.strictSsl).toString() : '>no-strict-ssl<'}`, + `ca:${(isHttps && ca?.toString()) || '-'}`, + `cert:${(isHttps && cert?.toString()) || '-'}`, + `key:${(isHttps && certKey?.toString()) || '-'}`, + ].join(':') + + if (DISPATCHER_CACHE.has(key)) { + return DISPATCHER_CACHE.get(key)! + } + + const connectTimeout = typeof opts.timeout !== 'number' || opts.timeout === 0 + ? 0 + : opts.timeout + 1 + + const agent = new Agent({ + connections: opts.maxSockets ?? DEFAULT_MAX_SOCKETS, + connectTimeout, + keepAliveTimeout: 4000, + keepAliveMaxTimeout: 15000, + connect: isHttps + ? { + ca, + cert, + key: certKey, + rejectUnauthorized: opts.strictSsl ?? true, + localAddress: opts.localAddress, + } + : { + localAddress: opts.localAddress, + }, + }) + + DISPATCHER_CACHE.set(key, agent) + return agent +} + +function checkNoProxy (parsedUri: URL, opts: { noProxy?: boolean | string }): boolean { + const host = parsedUri.hostname + .split('.') + .filter(x => x) + .reverse() + if (typeof opts.noProxy === 'string') { + const noproxyArr = opts.noProxy.split(',').map(s => s.trim()) + return noproxyArr.some(no => { + const noParts = no + .split('.') + .filter(x => x) + .reverse() + if (noParts.length === 0) { + return false + } + for (let i = 0; i < noParts.length; i++) { + if (host[i] !== noParts[i]) { + return false + } + } + return true + }) + } + return opts.noProxy === true +} + +/** + * Pick SSL/TLS configuration by URL using nerf-dart matching. + * This matches the behavior of @pnpm/network.config's pickSettingByUrl. + */ +function pickSettingByUrl ( + settings: Record | undefined, + uri: string +): T | undefined { + if (!settings) return undefined + + // Try exact match first + if (settings[uri]) return settings[uri] + + // Use nerf-dart format for matching (e.g., //registry.npmjs.org/) + const nerf = nerfDart(uri) + if (settings[nerf]) return settings[nerf] + + // Try without port + const parsedUrl = new URL(uri) + const withoutPort = removePort(parsedUrl) + if (settings[withoutPort]) return settings[withoutPort] + + // Try progressively shorter nerf-dart paths + const maxParts = Object.keys(settings).reduce((max, key) => { + const parts = key.split('/').length + return parts > max ? parts : max + }, 0) + const parts = nerf.split('/') + for (let i = Math.min(parts.length, maxParts) - 1; i >= 3; i--) { + const key = `${parts.slice(0, i).join('/')}/` + if (settings[key]) { + return settings[key] + } + } + + // If the URL had a port, try again without it + if (withoutPort !== uri) { + return pickSettingByUrl(settings, withoutPort) + } + + return undefined +} + +function removePort (parsedUrl: URL): string { + if (parsedUrl.port === '') return parsedUrl.href + const copy = new URL(parsedUrl.href) + copy.port = '' + const res = copy.toString() + return res.endsWith('/') ? res : `${res}/` +} diff --git a/network/fetch/src/fetch.ts b/network/fetch/src/fetch.ts index 97045fded3..8350ca23e4 100644 --- a/network/fetch/src/fetch.ts +++ b/network/fetch/src/fetch.ts @@ -1,13 +1,8 @@ -import assert from 'node:assert' -import util from 'node:util' - import { requestRetryLogger } from '@pnpm/core-loggers' import { operation, type RetryTimeoutOptions } from '@zkochan/retry' -import nodeFetch, { type Request, type RequestInit as NodeRequestInit, Response } from 'node-fetch' +import { type Dispatcher, fetch as undiciFetch } from 'undici' -export { isRedirect } from 'node-fetch' - -export { Response, type RetryTimeoutOptions } +export { type RetryTimeoutOptions } interface URLLike { href: string @@ -18,11 +13,18 @@ const NO_RETRY_ERROR_CODES = new Set([ 'ERR_OSSL_PEM_NO_START_LINE', ]) -export type RequestInfo = string | URLLike | Request +const REDIRECT_CODES = new Set([301, 302, 303, 307, 308]) -export interface RequestInit extends NodeRequestInit { +export function isRedirect (statusCode: number): boolean { + return REDIRECT_CODES.has(statusCode) +} + +export type RequestInfo = string | URLLike | URL + +export interface RequestInit extends globalThis.RequestInit { retry?: RetryTimeoutOptions timeout?: number + dispatcher?: Dispatcher } export async function fetch (url: RequestInfo, opts: RequestInit = {}): Promise { @@ -40,9 +42,13 @@ export async function fetch (url: RequestInfo, opts: RequestInit = {}): Promise< try { return await new Promise((resolve, reject) => { op.attempt(async (attempt) => { + const urlString = typeof url === 'string' ? url : url.href ?? url.toString() + const { retry: _retry, timeout, dispatcher, ...fetchOpts } = opts + const signal = timeout ? AbortSignal.timeout(timeout) : undefined try { - // this will be retried - const res = await nodeFetch(url as any, opts) // eslint-disable-line + // undici's Response type differs slightly from globalThis.Response (iterator types), + // requiring the double cast. This is a known TypeScript/undici compatibility issue. + const res = await undiciFetch(urlString, { ...fetchOpts, signal, dispatcher } as Parameters[1]) as unknown as Response // A retry on 409 sometimes helps when making requests to the Bit registry. if ((res.status >= 500 && res.status < 600) || [408, 409, 420, 429].includes(res.status)) { throw new ResponseError(res) @@ -50,26 +56,44 @@ export async function fetch (url: RequestInfo, opts: RequestInit = {}): Promise< resolve(res) } } catch (error: unknown) { - assert(util.types.isNativeError(error)) + // Undici errors may not pass isNativeError check, so we handle them more carefully + const err = error as Error & { code?: string, cause?: { code?: string } } + // Check error code in both error.code and error.cause.code (undici wraps errors) + const errorCode = err?.code ?? err?.cause?.code if ( - 'code' in error && - typeof error.code === 'string' && - NO_RETRY_ERROR_CODES.has(error.code) + typeof errorCode === 'string' && + NO_RETRY_ERROR_CODES.has(errorCode) ) { throw error } - const timeout = op.retry(error) - if (timeout === false) { + const retryTimeout = op.retry(err) + if (retryTimeout === false) { reject(op.mainError()) return } + // Extract error properties into a plain object because Error properties + // are non-enumerable and don't serialize well through the logging system + const errorInfo = { + name: err.name, + message: err.message, + code: err.code, + errno: (err as Error & { errno?: number }).errno, + // For HTTP errors from ResponseError class + status: (err as Error & { status?: number }).status, + statusCode: (err as Error & { statusCode?: number }).statusCode, + // undici wraps the actual network error in a cause property + cause: err.cause ? { + code: err.cause.code, + errno: (err.cause as { errno?: number }).errno, + } : undefined, + } requestRetryLogger.debug({ attempt, - error, + error: errorInfo, maxRetries, method: opts.method ?? 'GET', - timeout, - url: url.toString(), + timeout: retryTimeout, + url: urlString, }) } }) diff --git a/network/fetch/src/fetchFromRegistry.ts b/network/fetch/src/fetchFromRegistry.ts index 8a52899bbb..952fd07a4f 100644 --- a/network/fetch/src/fetchFromRegistry.ts +++ b/network/fetch/src/fetchFromRegistry.ts @@ -1,10 +1,10 @@ import { URL } from 'node:url' import type { FetchFromRegistry } from '@pnpm/fetching.types' -import { type AgentOptions, getAgent } from '@pnpm/network.agent' import type { SslConfig } from '@pnpm/types' -import { fetch, isRedirect, type RequestInfo, type RequestInit, type Response } from './fetch.js' +import { type DispatcherOptions, getDispatcher } from './dispatcher.js' +import { fetch, isRedirect, type RequestInit } from './fetch.js' const USER_AGENT = 'pnpm' // or maybe make it `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})` @@ -16,34 +16,31 @@ const ACCEPT_ABBREVIATED_DOC = `${ABBREVIATED_DOC}; q=1.0, ${FULL_DOC}; q=0.8, * const MAX_FOLLOWED_REDIRECTS = 20 -export interface FetchWithAgentOptions extends RequestInit { - agentOptions: AgentOptions +export interface FetchWithDispatcherOptions extends RequestInit { + dispatcherOptions: DispatcherOptions } -export function fetchWithAgent (url: RequestInfo, opts: FetchWithAgentOptions): Promise { - const agent = getAgent(url.toString(), { - ...opts.agentOptions, - strictSsl: opts.agentOptions.strictSsl ?? true, - } as any) as any // eslint-disable-line - const headers = opts.headers ?? {} - // @ts-expect-error - headers['connection'] = agent ? 'keep-alive' : 'close' +export function fetchWithDispatcher (url: string | URL, opts: FetchWithDispatcherOptions): Promise { + const dispatcher = getDispatcher(url.toString(), { + ...opts.dispatcherOptions, + strictSsl: opts.dispatcherOptions.strictSsl ?? true, + }) return fetch(url, { ...opts, - agent, + dispatcher, }) } -export type { AgentOptions } +export type { DispatcherOptions } -export interface CreateFetchFromRegistryOptions extends AgentOptions { +export interface CreateFetchFromRegistryOptions extends DispatcherOptions { userAgent?: string sslConfigs?: Record } export function createFetchFromRegistry (defaultOpts: CreateFetchFromRegistryOptions): FetchFromRegistry { return async (url, opts): Promise => { - const headers = { + const headers: Record = { 'user-agent': USER_AGENT, ...getHeaders({ auth: opts?.authHeaderValue, @@ -57,22 +54,16 @@ export function createFetchFromRegistry (defaultOpts: CreateFetchFromRegistryOpt const originalHost = urlObject.host /* eslint-disable no-await-in-loop */ while (true) { - const agentOptions = { + const dispatcherOptions: DispatcherOptions = { ...defaultOpts, ...opts, strictSsl: defaultOpts.strictSsl ?? true, - } as any // eslint-disable-line + clientCertificates: defaultOpts.sslConfigs, + } - // We should pass a URL object to node-fetch till this is not resolved: - // https://github.com/bitinn/node-fetch/issues/245 - const response = await fetchWithAgent(urlObject, { - agentOptions: { - ...agentOptions, - clientCertificates: defaultOpts.sslConfigs, - }, - // if verifying integrity, node-fetch must not decompress - compress: opts?.compress ?? false, - method: opts?.method, + const response = await fetchWithDispatcher(urlObject, { + dispatcherOptions, + // if verifying integrity, native fetch must not decompress headers, redirect: 'manual', retry: opts?.retry, diff --git a/network/fetch/src/index.ts b/network/fetch/src/index.ts index 65bec1e796..91c95e5369 100644 --- a/network/fetch/src/index.ts +++ b/network/fetch/src/index.ts @@ -1,3 +1,4 @@ -export { fetch, type RetryTimeoutOptions } from './fetch.js' -export { type AgentOptions, createFetchFromRegistry, type CreateFetchFromRegistryOptions, fetchWithAgent } from './fetchFromRegistry.js' +export { clearDispatcherCache, getDispatcher } from './dispatcher.js' +export { fetch, isRedirect, type RetryTimeoutOptions } from './fetch.js' +export { createFetchFromRegistry, type CreateFetchFromRegistryOptions, type DispatcherOptions, fetchWithDispatcher } from './fetchFromRegistry.js' export type { FetchFromRegistry } from '@pnpm/fetching.types' diff --git a/network/fetch/test/dispatcher.test.ts b/network/fetch/test/dispatcher.test.ts new file mode 100644 index 0000000000..da3da23a97 --- /dev/null +++ b/network/fetch/test/dispatcher.test.ts @@ -0,0 +1,271 @@ +/// +import net from 'node:net' + +import { clearDispatcherCache, type DispatcherOptions, getDispatcher } from '@pnpm/network.fetch' +import { Agent, ProxyAgent } from 'undici' + +afterEach(() => { + clearDispatcherCache() +}) + +describe('getDispatcher', () => { + test('returns undefined when no special options are set', () => { + expect(getDispatcher('https://registry.npmjs.org/foo', {})).toBeUndefined() + }) + + test('returns a dispatcher when strictSsl is false', () => { + const dispatcher = getDispatcher('https://registry.npmjs.org/foo', { strictSsl: false }) + expect(dispatcher).toBeDefined() + expect(dispatcher).toBeInstanceOf(Agent) + }) + + test('returns a dispatcher when ca is set', () => { + const dispatcher = getDispatcher('https://registry.npmjs.org/foo', { ca: 'test-ca' }) + expect(dispatcher).toBeDefined() + expect(dispatcher).toBeInstanceOf(Agent) + }) + + test('returns a dispatcher when maxSockets is set', () => { + const dispatcher = getDispatcher('https://registry.npmjs.org/foo', { maxSockets: 10 }) + expect(dispatcher).toBeDefined() + }) + + test('returns a dispatcher when localAddress is set', () => { + const dispatcher = getDispatcher('https://registry.npmjs.org/foo', { localAddress: '127.0.0.1' }) + expect(dispatcher).toBeDefined() + }) + + test('caches dispatchers by configuration', () => { + const opts: DispatcherOptions = { strictSsl: false } + const d1 = getDispatcher('https://registry.npmjs.org/foo', opts) + const d2 = getDispatcher('https://registry.npmjs.org/bar', opts) + expect(d1).toBe(d2) // same config → same cached dispatcher + }) + + test('different maxSockets produce different dispatchers', () => { + const d1 = getDispatcher('https://registry.npmjs.org/foo', { maxSockets: 10 }) + const d2 = getDispatcher('https://registry.npmjs.org/foo', { maxSockets: 20 }) + expect(d1).not.toBe(d2) + }) + + test('clearDispatcherCache clears cached dispatchers', () => { + const opts: DispatcherOptions = { strictSsl: false } + const d1 = getDispatcher('https://registry.npmjs.org/foo', opts) + clearDispatcherCache() + const d2 = getDispatcher('https://registry.npmjs.org/foo', opts) + expect(d1).not.toBe(d2) + }) +}) + +describe('HTTP proxy', () => { + test('returns ProxyAgent for httpProxy with http target', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'http://proxy.example.com:8080', + }) + expect(dispatcher).toBeInstanceOf(ProxyAgent) + }) + + test('returns ProxyAgent for httpsProxy with https target', () => { + const dispatcher = getDispatcher('https://registry.npmjs.org/foo', { + httpsProxy: 'https://proxy.example.com:8080', + }) + expect(dispatcher).toBeInstanceOf(ProxyAgent) + }) + + test('adds protocol prefix when proxy URL has none', () => { + // Should not throw — the proxy URL should get protocol prepended + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'proxy.example.com:8080', + }) + expect(dispatcher).toBeInstanceOf(ProxyAgent) + }) + + test('throws PnpmError for invalid proxy URL', () => { + expect(() => { + getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'http://[invalid', + }) + }).toThrow(/Couldn't parse proxy URL/) + }) + + test('proxy with authentication credentials', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'http://user%21:pass%40@proxy.example.com:8080', + }) + expect(dispatcher).toBeInstanceOf(ProxyAgent) + }) +}) + +describe('SOCKS proxy', () => { + test('returns Agent (not ProxyAgent) for socks5 proxy', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'socks5://proxy.example.com:1080', + }) + expect(dispatcher).toBeDefined() + // SOCKS dispatcher is an Agent with custom connect, not a ProxyAgent + expect(dispatcher).toBeInstanceOf(Agent) + expect(dispatcher).not.toBeInstanceOf(ProxyAgent) + }) + + test('returns Agent for socks4 proxy', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'socks4://proxy.example.com:1080', + }) + expect(dispatcher).toBeDefined() + expect(dispatcher).toBeInstanceOf(Agent) + }) + + test('returns Agent for socks proxy with https target', () => { + const dispatcher = getDispatcher('https://registry.npmjs.org/foo', { + httpsProxy: 'socks5://proxy.example.com:1080', + }) + expect(dispatcher).toBeDefined() + expect(dispatcher).toBeInstanceOf(Agent) + }) + + test('SOCKS proxy dispatchers are cached', () => { + const opts: DispatcherOptions = { httpProxy: 'socks5://proxy.example.com:1080' } + const d1 = getDispatcher('http://registry.npmjs.org/foo', opts) + const d2 = getDispatcher('http://registry.npmjs.org/bar', opts) + expect(d1).toBe(d2) + }) + + test('SOCKS proxy can connect through a real SOCKS5 server', async () => { + // Create a minimal SOCKS5 server that accepts connections + const targetServer = net.createServer((socket) => { + socket.on('data', () => { + socket.write('HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nok') + socket.end() + }) + }) + + const socksServer = net.createServer((socket) => { + // SOCKS5 handshake + socket.once('data', (data) => { + // Client greeting: version, method count, methods + if (data[0] === 0x05) { + // Reply: version 5, no auth required + socket.write(Buffer.from([0x05, 0x00])) + socket.once('data', (connectData) => { + // Connect request: version, cmd=connect, reserved, address type, addr, port + const port = connectData.readUInt16BE(connectData.length - 2) + // Reply: success + socket.write(Buffer.from([0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, (port >> 8) & 0xff, port & 0xff])) + // Tunnel the connection to the target + const target = net.connect(port, '127.0.0.1', () => { + socket.pipe(target) + target.pipe(socket) + }) + target.on('error', () => socket.destroy()) + }) + } + }) + }) + + await new Promise((resolve) => targetServer.listen(0, resolve)) + await new Promise((resolve) => socksServer.listen(0, resolve)) + + const targetPort = (targetServer.address() as net.AddressInfo).port + const socksPort = (socksServer.address() as net.AddressInfo).port + + try { + const dispatcher = getDispatcher(`http://127.0.0.1:${targetPort}/test`, { + httpProxy: `socks5://127.0.0.1:${socksPort}`, + }) + expect(dispatcher).toBeDefined() + + const { fetch: undiciFetch } = await import('undici') + const res = await undiciFetch(`http://127.0.0.1:${targetPort}/test`, { + dispatcher, + }) + expect(res.status).toBe(200) + expect(await res.text()).toBe('ok') + } finally { + targetServer.close() + socksServer.close() + } + }) +}) + +describe('noProxy', () => { + test('bypasses proxy when noProxy matches hostname', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'http://proxy.example.com:8080', + noProxy: 'registry.npmjs.org', + }) + // Should return an Agent (direct), not ProxyAgent + expect(dispatcher).toBeInstanceOf(Agent) + expect(dispatcher).not.toBeInstanceOf(ProxyAgent) + }) + + test('bypasses proxy when noProxy matches domain suffix', () => { + const dispatcher = getDispatcher('http://sub.npmjs.org/foo', { + httpProxy: 'http://proxy.example.com:8080', + noProxy: 'npmjs.org', + }) + expect(dispatcher).toBeInstanceOf(Agent) + expect(dispatcher).not.toBeInstanceOf(ProxyAgent) + }) + + test('does not bypass proxy when noProxy does not match', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'http://proxy.example.com:8080', + noProxy: 'other.org', + }) + expect(dispatcher).toBeInstanceOf(ProxyAgent) + }) + + test('bypasses proxy when noProxy is true', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'http://proxy.example.com:8080', + noProxy: true, + }) + expect(dispatcher).toBeInstanceOf(Agent) + expect(dispatcher).not.toBeInstanceOf(ProxyAgent) + }) + + test('handles comma-separated noProxy list', () => { + const dispatcher = getDispatcher('http://registry.npmjs.org/foo', { + httpProxy: 'http://proxy.example.com:8080', + noProxy: 'other.org, npmjs.org, example.com', + }) + expect(dispatcher).toBeInstanceOf(Agent) + expect(dispatcher).not.toBeInstanceOf(ProxyAgent) + }) +}) + +describe('client certificates', () => { + test('picks client certificate by nerf-dart URL match', () => { + const d1 = getDispatcher('https://registry.example.com/foo', { + clientCertificates: { + '//registry.example.com/': { + ca: 'test-ca', + cert: 'test-cert', + key: 'test-key', + }, + }, + }) + // Should return a dispatcher (because clientCertificates is set) + expect(d1).toBeDefined() + }) + + test('different registries get different dispatchers with different certs', () => { + const opts: DispatcherOptions = { + clientCertificates: { + '//registry.example.com/': { + ca: 'ca-1', + cert: 'cert-1', + key: 'key-1', + }, + '//other.example.com/': { + ca: 'ca-2', + cert: 'cert-2', + key: 'key-2', + }, + }, + } + const d1 = getDispatcher('https://registry.example.com/foo', opts) + const d2 = getDispatcher('https://other.example.com/foo', opts) + expect(d1).not.toBe(d2) // different certs → different dispatchers + }) +}) diff --git a/network/fetch/test/fetchFromRegistry.test.ts b/network/fetch/test/fetchFromRegistry.test.ts index d8430e50e2..5e3ac00b50 100644 --- a/network/fetch/test/fetchFromRegistry.test.ts +++ b/network/fetch/test/fetchFromRegistry.test.ts @@ -2,17 +2,46 @@ import fs from 'node:fs' import path from 'node:path' -import { createFetchFromRegistry } from '@pnpm/network.fetch' +import { clearDispatcherCache, createFetchFromRegistry } from '@pnpm/network.fetch' import { ProxyServer } from 'https-proxy-server-express' -import nock from 'nock' +import { type Dispatcher, getGlobalDispatcher, MockAgent, setGlobalDispatcher } from 'undici' + +let originalDispatcher: Dispatcher | null = null +let currentMockAgent: MockAgent | null = null + +function setupMockAgent (): MockAgent { + if (!originalDispatcher) { + originalDispatcher = getGlobalDispatcher() + } + clearDispatcherCache() + currentMockAgent = new MockAgent() + currentMockAgent.disableNetConnect() + setGlobalDispatcher(currentMockAgent) + return currentMockAgent +} + +async function teardownMockAgent (): Promise { + if (currentMockAgent) { + await currentMockAgent.close() + currentMockAgent = null + } + if (originalDispatcher) { + setGlobalDispatcher(originalDispatcher) + originalDispatcher = null + } +} + +function getMockAgent (): MockAgent { + if (!currentMockAgent) { + throw new Error('MockAgent not initialized. Call setupMockAgent() first.') + } + return currentMockAgent +} const CERTS_DIR = path.join(import.meta.dirname, '__certs__') -afterEach(() => { - nock.cleanAll() -}) - test('fetchFromRegistry', async () => { + // This test uses real network - no mock needed const fetchFromRegistry = createFetchFromRegistry({}) const res = await fetchFromRegistry('https://registry.npmjs.org/is-positive') const metadata = await res.json() as any // eslint-disable-line @@ -21,6 +50,7 @@ test('fetchFromRegistry', async () => { }) test('fetchFromRegistry fullMetadata', async () => { + // This test uses real network - no mock needed const fetchFromRegistry = createFetchFromRegistry({}) const res = await fetchFromRegistry('https://registry.npmjs.org/is-positive', { fullMetadata: true }) const metadata = await res.json() as any // eslint-disable-line @@ -29,48 +59,63 @@ test('fetchFromRegistry fullMetadata', async () => { }) test('authorization headers are removed before redirection if the target is on a different host', async () => { - nock('http://registry.pnpm.io/', { - reqheaders: { authorization: 'Bearer 123' }, - }) - .get('/is-positive') - .reply(302, '', { location: 'http://registry.other.org/is-positive' }) - nock('http://registry.other.org/', { badheaders: ['authorization'] }) - .get('/is-positive') - .reply(200, { ok: true }) + setupMockAgent() + try { + const mockPool1 = getMockAgent().get('http://registry.pnpm.io') + mockPool1.intercept({ + path: '/is-positive', + method: 'GET', + headers: { authorization: 'Bearer 123' }, + }).reply(302, '', { headers: { location: 'http://registry.other.org/is-positive' } }) - const fetchFromRegistry = createFetchFromRegistry({}) - const res = await fetchFromRegistry( - 'http://registry.pnpm.io/is-positive', - { authHeaderValue: 'Bearer 123' } - ) + const mockPool2 = getMockAgent().get('http://registry.other.org') + mockPool2.intercept({ + path: '/is-positive', + method: 'GET', + }).reply(200, { ok: true }, { headers: { 'content-type': 'application/json' } }) - expect(await res.json()).toStrictEqual({ ok: true }) - expect(nock.isDone()).toBeTruthy() + const fetchFromRegistry = createFetchFromRegistry({}) + const res = await fetchFromRegistry( + 'http://registry.pnpm.io/is-positive', + { authHeaderValue: 'Bearer 123' } + ) + + expect(await res.json()).toStrictEqual({ ok: true }) + } finally { + await teardownMockAgent() + } }) test('authorization headers are not removed before redirection if the target is on the same host', async () => { - nock('http://registry.pnpm.io/', { - reqheaders: { authorization: 'Bearer 123' }, - }) - .get('/is-positive') - .reply(302, '', { location: 'http://registry.pnpm.io/is-positive-new' }) - nock('http://registry.pnpm.io/', { - reqheaders: { authorization: 'Bearer 123' }, - }) - .get('/is-positive-new') - .reply(200, { ok: true }) + setupMockAgent() + try { + const mockPool = getMockAgent().get('http://registry.pnpm.io') + mockPool.intercept({ + path: '/is-positive', + method: 'GET', + headers: { authorization: 'Bearer 123' }, + }).reply(302, '', { headers: { location: 'http://registry.pnpm.io/is-positive-new' } }) - const fetchFromRegistry = createFetchFromRegistry({}) - const res = await fetchFromRegistry( - 'http://registry.pnpm.io/is-positive', - { authHeaderValue: 'Bearer 123' } - ) + mockPool.intercept({ + path: '/is-positive-new', + method: 'GET', + headers: { authorization: 'Bearer 123' }, + }).reply(200, { ok: true }, { headers: { 'content-type': 'application/json' } }) - expect(await res.json()).toStrictEqual({ ok: true }) - expect(nock.isDone()).toBeTruthy() + const fetchFromRegistry = createFetchFromRegistry({}) + const res = await fetchFromRegistry( + 'http://registry.pnpm.io/is-positive', + { authHeaderValue: 'Bearer 123' } + ) + + expect(await res.json()).toStrictEqual({ ok: true }) + } finally { + await teardownMockAgent() + } }) test('switch to the correct agent for requests on redirect from http: to https:', async () => { + // This test uses real network - no mock needed const fetchFromRegistry = createFetchFromRegistry({}) // We can test this on any endpoint that redirects from http: to https: @@ -129,7 +174,7 @@ test('fail if the client certificate is not provided', async () => { strictSsl: false, }) - let err!: Error & { code: string } + let err!: Error & { code?: string, cause?: { code?: string } } try { await fetchFromRegistry(`https://localhost:${randomPort}/is-positive`, { retry: { @@ -141,72 +186,106 @@ test('fail if the client certificate is not provided', async () => { } finally { await proxyServer.stop() } - expect(err?.code).toMatch(/ECONNRESET|ERR_SSL_TLSV13_ALERT_CERTIFICATE_REQUIRED/) + // undici errors may have the code in err.cause.code + const errorCode = err?.code ?? err?.cause?.code + expect(errorCode).toMatch(/ECONNRESET|ERR_SSL_TLSV13_ALERT_CERTIFICATE_REQUIRED|UNABLE_TO_VERIFY_LEAF_SIGNATURE|UND_ERR_SOCKET/) }) test('redirect to protocol-relative URL', async () => { - nock('http://registry.pnpm.io/') - .get('/foo') - .reply(302, '', { location: '//registry.other.org/foo' }) - nock('http://registry.other.org/') - .get('/foo') - .reply(200, { ok: true }) + setupMockAgent() + try { + const mockPool1 = getMockAgent().get('http://registry.pnpm.io') + mockPool1.intercept({ + path: '/foo', + method: 'GET', + }).reply(302, '', { headers: { location: '//registry.other.org/foo' } }) - const fetchFromRegistry = createFetchFromRegistry({}) - const res = await fetchFromRegistry( - 'http://registry.pnpm.io/foo' - ) + const mockPool2 = getMockAgent().get('http://registry.other.org') + mockPool2.intercept({ + path: '/foo', + method: 'GET', + }).reply(200, { ok: true }, { headers: { 'content-type': 'application/json' } }) - expect(await res.json()).toStrictEqual({ ok: true }) - expect(nock.isDone()).toBeTruthy() + const fetchFromRegistry = createFetchFromRegistry({}) + const res = await fetchFromRegistry( + 'http://registry.pnpm.io/foo' + ) + + expect(await res.json()).toStrictEqual({ ok: true }) + } finally { + await teardownMockAgent() + } }) test('redirect to relative URL', async () => { - nock('http://registry.pnpm.io/') - .get('/bar/baz') - .reply(302, '', { location: '../foo' }) - nock('http://registry.pnpm.io/') - .get('/foo') - .reply(200, { ok: true }) + setupMockAgent() + try { + const mockPool = getMockAgent().get('http://registry.pnpm.io') + mockPool.intercept({ + path: '/bar/baz', + method: 'GET', + }).reply(302, '', { headers: { location: '../foo' } }) - const fetchFromRegistry = createFetchFromRegistry({}) - const res = await fetchFromRegistry( - 'http://registry.pnpm.io/bar/baz' - ) + mockPool.intercept({ + path: '/foo', + method: 'GET', + }).reply(200, { ok: true }, { headers: { 'content-type': 'application/json' } }) - expect(await res.json()).toStrictEqual({ ok: true }) - expect(nock.isDone()).toBeTruthy() + const fetchFromRegistry = createFetchFromRegistry({}) + const res = await fetchFromRegistry( + 'http://registry.pnpm.io/bar/baz' + ) + + expect(await res.json()).toStrictEqual({ ok: true }) + } finally { + await teardownMockAgent() + } }) test('redirect to relative URL when request pkg.pr.new link', async () => { - nock('https://pkg.pr.new/') - .get('/vue@14175') - .reply(302, '', { location: '/vuejs/core/vue@14182' }) + setupMockAgent() + try { + const mockPool = getMockAgent().get('https://pkg.pr.new') + mockPool.intercept({ + path: '/vue@14175', + method: 'GET', + }).reply(302, '', { headers: { location: '/vuejs/core/vue@14182' } }) - nock('https://pkg.pr.new/') - .get('/vuejs/core/vue@14182') - .reply(302, '', { location: '/vuejs/core/vue@82a13bb6faaa9f77a06b57e69e0934b9f620f333' }) + mockPool.intercept({ + path: '/vuejs/core/vue@14182', + method: 'GET', + }).reply(302, '', { headers: { location: '/vuejs/core/vue@82a13bb6faaa9f77a06b57e69e0934b9f620f333' } }) - nock('https://pkg.pr.new/') - .get('/vuejs/core/vue@82a13bb6faaa9f77a06b57e69e0934b9f620f333') - .reply(200, { ok: true }) + mockPool.intercept({ + path: '/vuejs/core/vue@82a13bb6faaa9f77a06b57e69e0934b9f620f333', + method: 'GET', + }).reply(200, { ok: true }, { headers: { 'content-type': 'application/json' } }) - const fetchFromRegistry = createFetchFromRegistry({}) - const res = await fetchFromRegistry( - 'https://pkg.pr.new/vue@14175' - ) + const fetchFromRegistry = createFetchFromRegistry({}) + const res = await fetchFromRegistry( + 'https://pkg.pr.new/vue@14175' + ) - expect(await res.json()).toStrictEqual({ ok: true }) - expect(nock.isDone()).toBeTruthy() + expect(await res.json()).toStrictEqual({ ok: true }) + } finally { + await teardownMockAgent() + } }) test('redirect without location header throws error', async () => { - nock('http://registry.pnpm.io/') - .get('/missing-location') - .reply(302, 'found') + setupMockAgent() + try { + const mockPool = getMockAgent().get('http://registry.pnpm.io') + mockPool.intercept({ + path: '/missing-location', + method: 'GET', + }).reply(302, 'found') - const fetchFromRegistry = createFetchFromRegistry({}) - await expect(fetchFromRegistry( - 'http://registry.pnpm.io/missing-location' - )).rejects.toThrow(/Redirect location header missing/) + const fetchFromRegistry = createFetchFromRegistry({}) + await expect(fetchFromRegistry( + 'http://registry.pnpm.io/missing-location' + )).rejects.toThrow(/Redirect location header missing/) + } finally { + await teardownMockAgent() + } }) diff --git a/network/fetch/tsconfig.json b/network/fetch/tsconfig.json index d71b5409ac..0cd246e1f6 100644 --- a/network/fetch/tsconfig.json +++ b/network/fetch/tsconfig.json @@ -12,6 +12,9 @@ { "path": "../../core/core-loggers" }, + { + "path": "../../core/error" + }, { "path": "../../core/logger" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fcebfcda4..2a3b475ec0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,184 +1,3 @@ ---- -lockfileVersion: '9.0' - -importers: - - .: - configDependencies: {} - packageManagerDependencies: - '@pnpm/exe': - specifier: 11.0.0-beta.3 - version: 11.0.0-beta.3 - pnpm: - specifier: 11.0.0-beta.3 - version: 11.0.0-beta.3 - -packages: - - '@pnpm/exe@11.0.0-beta.3': - resolution: {integrity: sha512-yWNlHHdYmvf4c0MCkCzAa4csJDPdA+7yJCbXBUDXMbUu/0Zv/AxtO77q24MwlnBUC0dWeA+0F/pPmdkR9aTV2A==} - hasBin: true - - '@pnpm/linux-arm64@11.0.0-beta.3': - resolution: {integrity: sha512-TF2fyuCY9GggR4kfhjo1hMmgn+rIohenwNoH0tLPM7JlBK7/UAIFt1LI+o999tRwTCEw7gnxHFwtI2vyQuDfNw==} - cpu: [arm64] - os: [linux] - - '@pnpm/linux-x64@11.0.0-beta.3': - resolution: {integrity: sha512-7GrLsnSuDH62y486GUTwJdohGIC1ugz9ZJkbKOHgxIAkNGcSTJ1IkkdARtv7/WMmOEwwESDmtpOQ6LmjnpDMSA==} - cpu: [x64] - os: [linux] - - '@pnpm/macos-arm64@11.0.0-beta.3': - resolution: {integrity: sha512-NQKgI1DURrEiOUzpxL0Mc+yn7DV4tpShqGnjaJLbz8ZCXsX/qhmybebvCG3r+IfSk3P5KID66lcgC/Osiaz0Dg==} - cpu: [arm64] - os: [darwin] - - '@pnpm/macos-x64@11.0.0-beta.3': - resolution: {integrity: sha512-Ky22KFYHXx8+8WU4KJT9NXVgzFioL2w9pHTQjsqTK70AbxiErscPYhrFIehlCNbXjgs+tGVIy13QNKkiwvmS8w==} - cpu: [x64] - os: [darwin] - - '@pnpm/win-arm64@11.0.0-beta.3': - resolution: {integrity: sha512-7L8TFNDm25m+XYSyhcola3YFd/li6BZzzl56SsyGnZabsvUslMwnDiJad48wOz8IuN7zsrTSGh+X/x6F+GdrFQ==} - cpu: [arm64] - os: [win32] - - '@pnpm/win-x64@11.0.0-beta.3': - resolution: {integrity: sha512-Z/6OpMUaIpggXjCtWEhp6kWjiT/2EImhkJAu8AodOORqeNcWouGEq3sO4XU0em6d+pAHmdV0hWMQ2xCUmPVuiA==} - cpu: [x64] - os: [win32] - - '@reflink/reflink-darwin-arm64@0.1.19': - resolution: {integrity: sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@reflink/reflink-darwin-x64@0.1.19': - resolution: {integrity: sha512-By85MSWrMZa+c26TcnAy8SDk0sTUkYlNnwknSchkhHpGXOtjNDUOxJE9oByBnGbeuIE1PiQsxDG3Ud+IVV9yuA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@reflink/reflink-linux-arm64-gnu@0.1.19': - resolution: {integrity: sha512-7P+er8+rP9iNeN+bfmccM4hTAaLP6PQJPKWSA4iSk2bNvo6KU6RyPgYeHxXmzNKzPVRcypZQTpFgstHam6maVg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@reflink/reflink-linux-arm64-musl@0.1.19': - resolution: {integrity: sha512-37iO/Dp6m5DDaC2sf3zPtx/hl9FV3Xze4xoYidrxxS9bgP3S8ALroxRK6xBG/1TtfXKTvolvp+IjrUU6ujIGmA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@reflink/reflink-linux-x64-gnu@0.1.19': - resolution: {integrity: sha512-jbI8jvuYCaA3MVUdu8vLoLAFqC+iNMpiSuLbxlAgg7x3K5bsS8nOpTRnkLF7vISJ+rVR8W+7ThXlXlUQ93ulkw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@reflink/reflink-linux-x64-musl@0.1.19': - resolution: {integrity: sha512-e9FBWDe+lv7QKAwtKOt6A2W/fyy/aEEfr0g6j/hWzvQcrzHCsz07BNQYlNOjTfeytrtLU7k449H1PI95jA4OjQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@reflink/reflink-win32-arm64-msvc@0.1.19': - resolution: {integrity: sha512-09PxnVIQcd+UOn4WAW73WU6PXL7DwGS6wPlkMhMg2zlHHG65F3vHepOw06HFCq+N42qkaNAc8AKIabWvtk6cIQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@reflink/reflink-win32-x64-msvc@0.1.19': - resolution: {integrity: sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@reflink/reflink@0.1.19': - resolution: {integrity: sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==} - engines: {node: '>= 10'} - - pnpm@11.0.0-beta.3: - resolution: {integrity: sha512-6PrfRjycZV4vRX6ttG9oR6pOgbI2/OcF2QLOzHm35UcRuvtqP4zf3wQfAAPwEbeu1uAbpSg/Q5cL8h32tumy6Q==} - engines: {node: '>=22.13'} - hasBin: true - -snapshots: - - '@pnpm/exe@11.0.0-beta.3': - dependencies: - '@reflink/reflink': 0.1.19 - optionalDependencies: - '@pnpm/linux-arm64': 11.0.0-beta.3 - '@pnpm/linux-x64': 11.0.0-beta.3 - '@pnpm/macos-arm64': 11.0.0-beta.3 - '@pnpm/macos-x64': 11.0.0-beta.3 - '@pnpm/win-arm64': 11.0.0-beta.3 - '@pnpm/win-x64': 11.0.0-beta.3 - - '@pnpm/linux-arm64@11.0.0-beta.3': - optional: true - - '@pnpm/linux-x64@11.0.0-beta.3': - optional: true - - '@pnpm/macos-arm64@11.0.0-beta.3': - optional: true - - '@pnpm/macos-x64@11.0.0-beta.3': - optional: true - - '@pnpm/win-arm64@11.0.0-beta.3': - optional: true - - '@pnpm/win-x64@11.0.0-beta.3': - optional: true - - '@reflink/reflink-darwin-arm64@0.1.19': - optional: true - - '@reflink/reflink-darwin-x64@0.1.19': - optional: true - - '@reflink/reflink-linux-arm64-gnu@0.1.19': - optional: true - - '@reflink/reflink-linux-arm64-musl@0.1.19': - optional: true - - '@reflink/reflink-linux-x64-gnu@0.1.19': - optional: true - - '@reflink/reflink-linux-x64-musl@0.1.19': - optional: true - - '@reflink/reflink-win32-arm64-msvc@0.1.19': - optional: true - - '@reflink/reflink-win32-x64-msvc@0.1.19': - optional: true - - '@reflink/reflink@0.1.19': - optionalDependencies: - '@reflink/reflink-darwin-arm64': 0.1.19 - '@reflink/reflink-darwin-x64': 0.1.19 - '@reflink/reflink-linux-arm64-gnu': 0.1.19 - '@reflink/reflink-linux-arm64-musl': 0.1.19 - '@reflink/reflink-linux-x64-gnu': 0.1.19 - '@reflink/reflink-linux-x64-musl': 0.1.19 - '@reflink/reflink-win32-arm64-msvc': 0.1.19 - '@reflink/reflink-win32-x64-msvc': 0.1.19 - - pnpm@11.0.0-beta.3: {} - ---- lockfileVersion: '9.0' settings: @@ -189,7 +8,7 @@ catalogs: default: '@babel/core': specifier: ^7.28.3 - version: 7.29.0 + version: 7.28.3 '@babel/plugin-transform-explicit-resource-management': specifier: ^7.27.1 version: 7.28.6 @@ -228,7 +47,7 @@ catalogs: version: 3.0.2 '@pnpm/config.nerf-dart': specifier: ^1.0.0 - version: 1.0.1 + version: 1.0.0 '@pnpm/exec': specifier: ^2.0.0 version: 2.0.0 @@ -237,13 +56,10 @@ catalogs: version: 3.0.2 '@pnpm/logger': specifier: '>=1001.0.0 <1002.0.0' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/meta-updater': specifier: 2.0.6 version: 2.0.6 - '@pnpm/network.agent': - specifier: ^2.0.3 - version: 2.0.3 '@pnpm/nopt': specifier: ^0.3.1 version: 0.3.1 @@ -288,7 +104,7 @@ catalogs: version: 5.10.0 '@types/adm-zip': specifier: ^0.5.7 - version: 0.5.8 + version: 0.5.7 '@types/archy': specifier: 0.0.36 version: 0.0.36 @@ -333,7 +149,7 @@ catalogs: version: 4.1.9 '@types/micromatch': specifier: ^4.0.9 - version: 4.0.10 + version: 4.0.9 '@types/node': specifier: ^22.19.15 version: 22.19.15 @@ -420,7 +236,7 @@ catalogs: version: 3.0.3 '@yarnpkg/pnp': specifier: ^4.0.8 - version: 4.1.3 + version: 4.0.8 '@zkochan/cmd-shim': specifier: ^9.0.0 version: 9.0.0 @@ -450,7 +266,7 @@ catalogs: version: 6.0.0 bole: specifier: ^5.0.17 - version: 5.0.28 + version: 5.0.17 boxen: specifier: npm:@zkochan/boxen@5.1.2 version: 5.1.2 @@ -462,7 +278,7 @@ catalogs: version: 9.0.0 camelcase-keys: specifier: ^10.0.1 - version: 10.0.2 + version: 10.0.1 can-link: specifier: ^3.0.0 version: 3.0.0 @@ -471,10 +287,10 @@ catalogs: version: 2.0.0 chalk: specifier: ^5.6.0 - version: 5.6.2 + version: 5.6.0 ci-info: specifier: ^4.3.0 - version: 4.4.0 + version: 4.3.0 cli-truncate: specifier: ^5.2.0 version: 5.2.0 @@ -507,7 +323,7 @@ catalogs: version: 7.0.2 detect-libc: specifier: ^2.0.3 - version: 2.1.2 + version: 2.0.3 didyoumean2: specifier: ^7.0.4 version: 7.0.4 @@ -531,16 +347,16 @@ catalogs: version: 5.0.0 eslint: specifier: ^10.0.3 - version: 10.0.3 + version: 10.1.0 eslint-plugin-import-x: specifier: ^4.16.2 version: 4.16.2 eslint-plugin-jest: specifier: ^29.12.1 - version: 29.15.0 + version: 29.12.1 eslint-plugin-n: specifier: ^17.23.2 - version: 17.24.0 + version: 17.23.2 eslint-plugin-promise: specifier: ^7.2.1 version: 7.2.1 @@ -570,7 +386,7 @@ catalogs: version: 8.0.0 fs-extra: specifier: ^11.3.1 - version: 11.3.4 + version: 11.3.1 fuse-native: specifier: ^2.2.6 version: 2.2.6 @@ -579,7 +395,7 @@ catalogs: version: 2.1.0 get-port: specifier: ^7.1.0 - version: 7.2.0 + version: 7.1.0 ghooks: specifier: 2.0.4 version: 2.0.4 @@ -679,9 +495,6 @@ catalogs: nock: specifier: 13.3.4 version: 13.3.4 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 normalize-newline: specifier: 5.0.0 version: 5.0.0 @@ -711,7 +524,7 @@ catalogs: version: 4.1.0 p-limit: specifier: ^7.1.0 - version: 7.3.0 + version: 7.1.0 p-map-values: specifier: ^0.1.0 version: 0.1.0 @@ -746,11 +559,11 @@ catalogs: specifier: ^5.0.0 version: 5.0.0 pretty-bytes: - specifier: ^7.0.1 + specifier: ^7.1.0 version: 7.1.0 pretty-ms: specifier: ^9.2.0 - version: 9.3.0 + version: 9.2.0 promise-share: specifier: ^2.0.0 version: 2.0.0 @@ -813,10 +626,10 @@ catalogs: version: 2.0.0 sanitize-filename: specifier: ^1.6.3 - version: 1.6.4 + version: 1.6.3 semver: specifier: ^7.7.2 - version: 7.7.4 + version: 7.7.2 semver-range-intersect: specifier: ^0.3.1 version: 0.3.1 @@ -829,6 +642,9 @@ catalogs: shx: specifier: ^0.4.0 version: 0.4.0 + socks: + specifier: ^2.8.1 + version: 2.8.4 sort-keys: specifier: ^6.0.0 version: 6.0.0 @@ -861,7 +677,7 @@ catalogs: version: 7.5.13 tar-stream: specifier: ^3.1.7 - version: 3.1.8 + version: 3.1.7 tempy: specifier: 3.0.0 version: 3.0.0 @@ -870,7 +686,7 @@ catalogs: version: 5.0.0 tinyglobby: specifier: ^0.2.14 - version: 0.2.15 + version: 0.2.14 touch: specifier: 3.1.1 version: 3.1.1 @@ -885,7 +701,10 @@ catalogs: version: 5.9.3 typescript-eslint: specifier: ^8.57.1 - version: 8.57.1 + version: 8.57.2 + undici: + specifier: ^7.2.0 + version: 7.19.2 unified: specifier: ^11.0.5 version: 11.0.5 @@ -906,7 +725,7 @@ catalogs: version: 3.0.1 write-file-atomic: specifier: ^7.0.0 - version: 7.0.1 + version: 7.0.0 write-ini-file: specifier: 5.0.0 version: 5.0.0 @@ -955,6 +774,7 @@ overrides: jws@<3.2.3: ^3.2.3 lodash@>=4.0.0 <=4.17.22: ^4.17.23 minimatch@>=7.0.0 <7.4.7: ^7.4.7 + minimatch@>=9.0.0 <10.0.0: '>=10.2.4' nopt@5: npm:@pnpm/nopt@^0.2.1 on-headers@<1.1.0: '>=1.1.0' path-to-regexp@<0.1.12: ^0.1.12 @@ -1036,16 +856,16 @@ importers: version: 9.7.0 eslint: specifier: 'catalog:' - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.5.1) eslint-plugin-regexp: specifier: 'catalog:' - version: 3.1.0(eslint@10.0.3(jiti@2.6.1)) + version: 3.1.0(eslint@10.1.0(jiti@2.5.1)) husky: specifier: 'catalog:' version: 9.1.7 jest: specifier: 'catalog:' - version: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15) + version: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)) keyv: specifier: 'catalog:' version: 5.6.0 @@ -1102,7 +922,7 @@ importers: version: 3.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 write-json-file: specifier: 'catalog:' version: 7.0.0 @@ -1204,41 +1024,41 @@ importers: dependencies: '@eslint/js': specifier: 'catalog:' - version: 10.0.1(eslint@10.0.3(jiti@2.6.1)) + version: 10.0.1(eslint@10.1.0(jiti@2.5.1)) '@stylistic/eslint-plugin': specifier: 'catalog:' - version: 5.10.0(eslint@10.0.3(jiti@2.6.1)) + version: 5.10.0(eslint@10.1.0(jiti@2.5.1)) eslint: specifier: 'catalog:' - version: 10.0.3(jiti@2.6.1) + version: 10.1.0(jiti@2.5.1) eslint-plugin-import-x: specifier: 'catalog:' - version: 4.16.2(@typescript-eslint/utils@8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.1.0(jiti@2.5.1)) eslint-plugin-n: specifier: 'catalog:' - version: 17.24.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 17.23.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) eslint-plugin-promise: specifier: 'catalog:' - version: 7.2.1(eslint@10.0.3(jiti@2.6.1)) + version: 7.2.1(eslint@10.1.0(jiti@2.5.1)) eslint-plugin-simple-import-sort: specifier: 'catalog:' - version: 12.1.1(eslint@10.0.3(jiti@2.6.1)) + version: 12.1.1(eslint@10.1.0(jiti@2.5.1)) typescript: specifier: 'catalog:' version: 5.9.3 typescript-eslint: specifier: 'catalog:' - version: 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) devDependencies: '@pnpm/eslint-config': specifier: workspace:* version: 'link:' '@typescript-eslint/utils': specifier: 'catalog:' - version: 8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) eslint-plugin-jest: specifier: 'catalog:' - version: 29.15.0(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(jest@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15))(typescript@5.9.3) + version: 29.12.1(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.5.1))(jest@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)))(typescript@5.9.3) __utils__/get-release-text: dependencies: @@ -1266,10 +1086,10 @@ importers: dependencies: '@babel/core': specifier: 'catalog:' - version: 7.29.0 + version: 7.28.3 '@babel/plugin-transform-explicit-resource-management': specifier: 'catalog:' - version: 7.28.6(@babel/core@7.29.0) + version: 7.28.6(@babel/core@7.28.3) '@pnpm/registry-mock': specifier: 'catalog:' version: 5.2.4(verdaccio@6.3.2(encoding@0.1.13)(typanion@3.14.0)) @@ -1278,7 +1098,7 @@ importers: version: link:../../worker get-port: specifier: 'catalog:' - version: 7.2.0 + version: 7.1.0 tree-kill: specifier: 'catalog:' version: 1.2.2 @@ -1355,11 +1175,11 @@ importers: version: 7.5.13 tinyglobby: specifier: 'catalog:' - version: 0.2.15 + version: 0.2.14 devDependencies: '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/scripts': specifier: workspace:* version: 'link:' @@ -1377,7 +1197,7 @@ importers: version: link:../prepare-temp-dir fs-extra: specifier: 'catalog:' - version: 11.3.4 + version: 11.3.1 devDependencies: '@pnpm/test-fixtures': specifier: workspace:* @@ -1496,7 +1316,7 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 symlink-dir: specifier: 'catalog:' version: 10.0.1 @@ -1582,7 +1402,7 @@ importers: version: 2.0.0 tinyglobby: specifier: 'catalog:' - version: 0.2.15 + version: 0.2.14 devDependencies: '@pnpm/bins.resolver': specifier: workspace:* @@ -1649,7 +1469,7 @@ importers: version: link:../../lockfile/walker '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/npm-package-arg': specifier: 'catalog:' version: 2.0.0 @@ -1679,13 +1499,13 @@ importers: version: 7.0.1 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 run-groups: specifier: 'catalog:' version: 5.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/building.after-install': specifier: workspace:* @@ -1743,13 +1563,13 @@ importers: version: link:../../workspace/projects-sorter chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 enquirer: specifier: 'catalog:' version: 2.4.1 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -1927,7 +1747,7 @@ importers: version: 3.0.1 tinyglobby: specifier: 'catalog:' - version: 0.2.15 + version: 0.2.14 devDependencies: '@pnpm/cache.api': specifier: workspace:* @@ -2137,7 +1957,7 @@ importers: version: '@zkochan/boxen@5.1.2' chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 cli-truncate: specifier: 'catalog:' version: 5.2.0 @@ -2149,7 +1969,7 @@ importers: version: 7.1.0 pretty-ms: specifier: 'catalog:' - version: 9.3.0 + version: 9.2.0 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -2158,7 +1978,7 @@ importers: version: 7.8.2 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 stacktracey: specifier: 'catalog:' version: 2.2.0 @@ -2248,7 +2068,7 @@ importers: version: link:../../workspace/project-manifest-reader chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 load-json-file: specifier: 'catalog:' version: 7.0.1 @@ -2381,7 +2201,7 @@ importers: version: link:../../core/types detect-libc: specifier: 'catalog:' - version: 2.1.2 + version: 2.0.3 execa: specifier: 'catalog:' version: safe-execa@0.3.0 @@ -2390,7 +2210,7 @@ importers: version: 10.2.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -2459,7 +2279,7 @@ importers: version: link:../../hooks/pnpmfile '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/network.git-utils': specifier: workspace:* version: link:../../network/git-utils @@ -2486,13 +2306,13 @@ importers: version: 9.0.0 camelcase-keys: specifier: 'catalog:' - version: 10.0.2 + version: 10.0.1 can-write-to-dir: specifier: 'catalog:' version: 2.0.0 ci-info: specifier: 'catalog:' - version: 4.4.0 + version: 4.3.0 is-subdir: specifier: 'catalog:' version: 2.0.0 @@ -2522,7 +2342,7 @@ importers: version: 2.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 which: specifier: 'catalog:' version: '@pnpm/which@3.0.1' @@ -2574,7 +2394,7 @@ importers: version: link:../../core/types semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/config.version-policy': specifier: workspace:* @@ -2629,7 +2449,7 @@ importers: dependencies: bole: specifier: 'catalog:' - version: 5.0.28 + version: 5.0.17 split2: specifier: 'catalog:' version: 4.2.0 @@ -2667,7 +2487,7 @@ importers: version: 3.1.4 tar-stream: specifier: 'catalog:' - version: 3.1.8 + version: 3.1.7 crypto/integrity: dependencies: @@ -2762,12 +2582,12 @@ importers: '@pnpm/test-fixtures': specifier: workspace:* version: link:../../../__utils__/test-fixtures + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: link:../../../testing/mock-agent '@types/ramda': specifier: 'catalog:' version: 0.31.1 - nock: - specifier: 'catalog:' - version: 13.3.4 deps/compliance/commands: dependencies: @@ -2836,7 +2656,7 @@ importers: version: 2.0.1 chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 memoize: specifier: 'catalog:' version: 10.2.0 @@ -2848,7 +2668,7 @@ importers: version: 2.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/deps.compliance.commands': specifier: workspace:* @@ -2865,6 +2685,9 @@ importers: '@pnpm/test-fixtures': specifier: workspace:* version: link:../../../__utils__/test-fixtures + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: link:../../../testing/mock-agent '@pnpm/workspace.projects-filter': specifier: workspace:* version: link:../../../workspace/projects-filter @@ -2930,7 +2753,7 @@ importers: version: link:../../../core/types p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 path-absolute: specifier: 'catalog:' version: 2.0.0 @@ -2939,7 +2762,7 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -2991,7 +2814,7 @@ importers: version: link:../../../core/types p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 ssri: specifier: 'catalog:' version: 13.0.1 @@ -3147,7 +2970,7 @@ importers: version: link:../../../lockfile/fs '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/network.auth-header': specifier: workspace:* version: link:../../../network/auth-header @@ -3177,7 +3000,7 @@ importers: version: 2.0.1 chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -3250,10 +3073,10 @@ importers: version: link:../../../workspace/project-manifest-reader chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -3323,7 +3146,7 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -3369,7 +3192,7 @@ importers: version: link:../../../core/types semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 semver-range-intersect: specifier: 'catalog:' version: 0.3.1 @@ -3442,7 +3265,7 @@ importers: version: 3.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/constants': specifier: workspace:* @@ -3470,7 +3293,7 @@ importers: version: link:../../core/types semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/deps.path': specifier: workspace:* @@ -3483,7 +3306,7 @@ importers: dependencies: semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/deps.peer-range': specifier: workspace:* @@ -3523,7 +3346,7 @@ importers: version: link:../../lockfile/verification '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/resolving.resolver-base': specifier: workspace:* version: link:../../resolving/resolver-base @@ -3629,7 +3452,7 @@ importers: version: 2.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 symlink-dir: specifier: 'catalog:' version: 10.0.1 @@ -3649,6 +3472,9 @@ importers: '@pnpm/shell.path': specifier: workspace:* version: link:../../../shell/path + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: link:../../../testing/mock-agent '@types/cross-spawn': specifier: 'catalog:' version: 6.0.6 @@ -3661,9 +3487,6 @@ importers: cross-spawn: specifier: 'catalog:' version: 7.0.6 - nock: - specifier: 'catalog:' - version: 13.3.4 engine/runtime/bun-resolver: dependencies: @@ -3699,7 +3522,7 @@ importers: version: link:../../../worker semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/engine.runtime.bun-resolver': specifier: workspace:* @@ -3779,7 +3602,7 @@ importers: version: link:../../../worker semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/engine.runtime.deno-resolver': specifier: workspace:* @@ -3810,7 +3633,7 @@ importers: version: link:../../../core/types semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 version-selector-type: specifier: 'catalog:' version: 3.0.0 @@ -3938,7 +3761,7 @@ importers: version: safe-execa@0.3.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -4029,7 +3852,7 @@ importers: version: link:../../core/types chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 is-windows: specifier: 'catalog:' version: 1.0.2 @@ -4181,7 +4004,7 @@ importers: version: 'link:' '@types/adm-zip': specifier: 'catalog:' - version: 0.5.8 + version: 0.5.7 '@types/ssri': specifier: 'catalog:' version: 7.1.5 @@ -4339,12 +4162,12 @@ importers: '@pnpm/test-fixtures': specifier: workspace:* version: link:../../__utils__/test-fixtures - nock: - specifier: 'catalog:' - version: 13.3.4 tempy: specifier: 'catalog:' version: 3.0.0 + undici: + specifier: 'catalog:' + version: 7.19.2 fetching/tarball-fetcher: dependencies: @@ -4427,24 +4250,21 @@ importers: '@types/ssri': specifier: 'catalog:' version: 7.1.5 - nock: - specifier: 'catalog:' - version: 13.3.4 ssri: specifier: 'catalog:' version: 13.0.1 tempy: specifier: 'catalog:' version: 3.0.0 + undici: + specifier: 'catalog:' + version: 7.19.2 fetching/types: dependencies: '@zkochan/retry': specifier: 'catalog:' version: 0.2.0 - node-fetch: - specifier: 'catalog:' - version: 3.3.2 devDependencies: '@pnpm/fetching.types': specifier: workspace:* @@ -4504,13 +4324,13 @@ importers: version: 4.0.0 fs-extra: specifier: 'catalog:' - version: 11.3.4 + version: 11.3.1 make-empty-dir: specifier: 'catalog:' version: 4.0.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 path-temp: specifier: 'catalog:' version: 3.0.0 @@ -4519,7 +4339,7 @@ importers: version: 7.0.1 sanitize-filename: specifier: 'catalog:' - version: 1.6.4 + version: 1.6.3 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -4690,7 +4510,7 @@ importers: version: link:../../core/types chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 path-absolute: specifier: 'catalog:' version: 2.0.0 @@ -4739,7 +4559,7 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -4982,7 +4802,7 @@ importers: version: 2.0.1 chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 enquirer: specifier: 'catalog:' version: 2.4.1 @@ -5003,7 +4823,7 @@ importers: version: 4.1.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -5047,6 +4867,9 @@ importers: '@pnpm/test-ipc-server': specifier: workspace:* version: link:../../__utils__/test-ipc-server + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: link:../../testing/mock-agent '@pnpm/worker': specifier: workspace:* version: link:../../worker @@ -5070,16 +4893,13 @@ importers: version: '@types/table@6.0.0' ci-info: specifier: 'catalog:' - version: 4.4.0 + version: 4.3.0 delay: specifier: 'catalog:' version: 7.0.0 jest-diff: specifier: 'catalog:' version: 30.3.0 - nock: - specifier: 'catalog:' - version: 13.3.4 path-name: specifier: 'catalog:' version: 1.0.0 @@ -5177,7 +4997,7 @@ importers: version: link:../../../text/tree-renderer chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 devDependencies: '@pnpm/installing.dedupe.issues-renderer': specifier: workspace:* @@ -5367,7 +5187,7 @@ importers: version: 4.1.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 path-exists: specifier: 'catalog:' version: 5.0.0 @@ -5379,7 +5199,7 @@ importers: version: 5.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -5426,6 +5246,9 @@ importers: '@pnpm/test-ipc-server': specifier: workspace:* version: link:../../__utils__/test-ipc-server + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: link:../../testing/mock-agent '@pnpm/testing.temp-store': specifier: workspace:* version: link:../../testing/temp-store @@ -5449,7 +5272,7 @@ importers: version: 4.5.0(typanion@3.14.0) ci-info: specifier: 'catalog:' - version: 4.4.0 + version: 4.3.0 deep-require-cwd: specifier: 'catalog:' version: 1.0.0 @@ -5599,7 +5422,7 @@ importers: version: 2.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 semver-range-intersect: specifier: 'catalog:' version: 0.3.1 @@ -5714,7 +5537,7 @@ importers: version: 4.0.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 path-absolute: specifier: 'catalog:' version: 2.0.0 @@ -5832,7 +5655,7 @@ importers: version: link:../../lockfile/utils '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/network.auth-header': specifier: workspace:* version: link:../../network/auth-header @@ -6114,7 +5937,7 @@ importers: version: link:../../worker detect-libc: specifier: 'catalog:' - version: 2.1.2 + version: 2.0.3 load-json-file: specifier: 'catalog:' version: 7.0.1 @@ -6123,7 +5946,7 @@ importers: version: 4.0.1 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 p-queue: specifier: 'catalog:' version: 9.1.0 @@ -6135,7 +5958,7 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 ssri: specifier: 'catalog:' version: 13.0.1 @@ -6164,6 +5987,9 @@ importers: '@pnpm/test-fixtures': specifier: workspace:* version: link:../../__utils__/test-fixtures + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: link:../../testing/mock-agent '@types/normalize-path': specifier: 'catalog:' version: 3.0.2 @@ -6179,9 +6005,6 @@ importers: delay: specifier: 'catalog:' version: 7.0.0 - nock: - specifier: 'catalog:' - version: 13.3.4 normalize-path: specifier: 'catalog:' version: 3.0.0 @@ -6277,7 +6100,7 @@ importers: version: 0.31.1 detect-libc: specifier: 'catalog:' - version: 2.1.2 + version: 2.0.3 tempy: specifier: 'catalog:' version: 3.0.0 @@ -6334,13 +6157,13 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 strip-bom: specifier: 'catalog:' version: 5.0.0 write-file-atomic: specifier: 'catalog:' - version: 7.0.1 + version: 7.0.0 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -6441,7 +6264,7 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/lockfile.merger': specifier: workspace:* @@ -6553,7 +6376,7 @@ importers: version: link:../../core/types '@yarnpkg/pnp': specifier: 'catalog:' - version: 4.1.3 + version: 4.0.8 normalize-path: specifier: 'catalog:' version: 3.0.0 @@ -6673,7 +6496,7 @@ importers: version: '@pnpm/ramda@0.28.1' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 version-selector-type: specifier: 'catalog:' version: 3.0.0 @@ -6701,7 +6524,7 @@ importers: version: 3.1.4 tar-stream: specifier: 'catalog:' - version: 3.1.8 + version: 3.1.7 lockfile/walker: dependencies: @@ -6782,7 +6605,7 @@ importers: dependencies: '@pnpm/config.nerf-dart': specifier: 'catalog:' - version: 1.0.1 + version: 1.0.0 '@pnpm/error': specifier: workspace:* version: link:../../core/error @@ -6796,24 +6619,33 @@ importers: network/fetch: dependencies: + '@pnpm/config.nerf-dart': + specifier: 'catalog:' + version: 1.0.0 '@pnpm/core-loggers': specifier: workspace:* version: link:../../core/core-loggers + '@pnpm/error': + specifier: workspace:* + version: link:../../core/error '@pnpm/fetching.types': specifier: workspace:* version: link:../../fetching/types - '@pnpm/network.agent': - specifier: 'catalog:' - version: 2.0.3 '@pnpm/types': specifier: workspace:* version: link:../../core/types '@zkochan/retry': specifier: 'catalog:' version: 0.2.0 - node-fetch: + lru-cache: specifier: 'catalog:' - version: 3.3.2 + version: 11.2.7 + socks: + specifier: 'catalog:' + version: 2.8.4 + undici: + specifier: 'catalog:' + version: 7.19.2 devDependencies: '@pnpm/logger': specifier: workspace:* @@ -6824,9 +6656,6 @@ importers: https-proxy-server-express: specifier: 'catalog:' version: 0.1.2 - nock: - specifier: 'catalog:' - version: 13.3.4 network/git-utils: dependencies: @@ -6972,7 +6801,7 @@ importers: version: link:../../workspace/workspace-manifest-reader chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 enquirer: specifier: 'catalog:' version: 2.4.1 @@ -7002,13 +6831,13 @@ importers: version: 0.3.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 terminal-link: specifier: 'catalog:' version: 5.0.0 tinyglobby: specifier: 'catalog:' - version: 0.2.15 + version: 0.2.14 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -7060,13 +6889,13 @@ importers: version: link:../../core/error '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/patching.types': specifier: workspace:* version: link:../types semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/patching.config': specifier: workspace:* @@ -7119,7 +6948,7 @@ importers: version: link:../../core/types semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/logger': specifier: workspace:* @@ -7352,10 +7181,10 @@ importers: version: 4.0.0 chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 ci-info: specifier: 'catalog:' - version: 4.4.0 + version: 4.3.0 cross-spawn: specifier: 'catalog:' version: 7.0.6 @@ -7379,7 +7208,7 @@ importers: version: 2.0.0 get-port: specifier: 'catalog:' - version: 7.2.0 + version: 7.1.0 ini: specifier: 'catalog:' version: 6.0.0 @@ -7427,7 +7256,7 @@ importers: version: 2.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 split-cmd: specifier: 'catalog:' version: 1.1.0 @@ -7631,10 +7460,10 @@ importers: version: 4.0.0 chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 ci-info: specifier: 'catalog:' - version: 4.4.0 + version: 4.3.0 enquirer: specifier: 'catalog:' version: 2.4.1 @@ -7655,7 +7484,7 @@ importers: version: 4.1.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -7667,16 +7496,16 @@ importers: version: 2.0.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 tar-stream: specifier: 'catalog:' - version: 3.1.8 + version: 3.1.7 tempy: specifier: 'catalog:' version: 3.0.0 tinyglobby: specifier: 'catalog:' - version: 0.2.15 + version: 0.2.14 validate-npm-package-name: specifier: 'catalog:' version: 7.0.2 @@ -7872,9 +7701,6 @@ importers: '@pnpm/store.cafs-types': specifier: workspace:* version: link:../../store/cafs-types - node-fetch: - specifier: 'catalog:' - version: 3.3.2 resolving/git-resolver: dependencies: @@ -7895,14 +7721,11 @@ importers: version: '@pnpm/hosted-git-info@1.0.0' semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@jest/globals': specifier: 'catalog:' version: 30.3.0 - '@pnpm/network.agent': - specifier: 'catalog:' - version: 2.0.3 '@pnpm/resolving.git-resolver': specifier: workspace:* version: 'link:' @@ -8030,7 +7853,7 @@ importers: version: 3.0.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 p-memoize: specifier: 'catalog:' version: 8.0.0 @@ -8048,7 +7871,7 @@ importers: version: 7.0.1 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 semver-utils: specifier: 'catalog:' version: 1.1.4 @@ -8074,6 +7897,9 @@ importers: '@pnpm/test-fixtures': specifier: workspace:* version: link:../../__utils__/test-fixtures + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: link:../../testing/mock-agent '@types/normalize-path': specifier: 'catalog:' version: 3.0.2 @@ -8089,9 +7915,6 @@ importers: load-json-file: specifier: 'catalog:' version: 7.0.1 - nock: - specifier: 'catalog:' - version: 13.3.4 tempy: specifier: 'catalog:' version: 3.0.0 @@ -8116,7 +7939,7 @@ importers: version: link:../types semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/logger': specifier: workspace:* @@ -8202,13 +8025,13 @@ importers: version: 2.0.0 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 rename-overwrite: specifier: 'catalog:' version: 7.0.1 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 strip-bom: specifier: 'catalog:' version: 5.0.0 @@ -8320,7 +8143,7 @@ importers: version: 1.0.0 chalk: specifier: 'catalog:' - version: 5.6.2 + version: 5.6.0 dint: specifier: 'catalog:' version: 5.1.0 @@ -8648,6 +8471,19 @@ importers: specifier: workspace:* version: 'link:' + testing/mock-agent: + dependencies: + '@pnpm/network.fetch': + specifier: workspace:* + version: link:../../network/fetch + undici: + specifier: 'catalog:' + version: 7.19.2 + devDependencies: + '@pnpm/testing.mock-agent': + specifier: workspace:* + version: 'link:' + testing/temp-store: dependencies: '@pnpm/installing.client': @@ -8726,16 +8562,16 @@ importers: version: link:../store/index '@rushstack/worker-pool': specifier: 'catalog:' - version: 0.7.7(@types/node@25.5.0) + version: 0.7.7(@types/node@22.19.15) is-windows: specifier: 'catalog:' version: 1.0.2 p-limit: specifier: 'catalog:' - version: 7.3.0 + version: 7.1.0 semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/logger': specifier: workspace:* @@ -8778,7 +8614,7 @@ importers: version: link:../project-manifest-writer camelcase-keys: specifier: 'catalog:' - version: 10.0.2 + version: 10.0.1 ramda: specifier: 'catalog:' version: '@pnpm/ramda@0.28.1' @@ -8858,7 +8694,7 @@ importers: version: link:../../fs/graceful-fs '@pnpm/logger': specifier: 'catalog:' - version: 1001.0.1 + version: 1001.0.0 '@pnpm/pkg-manifest.utils': specifier: workspace:* version: link:../../pkg-manifest/utils @@ -8922,7 +8758,7 @@ importers: version: 2.2.3 write-file-atomic: specifier: 'catalog:' - version: 7.0.1 + version: 7.0.0 write-yaml-file: specifier: 'catalog:' version: 6.0.0 @@ -8981,7 +8817,7 @@ importers: version: 1.0.2 '@types/micromatch': specifier: 'catalog:' - version: 4.0.10 + version: 4.0.9 '@types/ramda': specifier: 'catalog:' version: 0.31.1 @@ -8990,7 +8826,7 @@ importers: version: 3.1.5 ci-info: specifier: 'catalog:' - version: 4.4.0 + version: 4.3.0 is-windows: specifier: 'catalog:' version: 1.0.2 @@ -9051,7 +8887,7 @@ importers: version: 4.1.0 tinyglobby: specifier: 'catalog:' - version: 0.2.15 + version: 0.2.14 devDependencies: '@jest/globals': specifier: 'catalog:' @@ -9083,7 +8919,7 @@ importers: dependencies: semver: specifier: 'catalog:' - version: 7.7.4 + version: 7.7.2 devDependencies: '@pnpm/workspace.range-resolver': specifier: workspace:* @@ -9192,7 +9028,7 @@ importers: version: '@pnpm/ramda@0.28.1' write-file-atomic: specifier: 'catalog:' - version: 7.0.1 + version: 7.0.0 yaml: specifier: 'catalog:' version: 2.8.3 @@ -9234,43 +9070,59 @@ importers: packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@arcanis/slice-ansi@1.1.1': resolution: {integrity: sha512-xguP2WR2Dv0gQ7Ykbdb7BNCnPnIPB94uTi0Z2NvkRBEnhbwjOQ7QyQKJXrVQg4qDpiD9hA5l5cCwy/z2OXgc3w==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} @@ -9279,6 +9131,10 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -9287,10 +9143,17 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + peerDependencies: + '@babel/types': '*' + '@babel/parser@7.29.2': resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} @@ -9319,8 +9182,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -9335,8 +9198,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -9383,8 +9246,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -9401,18 +9264,30 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -9640,8 +9515,8 @@ packages: '@cspell/dict-docker@1.1.17': resolution: {integrity: sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==} - '@cspell/dict-dotnet@5.0.12': - resolution: {integrity: sha512-FiV934kNieIjGTkiApu/WKvLYi/KBpvfWB2TSqpDQtmXZlt3uSa5blwblO1ZC8OvjH8RCq/31H5IdEYmTaZS7A==} + '@cspell/dict-dotnet@5.0.13': + resolution: {integrity: sha512-xPp7jMnFpOri7tzmqmm/dXMolXz1t2bhNqxYkOyMqXhvs08oc7BFs+EsbDY0X7hqiISgeFZGNqn0dOCr+ncPYw==} '@cspell/dict-elixir@4.0.8': resolution: {integrity: sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==} @@ -9661,8 +9536,8 @@ packages: '@cspell/dict-flutter@1.1.1': resolution: {integrity: sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==} - '@cspell/dict-fonts@4.0.6': - resolution: {integrity: sha512-aR/0csY01dNb0A1tw/UmN9rKgHruUxsYsvXu6YlSBJFu60s26SKr/k1o4LavpHTQ+lznlYMqAvuxGkE4Flliqw==} + '@cspell/dict-fonts@4.0.5': + resolution: {integrity: sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==} '@cspell/dict-fsharp@1.1.1': resolution: {integrity: sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==} @@ -9738,8 +9613,8 @@ packages: '@cspell/dict-powershell@5.0.15': resolution: {integrity: sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==} - '@cspell/dict-public-licenses@2.0.16': - resolution: {integrity: sha512-EQRrPvEOmwhwWezV+W7LjXbIBjiy6y/shrET6Qcpnk3XANTzfvWflf9PnJ5kId/oKWvihFy0za0AV1JHd03pSQ==} + '@cspell/dict-public-licenses@2.0.15': + resolution: {integrity: sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==} '@cspell/dict-python@4.2.26': resolution: {integrity: sha512-hbjN6BjlSgZOG2dA2DtvYNGBM5Aq0i0dHaZjMOI9K/9vRicVvKbcCiBSSrR3b+jwjhQL5ff7HwG5xFaaci0GQA==} @@ -9759,8 +9634,8 @@ packages: '@cspell/dict-shell@1.1.2': resolution: {integrity: sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==} - '@cspell/dict-software-terms@5.2.1': - resolution: {integrity: sha512-a25D44ZcccvimNbUgpY94UnqRT46e2PjFf4dgxKXHoMCEcH0NqI4682k4PYsT1AmWMGn7EAA8tS2tN5yxhkm5g==} + '@cspell/dict-software-terms@5.2.2': + resolution: {integrity: sha512-0CaYd6TAsKtEoA7tNswm1iptEblTzEe3UG8beG2cpSTHk7afWIVMtJLgXDv0f/Li67Lf3Z1Jf3JeXR7GsJ2TRw==} '@cspell/dict-sql@2.2.1': resolution: {integrity: sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==} @@ -9803,6 +9678,10 @@ packages: resolution: {integrity: sha512-ZaaBr0pTvNxmyUbIn+nVPXPr383VqJzfUDMWicgTjJIeo2+T2hOq2kNpgpvTIrWtZrsZnSP8oXms1+sKTjcvkw==} engines: {node: '>=20'} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@cyclonedx/cyclonedx-library@10.0.0': resolution: {integrity: sha512-xDXf2eqzeFHdjamj6oBV3duRSfrlmsJ5+2z9tXp7q5qxJP5Awmjf4ABSutS4qkVHHj7JzKFL/EM0V0Nihc7zPg==} engines: {node: '>=20.18.0'} @@ -9834,14 +9713,14 @@ packages: resolution: {integrity: sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==} engines: {node: '>= 6'} - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -10002,6 +9881,12 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10074,13 +9959,13 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} - '@isaacs/cliui@9.0.0': - resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} - engines: {node: '>=18'} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} @@ -10107,6 +9992,10 @@ packages: node-notifier: optional: true + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.3.0': resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -10115,6 +10004,10 @@ packages: resolution: {integrity: sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.0.5': + resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.3.0': resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -10127,6 +10020,10 @@ packages: resolution: {integrity: sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.0.1': + resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.1.0': resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -10180,6 +10077,10 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@30.0.5': + resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.3.0': resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -10187,9 +10088,6 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -10197,8 +10095,11 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} @@ -10310,45 +10211,45 @@ packages: resolution: {integrity: sha512-61tmh+k7hnKK6b2XbF4GvxmiaF3l2a+xQlZyeoOGBs7mXU3Ie8iCAeAnM0+r70KiqTrgWvBCjMeM+W3JarJqaQ==} engines: {node: '>=12.17'} - '@pnpm/cafs-types@1000.1.0': - resolution: {integrity: sha512-uUAnheFdWz+rwgDSr0MO8LH0M27j/ocj+KVXlGmmaAHyMKqIMRnuQZdAciAW7/Cb29WOfmPFm+U/aRtBjysE9g==} + '@pnpm/cafs-types@1000.0.0': + resolution: {integrity: sha512-BN7y+f4JHsixxq5uX1HYb791/CRJrIkGnH4EKN/vTgLWG7QyBzplyE8+gh1SfPGrcdefU10G+B1zMOkOiN/iwA==} engines: {node: '>=18.12'} - '@pnpm/catalogs.config@1000.0.6': - resolution: {integrity: sha512-B/ZQj/pzHFgzkTKbP/8klI03bfimk0QdcG/fq7gQPqo2ExmbGeXEre4skZGyguhjp03xLr5/a4GNYSrLUsUUUQ==} + '@pnpm/catalogs.config@1000.0.2': + resolution: {integrity: sha512-2GCYZwxmgw6w0bpB71VbbXapgIcSSFOF9vnS+YLyTdy8JaIYoag2XkhXP1cMu24THPRXeo/zKTyziEsqgr1u8w==} engines: {node: '>=18.12'} '@pnpm/catalogs.types@1000.0.0': resolution: {integrity: sha512-xRf72lk7xHNvbenA4sp4Of/90QDdRW0CRYT+V+EbqpUXu1xsXtedHai34cTU6VGe7C1hUukxxE9eYTtIpYrx5g==} engines: {node: '>=18.12'} - '@pnpm/cli-meta@1000.0.16': - resolution: {integrity: sha512-qD1hvOZktx7zs9L5J/4tkMNoaLJ3PqSLDH/nXzpS0DtNa/Ok7/evsncM2pr6IFto566fZ02Oumdy9IdiR7r7EQ==} + '@pnpm/cli-meta@1000.0.8': + resolution: {integrity: sha512-THA7cPwxqPAu07pgvvTLhM1AXdYE9+ZCWjT68abQZGL1cpOll9wHChDaB5TLlTkRkbvFzLC9ABr3x/F7873/rg==} engines: {node: '>=18.12'} - '@pnpm/cli-utils@1001.3.10': - resolution: {integrity: sha512-MFH7d8Ims9LVnZVzeBG+lkcejxZsi1EBicUNhBvLjbl3qXlL76mOzbI7jKUofenhev8tv2YRn2p71jS8bAj0EA==} + '@pnpm/cli-utils@1000.1.5': + resolution: {integrity: sha512-vQiPYyw8RnG/rmbHMC/ajFcHshMTj4Hf6JNmGHizkMdD1EWEWi7G7FoXRGStfHm6hD8HUTtCPZ4o4ceES92q6w==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/client@1001.1.24': - resolution: {integrity: sha512-2UNrokmnXaD2dxQ4R0VzWJ4NjfTgJnIW2BhE7QLB5rgo/hyO5EUiZkDdCgJoxa38S0QxHJDKRRHHCkO/Pa+Etg==} + '@pnpm/client@1000.0.19': + resolution: {integrity: sha512-A0VzV3yu5dpiqWhFk0sfQRxLsXu5bFFGwjGqw+dhJJjSojxKlbX2D2SP/C14pRvzOcvNkg0LQgVMNjo2/Bss8g==} engines: {node: '>=18.12'} '@pnpm/colorize-semver-diff@1.0.1': resolution: {integrity: sha512-qP4E7mzmCBhB4so6szszeIdVDrcKGTTCxBazCKoiPUG34xLha6r57zJuFBkTmD65i3TB7++lf3BwpQruUwf/BQ==} engines: {node: '>=10'} - '@pnpm/config.config-writer@1000.1.3': - resolution: {integrity: sha512-9W82H0iHWDDX6Jx6gk+4dghOzwcN6NLKh53lxN0n23dMnJyXreHWPAEQ2i0j2w3oSKJcg5GfdoyvuNn2YQvC0w==} + '@pnpm/config.config-writer@1000.0.5': + resolution: {integrity: sha512-uog9yw8uINEa1d1pVZLhLUZ2Ufcx5wM3YfIF2ZhOwFS5qXUQszchGKUcc6GjwFLoD99g8RpIgGr+tc7JeNplDw==} engines: {node: '>=18.12'} - '@pnpm/config.deps-installer@1000.1.5': - resolution: {integrity: sha512-FmEpqmjWPCPbJuMNyeGmaFFyZ6uOBbvtbrFVxxckbvTIi6qLRHiAqNq+tOEbcFWX6U3bLioFkP9/DBqBxJNHEQ==} + '@pnpm/config.deps-installer@1000.0.5': + resolution: {integrity: sha512-DIpPEosqTHWjunQ9ZG+2v/J2L5b3Lq387MMVQCntRH0FYByDzJc6O6ue0IwvAqGRJZ5tQAuXQaQXbIod4Hz5Qw==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} @@ -10358,197 +10259,201 @@ packages: resolution: {integrity: sha512-GD6nKLyKF+ev15Tj3pS8y6cTVPIuAqTyhPrUFMfmodFvhEDdYKN/gdGimkc9GJLfHVC/SuCVFg49YNJyoW7niA==} engines: {node: '>=18.12'} + '@pnpm/config.nerf-dart@1.0.0': + resolution: {integrity: sha512-/jnjwmeLVEXzfk+za2qJams03KtFe4C5s2fT623SZ6UxhYqzHd+Zin/NzrCFY1/IHMHMP1ScFDDgAd36GrKxEA==} + engines: {node: '>=18.12'} + '@pnpm/config.nerf-dart@1.0.1': resolution: {integrity: sha512-03d2l21gAyzGVr9SR6rS5pvCTnZ4HaNdi8jB2Y/UGvszzrNbA+AJVObVw6SulNQ1Eah3SHB9wCezJwtP+jYIcA==} engines: {node: '>=18.12'} - '@pnpm/config@1004.11.0': - resolution: {integrity: sha512-NuiUOC00Vjfy7oAbj2xBKwlTJysXVLjuT0FoCYtrvhf1z62xKZOWY+uSHUtvjdx7G73JDoShEAYd0tDLxvg1WQ==} + '@pnpm/config@1003.1.1': + resolution: {integrity: sha512-2b5IvGW49hnp2DyZENOYfvC8xOTfRDYVFvCsXNSxb3Q85Uxp9jC5EgWLlnD0YzSh7iv/DrGOqJSA8CHw1Yt36A==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' + + '@pnpm/constants@1001.1.0': + resolution: {integrity: sha512-xb9dfSGi1qfUKY3r4Zy9JdC9+ZeaDxwfE7HrrGIEsBVY1hvIn6ntbR7A97z3nk44yX7vwbINNf9sizTp0WEtEw==} + engines: {node: '>=18.12'} '@pnpm/constants@1001.3.1': resolution: {integrity: sha512-2hf0s4pVrVEH8RvdJJ7YRKjQdiG8m0iAT26TTqXnCbK30kKwJW69VLmP5tED5zstmDRXcOeH5eRcrpkdwczQ9g==} engines: {node: '>=18.12'} - '@pnpm/core-loggers@1001.0.9': - resolution: {integrity: sha512-pW58m3ssrwVjwhlmTXDW1dh1sv2y6R2Gl5YvQInjM2d01/5mre/sYAY4MK3XfgEShZJQxv6wVXDUvyHHJ0oizg==} + '@pnpm/core-loggers@1001.0.1': + resolution: {integrity: sha512-U/hqSHo6AJJqBkTvtGbSMcmutINNTfARXqtw9c9PrIwqYbUZPJZAX+c2NNTLzKtv6ywxb8hcC1MKc+PpACPSng==} engines: {node: '>=18.12'} peerDependencies: '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/create-cafs-store@1000.0.33': - resolution: {integrity: sha512-ynUDVwsvZRzfmxqZ0I6bht/CZ3WMRkwWr5jOBjsUVwyuQSvj3mbse5XZXbWRM6ox2WpybMVd7unoBdOQqlvTPQ==} + '@pnpm/create-cafs-store@1000.0.14': + resolution: {integrity: sha512-95OczT9/zsJea3Nm6x9ovUD04GoLKYHnSCKUhe5VFx7ckUxW8DUrFJynl94Tx+kdf7u7zXBIlwhhHJEplDaNTg==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/crypto.hash@1000.2.2': - resolution: {integrity: sha512-W8pLZvXWLlGG5p0Z2nCvtBhlM6uuTcbAbsS15wlGS31jBBJKJW2udLoFeM7qfWPo7E2PqRPGxca7APpVYAjJhw==} + '@pnpm/crypto.hash@1000.1.1': + resolution: {integrity: sha512-lb5kwXaOXdIW/4bkLLmtM9HEVRvp2eIvp+TrdawcPoaptgA/5f0/sRG0P52BF8dFqeNDj+1tGdqH89WQEqJnxA==} engines: {node: '>=18.12'} '@pnpm/crypto.polyfill@1000.1.0': resolution: {integrity: sha512-tNe7a6U4rCpxLMBaR0SIYTdjxGdL0Vwb3G1zY8++sPtHSvy7qd54u8CIB0Z+Y6t5tc9pNYMYCMwhE/wdSY7ltg==} engines: {node: '>=18.12'} - '@pnpm/crypto.shasums-file@1001.0.5': - resolution: {integrity: sha512-BceW75ux76vvfCxXTdLe1aXH/RVgUdjwwOjqV5dmx90p+y6iM/XlfrNa5HV8SfitRYfCsuwE6qe3/mtF5jMmfA==} - engines: {node: '>=18.12'} - - '@pnpm/dedupe.issues-renderer@1000.0.2': - resolution: {integrity: sha512-F1bQ/PR5TSEuq+1bwx9IgZ/9LbP7rrTYZ7uCUof9ecoxouT7R48F3UAlxHU5mxg6XGj8Ggm9H271d4YWgEYpbQ==} + '@pnpm/dedupe.issues-renderer@1000.0.1': + resolution: {integrity: sha512-zrCfk0HUQM8WhxCi3C0waGDKO0/gB4r3LgAUOQB4YTHPNr+m+iubznY0I5G776OqJfsPeLi4bByg4Y1wK29xlg==} engines: {node: '>=18.12'} '@pnpm/dedupe.types@1000.0.0': resolution: {integrity: sha512-+d8Q576BxRZgt03O+JZXK3C1xVJeAr4Hs35Y8SCl01KpQ0Z7xzfJWahpee7iFc5jELiwjCQg2sISTwtZZQFltA==} engines: {node: '>=18.12'} - '@pnpm/default-reporter@1002.1.14': - resolution: {integrity: sha512-HL6MdS73TwSOsSqS6fPId/IUHZICjyjso52wcmiJq40g2wh8R92GJTVEWmW6xP8aY0DhOD8o0a1AHo8qwV62bA==} + '@pnpm/default-reporter@1002.0.1': + resolution: {integrity: sha512-d0P2Issm09xMkv2RsQROBk3XDo/Bgq1cMECaufuwdPjJ+tAzV/kQx2weG+FU0XXaKs/7bpfliqUatuiWlTDxQg==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/default-resolver@1002.3.8': - resolution: {integrity: sha512-x911/z7RAh6KFWO0kDmkJ+rgZNozbnVrZWoRbYAF/CH27a00L5CaQokGcPCqFqBPFKSJVvrhlMkuQx5MwuFNvw==} + '@pnpm/default-resolver@1002.0.2': + resolution: {integrity: sha512-BRXKcPqjdWWxCKlNFiWFnZkGx43hgJAmRG5t6Iz7MwSCuAeU5Hw+BoHzxkrl5voT1oeImfYK+waLV7sfiwH66w==} engines: {node: '>=18.12'} - '@pnpm/dependency-path@1001.1.10': - resolution: {integrity: sha512-PNImtV2SmNTDpLi4HdN86tJPmsOeIxm4VhmxgBVsMrJPEBfkNEWFcflR3wU6XVn/26g9qWdvlNHaawtCjeB93Q==} + '@pnpm/dependency-path@1000.0.9': + resolution: {integrity: sha512-0AhabApfiq3EEYeed5HKQEU3ftkrfyKTNgkMH9esGdp2yc+62Zu7eWFf8WW6IGyitDQPLWGYjSEWDC9Bvv8nPg==} engines: {node: '>=18.12'} - '@pnpm/directory-fetcher@1000.1.24': - resolution: {integrity: sha512-Hoidyge60IF+e4axLHIzfeN7DAF1Upl/Xs4/TNVg5bby5oUHvy7yxvltT2wn1utMO/Lx1EqHoBAzERZhtatH6g==} + '@pnpm/directory-fetcher@1000.1.7': + resolution: {integrity: sha512-AhiM0erNT+a/UM/LkXVlP8yPaWFNOeJsKh0CDdCEVoCSGFY0wYwSoukbyKFd2Sdox1PX/WvW/zm8A+2bDPB7Kw==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/env.system-node-version@1000.0.16': - resolution: {integrity: sha512-p6hTn72yrpx54aNktEea2105/GSrNdPLcS35jWmw87gUFdG6iY1XDO0+wKmg44p4aH5GUJy6aMI7lvq0OLNi8g==} + '@pnpm/env.system-node-version@1000.0.8': + resolution: {integrity: sha512-vK1qrDrY+Y9FPAY3hDNbCK2wUdQHQRaM359Zlpr6BaUvb7WlHYHEbvpom7rEwKbNZQ6uPUcFbSIAiX+PCeF+SA==} engines: {node: '>=18.12'} - '@pnpm/error@1000.1.0': - resolution: {integrity: sha512-Dqc2IJJPjUatwc9Letw+vG29rnaMrDGi5g6WCx1HiZYm0obXbTmLygeRafMbgf+sLKXrWE1shOeiayQuczBdoA==} + '@pnpm/error@1000.0.2': + resolution: {integrity: sha512-2SfE4FFL73rE1WVIoESbqlj4sLy5nWW4M/RVdHvCRJPjlQHa9MH7m7CVJM204lz6I+eHoB+E7rL3zmpJR5wYnQ==} engines: {node: '>=18.12'} - '@pnpm/exec.pkg-requires-build@1000.0.16': - resolution: {integrity: sha512-IF1hAWdq61gCIbaCpy01SmoL5GLfJRC5/+qd0ZwBFdBeWEcEETCcuBYFFss71Q9OdjdTxNrNsz9apE3DPx1Tsg==} + '@pnpm/error@1000.0.5': + resolution: {integrity: sha512-GjH0TPjbVNrPnl/BAGoFuBLJ2sFfXNKbS33lll/Ehe9yw0fyc8Kdw7kO9if37yQqn6vaa4dAHKkPllum7f/IPQ==} + engines: {node: '>=18.12'} + + '@pnpm/exec.pkg-requires-build@1000.0.8': + resolution: {integrity: sha512-8Mx71nPcUEJpLVzl4k/+Yu5Mir8JLg4oWEImkMfLKd9orU/F7A5FIHTeLw4RAnK0MummjmXPwj8UMQgOxkq2eA==} engines: {node: '>=18.12'} '@pnpm/exec@2.0.0': resolution: {integrity: sha512-b5ALfWEOFQprWKntN7MF8XWCyslBk2c8u20GEDcDDQOs6c0HyHlWxX5lig8riQKdS000U6YyS4L4b32NOleXAQ==} engines: {node: '>=10'} - '@pnpm/fetch@1001.0.0': - resolution: {integrity: sha512-b5S29O4WaqxlFDpmyy1NWkvB3X+pz5kM2Se1ENSY7Rx+uKEIcRE1CzpRxpILDFf3uWHAOt90bBNywCeh6LQkKQ==} + '@pnpm/fetch@1000.2.2': + resolution: {integrity: sha512-gc4fmbL7YE8nmEuNk5QtDeIwNTxM0/2/OrV+QJXTppd+Z5y1UJVCmH5M0JU8enTcpGqHYEbt5WcTU1jf0/jU7g==} engines: {node: '>=18.12'} peerDependencies: '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/fetcher-base@1001.2.2': - resolution: {integrity: sha512-LMSb3k7osG99ikbhLTPQWfr61tyAnd08NbIoASVdUJ00S0c6F6O/dauqb4Z/PddE4ghkQ6hE2VRNASdRdLgT6w==} + '@pnpm/fetcher-base@1000.0.11': + resolution: {integrity: sha512-QcHArZSCNGJZBlBc0dG4NvfL1vWt7SE+qHALJm/mp2kQ7HBODXwp95xgNB1JTx29AbJ8c4tpybq73ZQ6Vdsw+A==} engines: {node: '>=18.12'} - '@pnpm/fetching-types@1000.2.1': - resolution: {integrity: sha512-atgLxpIAxERPtWykqHzSzLhVfKYZ8hV/KzuVSEXjwvY1+RWnycotbZ2xm6Z90dNx8WZw6PM2r8OmkiZiRb1+Bw==} + '@pnpm/fetching-types@1000.1.0': + resolution: {integrity: sha512-0JFRtWH/6Pwsl9Q9CwxHpCxsoaaTr4cYbL4moMiVYnllg8yeJSU3V5S0gPsAlIdhHfjBVNfwMIM99pICzic33Q==} engines: {node: '>=18.12'} - '@pnpm/fetching.binary-fetcher@1005.0.4': - resolution: {integrity: sha512-F0fp9mOldXlzd1Nunpvn0ArGbYsvgqz8Ysh6/gB3RFJE6IVubixqgVzWuspsTfcSMhZd6Dt0Kzj9qyfuyMPXOw==} - engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/worker': ^1000.6.7 - - '@pnpm/find-workspace-dir@1000.1.5': - resolution: {integrity: sha512-r1WzYXBD8cqlglOi4ilN9BphX74mJmH2hhiogzYbcNCHhtXnG7tw/9Iq54UGZ+cpDkgGHjL0xLwj9QLUoKJxmg==} + '@pnpm/find-workspace-dir@1000.1.0': + resolution: {integrity: sha512-K5iG/z0SLV6bVW1jIYvbNBI6vWAD6ETJKyWj/wwHr7hxloxtm9xJCGbe/41pmM9nfFFUPbr1Z0YOi4q9yWkj6g==} engines: {node: '>=18.12'} - '@pnpm/fs.find-packages@1000.0.24': - resolution: {integrity: sha512-6r2lpvoljgTvQ+CiJYz3jCunzO1PM6g1Cqc3xon49he8sgg8BatMsNxcGnuZWK//du80+ylS/uBXKxwuHMuHUw==} + '@pnpm/fs.find-packages@1000.0.11': + resolution: {integrity: sha512-vI3+bu6CrI/42hDUjtsKtSGaHlp8XHdmywtrc3HQYQrihzoaswjQW3dXAfG9x4bZy6vuGwmzXkberI1Z81QYUQ==} engines: {node: '>=18.12'} - '@pnpm/fs.hard-link-dir@1000.0.6': - resolution: {integrity: sha512-8Z26HRL7YuC7jvkGMT3s5+0sJSBJ8PtldWGQ9gCPtXtjfORr7ep5V/rcTDQk6L1KzFIBuSg5NBOpxLdzJeCUCA==} + '@pnpm/fs.hard-link-dir@1000.0.1': + resolution: {integrity: sha512-P+nAsqQR5ksBwXSVBpeAJLNP8BvD3pRbeAbMvwZ0stuw+t1krkFkbEHkEtBBvX9vFeO2bxi8JXo3SnD/fD3KfA==} engines: {node: '>=18.12'} peerDependencies: '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/fs.indexed-pkg-importer@1000.1.26': - resolution: {integrity: sha512-U9kSSk5UjqNoDiLjulNjZCAZLP6AkzMyvILV1qaK1ciM/qOioyVTaVd0N5oFTbEv0h/wrDb5V7r9k/xwS73flw==} + '@pnpm/fs.indexed-pkg-importer@1000.1.8': + resolution: {integrity: sha512-VwsjBhAyW+5TQO6Ndon1y8kyvSLQJyyWzwNRENQN+UkbrybsjNXHX1vcMV4Li/+pQ0VBYFVxYl/cx+EkU8H9hQ==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' '@pnpm/fs.packlist@1000.0.0': resolution: {integrity: sha512-2WXDfqKVIfLskyDUmqKP+n8RzlEqPk8jpsiPXRA5Zx0La5IAadlo94Yttlu0f152t/ogmuOtHFReOgCT2uUzQg==} engines: {node: '>=18.12'} - '@pnpm/git-fetcher@1006.0.6': - resolution: {integrity: sha512-kxLOlrvwOudX7VEe6bTJz0UXTwAebqTAYz0XhlzzXeJUuWep2hQMAW7QzeQyU247ZzE4AXr88Ca1ViZyytCk/g==} + '@pnpm/fs.packlist@2.0.0': + resolution: {integrity: sha512-oy5ynSgI13FxkwDj/iTSWcdJsoih0Fxr2TZjUfgp1z1oyoust8+OxqCMOrHovJEKToHdPQgFtO09KbH7lAlN0w==} + engines: {node: '>=18.12'} + + '@pnpm/git-fetcher@1001.0.8': + resolution: {integrity: sha512-9hrLzEEsmuNZAI55RQtUsK+ldaZFyAg/58btRMjXtaXjUBPHqnF+TiqjCoSLxvn2hZZnlx4FynRkCO3yUuwQFQ==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 - '@pnpm/worker': ^1000.6.7 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' + '@pnpm/worker': ^1000.1.7 - '@pnpm/git-resolver@1001.2.2': - resolution: {integrity: sha512-vaJRXv+jDSxuHdh7wGO5CBq5E5g+wrTMC6JwzvjrMjDhtIPjuncZJ3ZwinBfOJjoq4t/OsUD9lSqdcAaETKQOA==} + '@pnpm/git-resolver@1001.0.2': + resolution: {integrity: sha512-+hWA4HfcTIdZkAeMgRsfCuM21xBaQTSt5vMfcCAr8nnFClD5xTYVd+pqrOf+8/7HL+zzqSd9YehqpwIh3osNdQ==} engines: {node: '>=18.12'} '@pnpm/git-utils@1000.0.0': resolution: {integrity: sha512-W6isNTNgB26n6dZUgwCw6wly+uHQ2Zh5QiRKY1HHMbLAlsnZOxsSNGnuS9euKWHxDftvPfU7uR8XB5x95T5zPQ==} engines: {node: '>=18.12'} - '@pnpm/graceful-fs@1000.1.0': - resolution: {integrity: sha512-EsMX4slK0qJN2AR0/AYohY5m0HQNYGMNe+jhN74O994zp22/WbX+PbkIKyw3UQn39yQm2+z6SgwklDxbeapsmQ==} + '@pnpm/graceful-fs@1000.0.0': + resolution: {integrity: sha512-RvMEliAmcfd/4UoaYQ93DLQcFeqit78jhYmeJJVPxqFGmj0jEcb9Tu0eAOXr7tGP3eJHpgvPbTU4o6pZ1bJhxg==} engines: {node: '>=18.12'} - '@pnpm/hooks.types@1001.0.20': - resolution: {integrity: sha512-xNm1A5VkCuR+nBHV6h6Zdocv1nRZYkM2/V8fXAdfI1ueTf3tb1j2MdROp0ZfQtmPBZMJmJ+vJj6PKQVErpZE2A==} + '@pnpm/hooks.types@1001.0.8': + resolution: {integrity: sha512-pH03ff8WlCChgOp0gv4l016E5qrYjPHMTeTnc8+bpvJvBuHZTUCbAStpRw9XvOmzSvecXK3kMIYv5WBjcBV94w==} engines: {node: '>=18.12'} '@pnpm/hosted-git-info@1.0.0': resolution: {integrity: sha512-QzmNiLShTnNyeTHr+cykG5hYjwph0+v49KHV36Dh8uA2rRMWw30qoZMARuxd00SYdoTwT8bIouqqmzi6TWfJHQ==} engines: {node: '>=10'} - '@pnpm/lifecycle@1001.0.37': - resolution: {integrity: sha512-Gyb7riSG1IPtNv9wwmDwVVoswHm68exvkX2GJMtNlWCBA4UpMt/yNXwnZwvtKeVU1xIyH+SQ8fa3xzOhSaf+7Q==} + '@pnpm/lifecycle@1001.0.15': + resolution: {integrity: sha512-JpL9DigsixHQ3yVeejiGbMm4Ni6UAesDZtKTS/Pm6t/kmQuMTWvvwW27nmorTmaaPu2Y5Tu9VnjzDLvpv/EJIQ==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/link-bins@1000.3.8': - resolution: {integrity: sha512-bW14xL9T3gEpw1sx10rswp/mtatiA1MAZWy32pYwef6anKipX1720do9Up+CEwZ+kwYmzD7aKJjykcs5aiJ3bg==} + '@pnpm/link-bins@1000.0.13': + resolution: {integrity: sha512-a2gKKTKpJReUDnrd1UQb+Aj62zjVy1XAPJyJIwNIB0AB0lWfxY2HOG8EEpo3qJln5o5/I5T9KYG3V1KSeklB0A==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/local-resolver@1002.1.13': - resolution: {integrity: sha512-bZDxIPDT9kGkYYIPJQ3j2wP/yZboVaRwGnndP8UqS73hjgiGUbcSoFBfJpk3o3icKNRdOkvagHIOeBFbrwiJ1Q==} + '@pnpm/local-resolver@1001.0.1': + resolution: {integrity: sha512-OZqbAu9r04SsnaITfEa4ov/KNw6OWWbiSZZq3eNkPs749+1zaNfI+e04ryYKZHUD2f+eXG9ty4IAMwa3QkGXDQ==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/lockfile.types@1002.1.0': - resolution: {integrity: sha512-Oa9Fhwo4Ipodj3hyUPC5wUt5ucVkuttyct2DbFUkB79Fq5HL9MHHQ+JFYh03eajmLqWrN1t8+6DbmcKqRtNjNg==} + '@pnpm/lockfile.types@1001.0.8': + resolution: {integrity: sha512-rKecvWutX7aZPFNyXGnGtiwfmnPRiQyG6AWQ1Ad0djWKbPeccg0s9B7cJqCJ4nEnwzhEvw9UtuofBkU/O0L+bQ==} engines: {node: '>=18.12'} '@pnpm/log.group@3.0.2': resolution: {integrity: sha512-8TmkCqpbKf+OxdkfOwZ4OeOwyJJ/2nGi0osI44pZzxjXNNa4gywQrGsgtpdls+R2cAMoYHVahN9mi8VJ3cznaQ==} engines: {node: '>=18.12'} - '@pnpm/logger@1001.0.1': - resolution: {integrity: sha512-gdwlAMXC4Wc0s7Dmg/4wNybMEd/4lSd9LsXQxeg/piWY0PPXjgz1IXJWnVScx6dZRaaodWP3c1ornrw8mZdFZw==} + '@pnpm/logger@1001.0.0': + resolution: {integrity: sha512-nj80XtTHHt7T+b5stLWszzd166MbGx4eTOu9+6h6RdelKMlSWhrb7KUb0j90tYk+yoGx8TeMVdJCaoBnkLp8xw==} engines: {node: '>=18.12'} - '@pnpm/manifest-utils@1002.0.5': - resolution: {integrity: sha512-2DSwQ6pP73IuJS5mCCtPd5fibJwuAdufXKuSL/Oq1n6AggCqy8616Xea1X3RH3z5dL4mn7Z4EZ+vnX8jX3Wrfw==} + '@pnpm/manifest-utils@1001.0.1': + resolution: {integrity: sha512-hYcuP/1BIz/FTIc0+nvgoPLTav/eDmwmLgiMFMsjuX99CNCZlHGQTbph8hrYUJu13QMm/99aRBN/cCpZqqYi8g==} engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/logger': ^1001.0.1 - '@pnpm/matcher@1000.1.0': - resolution: {integrity: sha512-R1pl9wY1b9fQRGkD5pNDhe3+6AMfNCtSOoTvrMLj5kepQm6i/4i3ulDTuBxYuvzWOoD0nx1jVofjTrlKxK8RoQ==} + '@pnpm/matcher@1000.0.0': + resolution: {integrity: sha512-MKulLUYdMFvZ3UOFsqpqn7nrA3OnHs210jYmI8Wxyczh1nG7icY49sUtlpYsEEbBA1arJpAXDGyU4hx58dk9Lg==} engines: {node: '>=18.12'} '@pnpm/meta-updater@2.0.6': @@ -10560,8 +10465,8 @@ packages: resolution: {integrity: sha512-YITr8VrjPPULdQWAA17oU0M4j4286OmRnk0XA1ntoR+v0FbdGRKmRQmOHx86s1eM3eGCh1UF8WPHNkbgjjBN3Q==} engines: {node: '>=18.12'} - '@pnpm/network.auth-header@1000.0.7': - resolution: {integrity: sha512-zf2afz8uGT3afOdVukbZB0mNqWN6ZddiD+y7sReqkciecp/HSCm9seOpTDC9Ecl/VTgqeP7JOJ2k0M1C4q1+AQ==} + '@pnpm/network.auth-header@1000.0.3': + resolution: {integrity: sha512-JWjz3t8MCJS8ctaNLUNGLDlMwurr37tHtiiXG0NvHjDo8wiY1xNDgVv+XT+qBRVv4ziKV8FbO3dqsJHyJZD+GQ==} engines: {node: '>=18.12'} '@pnpm/network.ca-file@1.0.2': @@ -10580,25 +10485,21 @@ packages: resolution: {integrity: sha512-eYwrzhKUBGFdq78rJStGjaHTUHA2VH+Avr//CVx/T+EJkI7hnFmOy6YghvcB2clj8HpO4V8tXRNuFNfRX08ayw==} engines: {node: ^10.17 || >=12.3} - '@pnpm/node.fetcher@1001.0.27': - resolution: {integrity: sha512-ozO0ZDYbDZrFQzc0uZ2kxhPJ6REu2Neq3g4MxOsJd1lzwX26ViVLyJqlnQ1Fn9JE6szJJPJ8CVsQhQ+c8tXCWg==} - engines: {node: '>=18.12'} - - '@pnpm/node.resolver@1001.0.23': - resolution: {integrity: sha512-WIsXeAR2EwVvzSz6CG3UqUwimOBsOyg9YfUHCAc7yqP7mVe3Hy2o9KAgSMChseYtuMgfI75isuTkFPDgXlIb/w==} - engines: {node: '>=18.12'} - '@pnpm/nopt@0.3.1': resolution: {integrity: sha512-5XP6EwsFv8+CtaNJD/pog3CkiwCgux8/edLHV+lgz94g5n65dlwo+jQk+053RPq8vK8ODP9ajZB0oNOp7Fxdvw==} engines: {node: '>=18.12'} hasBin: true + '@pnpm/npm-conf@3.0.0': + resolution: {integrity: sha512-LdFkv/+4ONkQ9ZyE8ihC2L2RcPjvNcOTQq6pvvvZp8KeDYATCJeJX7gpHZF3Bx1XvUSU35dyF9Q9dS+JShtOFA==} + engines: {node: '>=12'} + '@pnpm/npm-conf@3.0.2': resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} engines: {node: '>=12'} - '@pnpm/npm-lifecycle@1001.0.0': - resolution: {integrity: sha512-5jW/GNLdZMiw+PJ8FYSvOghoApSjsORNIro2fj8j6NHAqJxJjcHekC5/NsKaawoI5LAkU/XDDVjNC71Yz+uS1w==} + '@pnpm/npm-lifecycle@1000.0.4': + resolution: {integrity: sha512-sN7dG1UV7jZvMgH2C/qtvriq4PsDkJQekuAHWO3DCw4n9Ef5Edv5nNoyg5I288FFzDsEV963HpyVOqB7x94DNw==} engines: {node: '>=18.12'} '@pnpm/npm-lifecycle@1100.0.0-1': @@ -10609,11 +10510,11 @@ packages: resolution: {integrity: sha512-429x8dFMgxZoeYUTUPAMC09IeM5yQ86X1LyYEQF1P4uyvhLSCh44QKkiprX9qdwBsV9QxjeNad2QoDZy1RSeRw==} engines: {node: '>=18.12'} - '@pnpm/npm-resolver@1005.2.3': - resolution: {integrity: sha512-xbO8q0ANqbnDETPJHHt1Eab5tcP0eAesuRljgmgnIJE5urgUpC24Mzz5tZ/zMbchPKrmvx0vWPOrHQo7Ddz8eA==} + '@pnpm/npm-resolver@1004.0.1': + resolution: {integrity: sha512-SCv9Lbt+n3VVYDwaCzsHzN4HQNNsf8hrIljont/00WTCpGW93rz3f3CGevZSAdAkkfPjJNyxJ9w5DckyxEqsSA==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' '@pnpm/object.key-sorting@1000.0.1': resolution: {integrity: sha512-YTJCXyUGOrJuj4QqhSKqZa1vlVAm82h1/uw00ZmD/kL2OViggtyUwWyIe62kpwWVPwEYixfGjfvaFKVJy2mjzA==} @@ -10631,29 +10532,29 @@ packages: resolution: {integrity: sha512-gNA3d1w8m7JlyXfjurpqZ+SwWq91JVhrUcsNIGh64r/4Nxnq3o+yxUQyxyrBFlL8luW6OcL0cFfYdAkv19n78Q==} engines: {node: '>=22.13'} - '@pnpm/package-bins@1000.0.17': - resolution: {integrity: sha512-DD2XTIIWwN1xVRdocKRaIl4eSMp3EdhhxqogfEwEiMbmGkoE4lbnTg3f81VEfhOGl1vTaS5UoM2qxW1FGrpaZQ==} + '@pnpm/package-bins@1000.0.8': + resolution: {integrity: sha512-oWFHlYVl7h5qmIoK45GzHyQbVOM6kBDqy+xZ2dqbPyYzFaVJGbkYuNvYfnb5acktlResln0BzCrcQHgrGHPdAw==} engines: {node: '>=18.12'} - '@pnpm/package-is-installable@1000.0.21': - resolution: {integrity: sha512-DWXt+BJBz7H1CiT4BdNLFCUkHbD0e63MEzTCa6gBq0CtNbtXxGmkvPJ2wmRoCsC8lwqzvQZfYBPdl/52rOMMsQ==} + '@pnpm/package-is-installable@1000.0.10': + resolution: {integrity: sha512-RNSMAHMDjg6+obZ4z6HbMjqh20FF5gq8usso7sIkg9U4Y/BYXjTfecp0Jv5UFgRh6JL3qt/JOhSliMLyPVmi4Q==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/package-requester@1011.2.4': - resolution: {integrity: sha512-hOy66cKvi7PdfYsS01sA1MnF45ruK73w01H2bPj0rhdit+QjW8bv6iC0o2LK1/5Doaxy7taU93Au5204kso8Vg==} + '@pnpm/package-requester@1004.0.2': + resolution: {integrity: sha512-laowhyIIol+9AIimxq73tcxTWD5nUVvyfKA1YKysPP1+coq/4tPHqOlK2S5Z4FgPj496Eew7Dg7cEu4K4QBUOg==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 - '@pnpm/worker': ^1000.6.7 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' + '@pnpm/worker': ^1000.1.7 - '@pnpm/package-store@1007.1.6': - resolution: {integrity: sha512-N9pN1T16m+2aFIsC4npkU7qlkFjcSK/Xd0MMcgzdoSkXY+qQ40V0kkKP+RGxvEVauGtYFv0Inr0BZxyo6kradA==} + '@pnpm/package-store@1002.0.4': + resolution: {integrity: sha512-acrZhIG83gTadc5nEueIMkb/ldpH3aN2M3yLLYP2eVcWRltFrvLvh+7+fKfaUXeyCO+mxK+quez8ln0V/KhI9w==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 - '@pnpm/worker': ^1000.6.7 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' + '@pnpm/worker': ^1000.1.7 '@pnpm/parse-wanted-dependency@1001.0.0': resolution: {integrity: sha512-cIZao+Jdu/4znu76d3ttAWBycDj6GWKiDVNlx1GVgqYgS/Qn7ak3Lm0FGIMAIHr5oOnX63jwzKIhW35AHNaTjQ==} @@ -10668,22 +10569,22 @@ packages: resolution: {integrity: sha512-Zib2ysLctRnWM4KXXlljR44qSKwyEqYmLk+8VPBDBEK3l5Gp5mT3N4ix9E4qjYynvFqahumsxzOfxOYQhUGMGw==} engines: {node: '>=18.12'} - '@pnpm/pick-fetcher@1001.0.0': - resolution: {integrity: sha512-Zl8npMjFSS1gSGM27KkbmfmeOuwU2MCxRFIofAUo/PkqOE2IzzXr0yzB1XYJM8Ml1nUXt9BHfwAlUQKC5MdBLA==} + '@pnpm/pick-fetcher@1000.0.0': + resolution: {integrity: sha512-/Lg6m3wcd6sRB1zHH0EZpGVkmor1+jdXdrvGtatUXxug+Gm2JzeW7Kd8LVcGyKTfFMMlT+xxhjfHKG67QNJxtA==} engines: {node: '>=18.12'} - '@pnpm/pick-registry-for-package@1000.0.16': - resolution: {integrity: sha512-/dTfl669uwuABRqZXDT37fJItuPu3h/YHw4lAvgkUp3D6CaWVRoEX+ZBiqQU/NCzUBOQ3x7QOU7sPKUinbRh4A==} + '@pnpm/pick-registry-for-package@1000.0.8': + resolution: {integrity: sha512-d72n9tHyw0oOFzay+7/pd/94OMXCJmuuaTRbnNmUIDrwdPXtJ0B4ACCe87+LxtCvTO0LArG3yCDKxq7mK5VLUg==} engines: {node: '>=18.12'} - '@pnpm/pnpmfile@1002.1.13': - resolution: {integrity: sha512-WURiwlcbGeIUFj1woQiKKGvF+AkgENRDXV4S8BIHVox/uAT/d4MNQ/6ekQ/0kaovebsKqFftZFisHLpG4d0yww==} + '@pnpm/pnpmfile@1001.2.2': + resolution: {integrity: sha512-274P1OPhrbt7JezKBbWWKSYxMeAY6oYUcqQxBg7Abv7lUXMsxE4F0njmKv3gkK0Tc6UrM6qJEXdMqeLGLtL8pg==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/prepare-package@1001.0.7': - resolution: {integrity: sha512-dTgxVav2jWqdlLdKDTTioR8k07301E5T/+00ylu22UlnlA/h7dyzdhEThDmYBTEYxe6TIYFjLYmoWRGJSy1y/Q==} + '@pnpm/prepare-package@1000.0.16': + resolution: {integrity: sha512-Hucuv9OWaPyystTFzlYSlizoqRgiF0bMAecpm2mGZUx/ifHKVfmQ472fCBYWW5kHjm/Sv7402IhrHte68VBqGQ==} engines: {node: '>=18.12'} '@pnpm/ramda@0.28.1': @@ -10693,15 +10594,13 @@ packages: resolution: {integrity: sha512-IEJ9Zc2DVqKy5iFu0EtwdBMTa0F5nElqh53dBv+dO+2g72dKd31CV4fMyWrjf7PIdFs0YUAknYok5wKBeMTqJw==} engines: {node: '>=18.12'} - '@pnpm/read-package-json@1000.1.8': - resolution: {integrity: sha512-mIC+8Yz3lMuL5rYr2DIaflhJwaMkd58ArF1kaK3DLo6uI4wzUJJsBqMLW4ebUr5+QxFtyaWBhMlCRsRRywPFYw==} + '@pnpm/read-package-json@1000.0.9': + resolution: {integrity: sha512-f/BnUnJoD+e1a4PLCRkLaqlBnW7hkZ2uU1ULCsPwQm2Uwd0rGsxJAeCvDsh1shM5FamzMAr7WxRsQCygsRtc3Q==} engines: {node: '>=18.12'} - '@pnpm/read-project-manifest@1001.2.6': - resolution: {integrity: sha512-BcNO50lAkE4m9JaJ0WmG3m/DH/qLSvMgZywtmb/dfyyLVu5nDZfDqmOd8U+f1NhLcLMbBK6AnS3hyUqZYvw9Vg==} + '@pnpm/read-project-manifest@1000.0.11': + resolution: {integrity: sha512-uPl5tkXullEQa+WOZDIhp7jb1UlGg8vVjnOLZmv6oJltEfMzOlDryu0awYJB5QVj1twKuxevjH6Zaq/mdVn4dw==} engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/logger': ^1001.0.1 '@pnpm/registry-mock@5.2.4': resolution: {integrity: sha512-HOetl+ocfNYM4lX7QkR6H3E4QBkHnDeclum0hUmqb5U3HnVFH/bIRwnd8GCKsgJ+H3mpNgAAMTxPFlSLp6vVmQ==} @@ -10710,42 +10609,20 @@ packages: peerDependencies: verdaccio: ^5.20.1 || ^6.1.6 - '@pnpm/registry.pkg-metadata-filter@1000.1.6': - resolution: {integrity: sha512-1sgnH0BKvnavbunCXZVRCSOXef/2E8dIFocNqZdHXF84JWcy4QIi5rwXHNRElMBgqZt1vUzKsEMMVtwQaS9cGA==} - engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/logger': '>=1001.0.0 <1002.0.0' - - '@pnpm/registry.types@1000.1.4': - resolution: {integrity: sha512-LCuhL8Z6ca9J9PUyT9We9gwpEke9HuW1l/2QT4NIn4rVMI7WndCbMTxa2HsvvRtyCP9cAdl6NPv5eAGQnzjSWQ==} + '@pnpm/render-peer-issues@1002.0.0': + resolution: {integrity: sha512-KYx8cqr7HRS6eAENDbXF4q2A4zt5aeUkZprp3KXz76JGEK0IkyDJjlHhWPJZa3bEKnLzgG2T4Kd3dkJ2h3GlZw==} engines: {node: '>=18.12'} - '@pnpm/render-peer-issues@1002.0.12': - resolution: {integrity: sha512-+SAyETohRgc1H4BXbljSWse4CzwqAMeys0uagwjJUslKTh6F79r+oB94j42ATnvhsls+MDGC4hOK2c6k16rjgw==} + '@pnpm/resolve-workspace-range@1000.0.0': + resolution: {integrity: sha512-NO0Rz4MEOVvGsMBR7AGqqQ5zgHMQ0fpRE01iYKUKfxJ42AVP6slka4GF2rpEZISfgq8HeSdSnKL9oul3+V/2jA==} engines: {node: '>=18.12'} - '@pnpm/resolve-workspace-range@1000.1.0': - resolution: {integrity: sha512-kQT1l+hQqW2/Z7CcbGXd9HfySe18jiJSeK0g6tvWLA27/s4bHikiCD7m0vkfn3w+pLpA/lwWmoUiPrDZmsaZ2g==} + '@pnpm/resolver-base@1003.0.1': + resolution: {integrity: sha512-QdkoHw3Bk/pLfdmhWttBZP5DVOcYTvli6zjt9Pk3A8gIhVMw1QBRbdhhvEmPgKwDh6DxD7jFrh8daTkF7OK1cw==} engines: {node: '>=18.12'} - '@pnpm/resolver-base@1005.4.1': - resolution: {integrity: sha512-47zGgACkbZWLOmM61kaE0nkqxiYx63C6DJ4wzDsdj0iXDZJ9SJEl+T035pkhquHe8XEh3YxvwMg2BRyZSgmZ9Q==} - engines: {node: '>=18.12'} - - '@pnpm/resolving.bun-resolver@1005.0.11': - resolution: {integrity: sha512-ymCqF3OKhUPnX6rIO60KeSExwxtsmtC/63EIi5sKELVtS4LblCokZf1prkKrxIL/XdsMxlHOfgP3hN4PWAx3XA==} - engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/worker': ^1000.6.7 - - '@pnpm/resolving.deno-resolver@1005.0.11': - resolution: {integrity: sha512-4xx/cOVTVPJWuithd0RDaVZ0hb6H7kAg7jDYJtR/3cOUl+8KHLqD2fIh71OXGrPkGTd4mJCsOUO9MxY2hqCj+A==} - engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/worker': ^1000.6.7 - - '@pnpm/resolving.jsr-specifier-parser@1000.0.4': - resolution: {integrity: sha512-oxf+Y5lumvfNx9Igss/dvDb0t4iWtE0wjrmdDPFkVrXTlQbdWLujnyYSp3Obim/65K+r5RspoizJgjWJRe69nw==} + '@pnpm/resolving.jsr-specifier-parser@1000.0.0': + resolution: {integrity: sha512-/61cFu7EJcrXCJtqo9cjaEcuvtUYWOZQE0o7CrYL0S15lN7gSbUMD19y/n0eG4rBxyRJg3U+fnj43f+mvREL/A==} engines: {node: '>=18.12'} '@pnpm/self-installer@2.2.1': @@ -10757,12 +10634,8 @@ packages: resolution: {integrity: sha512-qQDQqPlveM7+Q0PMc21t1gfrCXMBe054HCdqJn3Hbo2WTDAlQjAShvTNDXaqVe/wx2JOnhA9GkQR4lk/zDrT4Q==} engines: {node: '>=8.15'} - '@pnpm/semver.peer-range@1000.0.0': - resolution: {integrity: sha512-r6VzkrdH7ZKjPmAogTNvxuV/UyS/xwHNme+ZuEFiG0UthZgqudDftYtKmG20fcfrjG1lgJbbWICA8KvZy7mmbw==} - engines: {node: '>=18.12'} - - '@pnpm/server@1001.0.20': - resolution: {integrity: sha512-+LueCvZ8QtEgKXP76KlYZlY4OvCz90RsEQj1Ohi7Ec5s/b3SQQRZbXKUbOnvj8F+8l+ex40zfFHIMhfG6bRerQ==} + '@pnpm/server@1001.0.4': + resolution: {integrity: sha512-T+cYDsTCd43yREoVeCmpKj0Hl1fcgIiYxi/uP0M6IliApXu+Jn4uVgTOa3OiTSixWREvFKrPcnSM1RkkLQ5UVQ==} engines: {node: '>=18.12'} peerDependencies: '@pnpm/logger': '>=1001.0.0 <1002.0.0' @@ -10770,26 +10643,26 @@ packages: '@pnpm/slice-ansi@1.1.3': resolution: {integrity: sha512-xrWctjDAHXzIths7OmtW8dZUFR8aX/9zdwi4QRhCU7XFJJHl2JJqZoh2zD2wSMjWW7z2CiXeWWvfqftniM3dTg==} - '@pnpm/store-connection-manager@1002.3.19': - resolution: {integrity: sha512-+vusHp30F9nOIaSuq4oORGiqlTA6W79lw3aOe2w0d3yn4SgFQnApduQOsNdJgM0my3AIBWMQOW2m3T2FCiX6Lg==} + '@pnpm/store-connection-manager@1002.0.3': + resolution: {integrity: sha512-rwywNmHYk1Wv2looiG4fjWWXMugxhw+rVd2Xw0rYrSDHZ+7fC24NrmJIceD7/54jvr1pPz6TL7tUcBV/1ms7vw==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/store-controller-types@1004.5.1': - resolution: {integrity: sha512-UT6UpPIuebGhYEldceeprZZn3/NWS4CGOvObxbrfRRVPoBhJTYZwC9rg5rPooTpPH+LiSGLRHc34lPMIQzn7NQ==} + '@pnpm/store-controller-types@1003.0.2': + resolution: {integrity: sha512-YT9o5KBagNBzzKLX2GtLoamFPl6I6beg/pencHMzAR6yDCE4hicvymvK1ahtl/ntCaWdxaj5+DtTED0UaqimGA==} engines: {node: '>=18.12'} - '@pnpm/store-path@1000.0.6': - resolution: {integrity: sha512-Bn3SG3MF7Mc3KVbbOOJ1FvFyz3UgvdyEuCO3/sakNL4yeKNKgUnv/ECj9KsD6/4goHnRSRajtlmopLaBkAsSCQ==} + '@pnpm/store-path@1000.0.2': + resolution: {integrity: sha512-Ab2RJUnMb0ZP7rRTP9mr+KUSeoWjozNbd9gqC7ZYptHUlPohpVbjBY2xeppApw6GVzHLWPB3hIyXXz7qylnHuQ==} engines: {node: '>=18.12'} - '@pnpm/store.cafs@1000.1.4': - resolution: {integrity: sha512-6lV5EzJieiBe6Px+p1JezbKdQ1umj4gxIYexYKSMBHPH6SVKFYnKewwU8iQ2bWhvnTNbUMUxTIJeIErWBGh2eQ==} + '@pnpm/store.cafs@1000.0.13': + resolution: {integrity: sha512-WhYfU77DdOIrIXHJ3uNPs39J87CLDaV6WV7SgqoZAkhWSIja6qTgOirDlhqj6FSRuKSKNwbYEMitd4BX0ZA8BA==} engines: {node: '>=18.12'} - '@pnpm/symlink-dependency@1000.0.17': - resolution: {integrity: sha512-z8vyHVtBud5Mfdeh/vebb2o+ZRqIDE1b2uyoBQPZCUEa6WhZWwiwTDLXxTeJFaC7bknw1RP6HgMOtp9kkU0hxA==} + '@pnpm/symlink-dependency@1000.0.9': + resolution: {integrity: sha512-yI4nFQuI6lBzP/hUJ6L0te1TT+LVwr8LzA4E5acyrjQy/LOoRlIMykVP1nPagS/h4E2lDXo1LlARvSt1Ibe1LA==} engines: {node: '>=18.12'} peerDependencies: '@pnpm/logger': '>=1001.0.0 <1002.0.0' @@ -10798,34 +10671,26 @@ packages: resolution: {integrity: sha512-bWLDlHsBlgKY/05wDN/V3ETcn5G2SV/SiA2ZmNvKGGlmVX4G5li7GRDhHcgYvHJHyJ8TUStqg2xtHmCs0UbAbg==} engines: {node: '>=18'} - '@pnpm/tarball-fetcher@1006.0.6': - resolution: {integrity: sha512-3JdYi0o3rETeSi8s4rwazoiY7/WsK+E6ihrWwRoFZ2YEobhWvP22F7iwsaQkEiwmBFOdUKzqysSnLo0NG13CBw==} + '@pnpm/tarball-fetcher@1001.0.8': + resolution: {integrity: sha512-LvIpySD/dJRTX3qu0jme1zjOGzqyzcbSyuybQTq9djRiaSsatGDGaP7bDYw8fkXJ2EGvAhXbxRZ6iN1w663Hug==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 - '@pnpm/worker': ^1000.6.7 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' + '@pnpm/worker': ^1000.1.7 - '@pnpm/tarball-resolver@1002.2.1': - resolution: {integrity: sha512-E2vuu5QrRoNJF6dQdDrDaVGvm4ko0HOT0XbGNCdyk2BGPEkXuNZ/7A8xyvXyNSEtUAql8V4hDbLWsQRIg4xlOw==} + '@pnpm/tarball-resolver@1002.0.2': + resolution: {integrity: sha512-QprnZHrPSPqOeBZgf/TGo+MBFWUcx0qQz808nPVrFSPC5PWhlHGnA8MJLFObNktWwTLqccJXZYgOj33MIwGbOQ==} engines: {node: '>=18.12'} '@pnpm/text.comments-parser@1000.0.0': resolution: {integrity: sha512-ivv/esrETOq9uMiKOC0ddVZ1BktEGsfsMQ9RWmrDpwPiqFSqWsIspnquxTBmm5GflC5N06fbqjGOpulZVYo3vQ==} engines: {node: '>=18.12'} - '@pnpm/text.tree-renderer@1000.0.0': - resolution: {integrity: sha512-ea/ClG7C4eJTxS2wcqj3bjXQ1zwxBd7ASTiyGR99pilLQCL8d2XOusFrnHYTmeP1couC89OULT/BZ59lmK/lPg==} - engines: {node: '>=18.12'} - '@pnpm/tgz-fixtures@0.0.0': resolution: {integrity: sha512-6YlfA/aWpeYbX9ADtSv3kKJYjTUE8rXw3gKzLPuO8hc4S7fP6sZwQXaYP7uwyWieU45TR3u0V/g8esQQYZrGMA==} - '@pnpm/types@1000.9.0': - resolution: {integrity: sha512-UvDTCxnbyqkTg2X0dBOuZ4IdFJ8g4UFu0Ybv/5/cZAxCWVhNl1hC/Xc9hR4tZrlBL0NRFePLRhO/iw9LmA1lbw==} - engines: {node: '>=18.12'} - - '@pnpm/types@1001.3.0': - resolution: {integrity: sha512-NLTXheat/u7OEGg5M5vF6Z85zx8uKUZE0+whtX/sbFV2XL48RdnOWGPTKYuVVkv8M+launaLUTgGEXNs/ess2w==} + '@pnpm/types@1000.6.0': + resolution: {integrity: sha512-6PsMNe98VKPGcg6LnXSW/LE3YfJ77nj+bPKiRjYRWAQLZ+xXjEQRaR0dAuyjCmchlv4wR/hpnMVRS21/fCod5w==} engines: {node: '>=18.12'} '@pnpm/util.lex-comparator@3.0.2': @@ -10837,36 +10702,32 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - '@pnpm/worker@1000.6.7': - resolution: {integrity: sha512-cCb3XhSf3DOYay0rVIqdqNdLt+zd54tpAzVZc77nVRccE7cb5f4oPiKR4RS+V4qNkSlj/7BDEK5svPTSVxtXxg==} + '@pnpm/worker@1000.1.7': + resolution: {integrity: sha512-iOIP1MeJbyf2X3kJ2p3qfqIcUGc0uvfyGPR9dTCQooLNgKSQCCHC+4UhS2Xfrq/SQEhD2bzIHJRTieshm2Qfzw==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/workspace.find-packages@1000.0.65': - resolution: {integrity: sha512-76n06rXBgK9FaLuexbvah0cQzLxKCK/5SwwCJ1i9xLDV7anZTPkSiJQpGTmUlDr9hbQPXOG1nSorV031hjG7QA==} + '@pnpm/workspace.find-packages@1000.0.25': + resolution: {integrity: sha512-dKXeM46nSXKOzIIvofAhrcZqivxeJIqG27MX2nQoYYtccdJw6IBWozPqDJIPw0V3WLt9DAEQOqooEasbBmB5wg==} engines: {node: '>=18.12'} peerDependencies: - '@pnpm/logger': ^1001.0.1 + '@pnpm/logger': '>=1001.0.0 <1002.0.0' - '@pnpm/workspace.manifest-writer@1001.3.1': - resolution: {integrity: sha512-EbVvYPRXO5o4qkol+Sgo1sR+46UZBrPZTNsa8G8C35iiXrMsjwS2Ssf0gpdKH7E4R24v+mtOiJuhZ8mnYCrHOA==} + '@pnpm/workspace.manifest-writer@1000.1.4': + resolution: {integrity: sha512-muGVZ4LWmdUoLNE7+sv6D9OnKY/PO4xzXvcA5r2t9HFnxibd9DBjPg51K62e7euif8v6fDNx18soh1GmVxqKOg==} engines: {node: '>=18.12'} - '@pnpm/workspace.read-manifest@1000.3.1': - resolution: {integrity: sha512-ojO1Anf4ITL7OskuUYoLI3bldQ36XNLpG2cYQZ4F6LZbBZnRY8umW6TeWzb9h/aX8UFwYp9vWbQ8R/FaMtMEeg==} + '@pnpm/workspace.read-manifest@1000.1.5': + resolution: {integrity: sha512-2oSdHnL1n9SCAsGySFFbQeLSydv5KA87781ifS17/uY7c9eEd8vMIpjcXG4Mws1ri+B+1rSCy/1T3gfdLGgOsQ==} engines: {node: '>=18.12'} '@pnpm/workspace.spec-parser@1000.0.0': resolution: {integrity: sha512-uiCSwv0vRldMhkYRN1BDMLxn1g9KWku8lq8WutybWvKPvYg/xvHHX3s2LiVOerCP45Kys5o8DILSENQc+uaF+w==} engines: {node: '>=18.12'} - '@pnpm/write-project-manifest@1000.0.16': - resolution: {integrity: sha512-zG68fk03ryot7TWUl9S/ShQ91uHWzIL9sVr2aQCuNHJo8G9kjsG6S0p58Zj/voahdDQeakZYYBSJ0mjNZeiJnw==} - engines: {node: '>=18.12'} - - '@pnpm/yaml.document-sync@1000.0.0': - resolution: {integrity: sha512-aEmCtfPJejq9I/q7pIYNo3Q0ryPrUoR57noCJbU+f0zNmg8JKG5YVVfCVvo5KNnG3LlN/MDyWvSHTeqy+HCoWA==} + '@pnpm/write-project-manifest@1000.0.8': + resolution: {integrity: sha512-5bfAJcx/SMGDjWc9U1DFEbJrghZR9C+7iQF/0S64ASeAUBA3i1q0ZsTmQzbtR9G7YhD+22n9R/nw1UQbpPgbXg==} engines: {node: '>=18.12'} '@postman/form-data@3.1.1': @@ -10962,11 +10823,11 @@ packages: resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} engines: {node: '>=18'} - '@sinclair/typebox@0.27.10': - resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinclair/typebox@0.34.48': - resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} + '@sinclair/typebox@0.34.40': + resolution: {integrity: sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -10992,6 +10853,18 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -11000,11 +10873,11 @@ packages: resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} engines: {node: ^20.17.0 || >=22.9.0} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - '@types/adm-zip@0.5.8': - resolution: {integrity: sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q==} + '@types/adm-zip@0.5.7': + resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} '@types/archy@0.0.36': resolution: {integrity: sha512-toTRTGD8trLtJsOaYbReoU/fyvRF1a4C5WtqjDZ3NnT/zvO807opSBRBJBr5VhD66JnY3BUz2UvnY5/KMAt6mw==} @@ -11018,8 +10891,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} '@types/bintrees@1.0.6': resolution: {integrity: sha512-pZWT4Bz+tWwxlDspSjdoIza4PE5lbGI4Xvs3FZV/2v5m5SDA8LwNpU8AXxlndmARO7OaQ1Vf3zFenOsNMzaRkQ==} @@ -11039,8 +10912,8 @@ packages: '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - '@types/emscripten@1.41.5': - resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} + '@types/emscripten@1.40.1': + resolution: {integrity: sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg==} '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -11057,11 +10930,11 @@ packages: '@types/hosted-git-info@3.0.5': resolution: {integrity: sha512-Dmngh7U003cOHPhKGyA7LWqrnvcTyILNgNPmNCxlx7j8MIi54iBliiT8XqVLIQ3GchoOjVAyBzNJVyuaJjqokg==} - '@types/http-cache-semantics@4.2.0': - resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-proxy@1.17.17': - resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} + '@types/http-proxy@1.17.16': + resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} '@types/ini@4.1.1': resolution: {integrity: sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==} @@ -11108,14 +10981,14 @@ packages: '@types/lodash.throttle@4.1.9': resolution: {integrity: sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g==} - '@types/lodash@4.17.24': - resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + '@types/lodash@4.17.17': + resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/micromatch@4.0.10': - resolution: {integrity: sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==} + '@types/micromatch@4.0.9': + resolution: {integrity: sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg==} '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -11129,14 +11002,14 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.19.130': - resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + '@types/node@18.19.110': + resolution: {integrity: sha512-WW2o4gTmREtSnqKty9nhqF/vA0GKd0V/rbC0OyjSk9Bz6bzlsXKT+i7WDdS/a0z74rfT2PO4dArVCSnapNLA5Q==} '@types/node@22.19.15': resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/node@22.19.7': + resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -11183,6 +11056,9 @@ packages: '@types/semver@6.2.7': resolution: {integrity: sha512-blctEWbzUFzQx799RZjzzIdBJOXmE37YYEyDtKkx5Dg+V7o/zyyAxLPiI98A2jdTtDgxZleMdfV+7p8WbRJ1OQ==} + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -11208,6 +11084,9 @@ packages: '@types/treeify@1.0.3': resolution: {integrity: sha512-hx0o7zWEUU4R2Amn+pjCBQQt23Khy/Dk56gQU5xi5jtPL1h83ACJCeFaB2M/+WO1AntvWrSoVnnCAfI1AQH4Cg==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -11223,20 +11102,12 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.35': - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@types/yarnpkg__lockfile@1.1.9': resolution: {integrity: sha512-GD4Fk15UoP5NLCNor51YdfL9MSdldKCqOC9EssrRw3HVfar9wUZ5y8Lfnp+qVD6hIinLr8ygklDYnmlnlQo12Q==} - '@typescript-eslint/eslint-plugin@8.57.1': - resolution: {integrity: sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.57.1 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/eslint-plugin@8.57.2': resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -11245,52 +11116,29 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.57.1': - resolution: {integrity: sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==} + '@typescript-eslint/parser@8.57.2': + resolution: {integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.57.1': - resolution: {integrity: sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.57.2': resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.57.1': - resolution: {integrity: sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.57.2': resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.57.1': - resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.57.2': resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.57.1': - resolution: {integrity: sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.57.2': resolution: {integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -11298,33 +11146,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.57.1': - resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.57.2': resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.57.1': - resolution: {integrity: sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.57.2': resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.57.1': - resolution: {integrity: sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.57.2': resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -11332,10 +11163,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.57.1': - resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.57.2': resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -11580,6 +11407,10 @@ packages: peerDependencies: '@yarnpkg/core': ^4.4.2 + '@yarnpkg/fslib@3.1.2': + resolution: {integrity: sha512-FpB2F1Lrm43F94klS9UN0ceOpe/PHZSpJB7bIkvReF/ba890bSdu1NokSKr998yaFee7yqeD9Wkid5ye7azF3A==} + engines: {node: '>=18.12.0'} + '@yarnpkg/fslib@3.1.5': resolution: {integrity: sha512-hXaPIWl5GZA+rXcx+yaKWUuePJruZuD+3A5A2X6paEBfFsyCD7oEp88lSMj1ym1ehBWUmhNH/YGOp+SrbmSBPg==} engines: {node: '>=18.12.0'} @@ -11601,8 +11432,12 @@ packages: resolution: {integrity: sha512-mQZgUSgFurUtA07ceMjxrWkYz8QtDuYkvPlu0ZqncgjopQ0t6CNEo/OSealkmnagSUx8ZD5ewvezUwUuMqutQg==} engines: {node: '>=18.12.0'} - '@yarnpkg/pnp@4.1.3': - resolution: {integrity: sha512-PsRujup+6DpgXexQe0Wh4h+syQhdruhounJjqbBMXV3meOzqr7k0Nj9+jwQ4t16EZJrhVxH7vRvjZ+VitH5aWQ==} + '@yarnpkg/pnp@4.0.8': + resolution: {integrity: sha512-D0hcRPYgYlp4W98tWYG4tCNEyenL6yxazWCxzxdnKF1r9rauDMImtAR5Sh0ERSrTf3lHKXAz8Jy7S+ztOxf7yQ==} + engines: {node: '>=18.12.0'} + + '@yarnpkg/pnp@4.1.1': + resolution: {integrity: sha512-IDI3dBnxOY/JEyNn3rg9UD0Zw8R1oX8uc4XIa+qoE0duvEqNaNBhpZTlgf11alYf2sTanIg4R/FQsmgmMR0oOA==} engines: {node: '>=18.12.0'} '@yarnpkg/shell@4.0.0': @@ -11687,6 +11522,15 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} @@ -11700,8 +11544,8 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} agentkeepalive@4.6.0: @@ -11735,8 +11579,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} ansi-regex@2.1.1: @@ -11751,6 +11595,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + engines: {node: '>=12'} + ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} @@ -11766,6 +11614,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -11788,6 +11640,9 @@ packages: resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} deprecated: This package is no longer supported. + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -11861,8 +11716,11 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - b4a@1.8.0: - resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} peerDependencies: react-native-b4a: '*' peerDependenciesMeta: @@ -11909,44 +11767,9 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.6: - resolution: {integrity: sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.8.0: - resolution: {integrity: sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.10.0: - resolution: {integrity: sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.4.0: - resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.10: - resolution: {integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==} - engines: {node: '>=6.0.0'} - hasBin: true - bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -11978,12 +11801,15 @@ packages: bluebird@2.11.0: resolution: {integrity: sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + body-parser@2.2.1: + resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} engines: {node: '>=18'} - bole@5.0.28: - resolution: {integrity: sha512-l+yybyZLV7zTD6EuGxoXsilpER1ctMCpdOqjSYNigJJma39ha85fzCtYccPx06oR1u7uCQLOcUAFFzvfXVBmuQ==} + bole@5.0.17: + resolution: {integrity: sha512-q6F82qEcUQTP178ZEY4WI1zdVzxy+fOnSF1dOMyC16u1fc0c24YrDPbgxA6N5wGHayCUdSBWsF8Oy7r2AKtQdA==} + + bole@5.0.19: + resolution: {integrity: sha512-OgMuI8erST2t4K/Y+tSsn4SOxlKj4JR2wluQgLYadQFPIhj0r3jcmnp0OthgiyNO91CnxR8woKeLQmnMPgl1Ug==} brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} @@ -11999,8 +11825,8 @@ packages: browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.25.3: + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -12079,8 +11905,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-keys@10.0.2: - resolution: {integrity: sha512-PVHCLVbJ7nWGal0lPAmBN5eSLjIynlMUk2EPmL9aPl6QyJ6+FoszTKwldPzkuVqg5teZbPTbb8Oenzyw9GSJRw==} + camelcase-keys@10.0.1: + resolution: {integrity: sha512-kIH5nQUKB8ORZrwjk40GUgnhzuzxwKb6n5L+anOVmVSrjgix1pfNqVNl0tEcOP4AaFYdke3NNpNiGDSD112lcA==} engines: {node: '>=20'} camelcase-keys@6.2.2: @@ -12103,6 +11929,10 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + camelcase@9.0.0: resolution: {integrity: sha512-TO9xmyXTZ9HUHI8M1OnvExxYB0eYVS/1e5s7IDMTAoIcwUd+aNcFODs6Xk83mobk0velyHFQgA1yIrvYc6wclw==} engines: {node: '>=20'} @@ -12123,8 +11953,8 @@ packages: resolution: {integrity: sha512-4wXLh+SqvKDzWND9SGE8cWllVMc65LxHVrCePc56IbfrtORUyxTWCVMI8rbGIVRBSNf5C+zbfaken7Abs34AEQ==} engines: {node: '>=22.13'} - caniuse-lite@1.0.30001781: - resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==} + caniuse-lite@1.0.30001737: + resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -12141,6 +11971,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.0: + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -12152,6 +11986,9 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} @@ -12163,12 +12000,12 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} - cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -12249,8 +12086,8 @@ packages: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} - collect-v8-coverage@1.0.3: - resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -12289,8 +12126,8 @@ packages: resolution: {integrity: sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==} engines: {node: '>= 6'} - comment-parser@1.4.5: - resolution: {integrity: sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==} + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} compare-func@2.0.0: @@ -12347,11 +12184,11 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} core-util-is@1.0.2: @@ -12364,8 +12201,8 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} - cosmiconfig-typescript-loader@6.2.0: - resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} + cosmiconfig-typescript-loader@6.1.0: + resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} engines: {node: '>=v18'} peerDependencies: '@types/node': '*' @@ -12381,6 +12218,9 @@ packages: typescript: optional: true + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} @@ -12454,10 +12294,6 @@ packages: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -12473,6 +12309,14 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -12499,8 +12343,8 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decamelize@6.0.1: - resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} decode-named-character-reference@1.3.0: @@ -12510,8 +12354,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -12592,8 +12436,12 @@ packages: resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -12607,6 +12455,10 @@ packages: resolution: {integrity: sha512-+yW4SNY7W2DOWe2Jx5H4c2qMTFbLGM6wIyoDPkAPy66X+sD1KfYjBPAIWPVsYqMxelflaMQCloZDudELIPhLqA==} engines: {node: ^18.12.0 || >=20.9.0} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} @@ -12631,8 +12483,8 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -12645,6 +12497,9 @@ packages: each-limit@1.0.0: resolution: {integrity: sha512-9GMDx+2h6lIE1ZMXyCehATlnH/m29DiYV2090bmd68actuyiTiTkOGvdjU2PpzKzgw37zoYecMmJUv4JcVQHvQ==} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} @@ -12654,8 +12509,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.322: - resolution: {integrity: sha512-vFU34OcrvMcH66T+dYC3G4nURmgfDVewMIu6Q2urXpumAPSMmzvcn04KVVV8Opikq8Vs5nUbO/8laNhNRqSzYw==} + electron-to-chromium@1.5.211: + resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -12664,10 +12519,17 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encode-registry@3.0.1: resolution: {integrity: sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==} engines: {node: '>=10'} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -12678,8 +12540,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -12706,11 +12568,11 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -12775,6 +12637,9 @@ packages: unrs-resolver: optional: true + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -12794,24 +12659,21 @@ packages: eslint-import-resolver-node: optional: true - eslint-plugin-jest@29.15.0: - resolution: {integrity: sha512-ZCGr7vTH2WSo2hrK5oM2RULFmMruQ7W3cX7YfwoTiPfzTGTFBMmrVIz45jZHd++cGKj/kWf02li/RhTGcANJSA==} + eslint-plugin-jest@29.12.1: + resolution: {integrity: sha512-Rxo7r4jSANMBkXLICJKS0gjacgyopfNAsoS0e3R9AHnjoKuQOaaPfmsDJPi8UWwygI099OV/K/JhpYRVkxD4AA==} engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + eslint: ^8.57.0 || ^9.0.0 jest: '*' - typescript: '>=4.8.4 <6.0.0' peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true jest: optional: true - typescript: - optional: true - eslint-plugin-n@17.24.0: - resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} + eslint-plugin-n@17.23.2: + resolution: {integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -12849,8 +12711,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.0.3: - resolution: {integrity: sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==} + eslint@10.1.0: + resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -12899,8 +12761,8 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} @@ -12929,12 +12791,16 @@ packages: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} + expect@30.0.5: + resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + expect@30.3.0: resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exponential-backoff@3.1.3: - resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} express-rate-limit@5.5.1: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} @@ -12949,6 +12815,10 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + extsprintf@1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} @@ -12980,19 +12850,27 @@ packages: resolution: {integrity: sha512-PY66/8HelapGo5nqMN17ZTKqJj1nppuS1OoC9Y0aI2jsUDlZDEYhMODTpb68wVCq+xMbaEbPGXRd7qutHzkRXA==} engines: {node: ^14.13.1 || >=16.0.0} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -13011,10 +12889,6 @@ packages: domexception: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -13039,8 +12913,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-root@1.1.0: @@ -13084,11 +12958,11 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -13110,14 +12984,10 @@ packages: form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -13130,6 +13000,14 @@ packages: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + engines: {node: '>=14.14'} + + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + fs-extra@11.3.4: resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} engines: {node: '>=14.14'} @@ -13187,10 +13065,6 @@ packages: resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} deprecated: This package is no longer supported. - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - gensequence@8.0.8: resolution: {integrity: sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==} engines: {node: '>=20'} @@ -13219,8 +13093,8 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-port@7.2.0: - resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} get-proto@1.0.1: @@ -13250,8 +13124,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} @@ -13417,16 +13291,16 @@ packages: resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hosted-git-info@6.1.3: + resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} - hosted-git-info@8.1.0: - resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} - engines: {node: ^18.17.0 || >=20.5.0} - - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + hosted-git-info@9.0.0: + resolution: {integrity: sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==} engines: {node: ^20.17.0 || >=22.9.0} hpagent@1.2.0: @@ -13494,8 +13368,8 @@ packages: https-proxy-server-express@0.1.2: resolution: {integrity: sha512-wG6/7qwT/DVwI2PW428uoanIjfq5VsfdauROg8HVPSvrXfS8CEoKGkmilanBX8kzUgj145ab3da2Qvci3UbQhw==} - human-id@4.1.3: - resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true human-signals@2.1.0: @@ -13517,10 +13391,18 @@ packages: hyperdrive-schemas@2.0.0: resolution: {integrity: sha512-mzD741NjsSt3ttIaavbh3zyNdR3zy0X55HRweNRsw/JEduWjaoOZa6EXz7ly2JxuD7MvAbJxsuNPlnVl9saL6w==} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -13553,6 +13435,9 @@ packages: engines: {node: '>=8'} hasBin: true + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -13568,8 +13453,8 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@1.2.0: - resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} engines: {node: '>=18'} individual@3.0.0: @@ -13597,8 +13482,8 @@ packages: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} - inquirer@9.3.8: - resolution: {integrity: sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==} + inquirer@9.3.7: + resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} engines: {node: '>=18'} internal-slot@1.1.0: @@ -13609,8 +13494,8 @@ packages: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -13684,8 +13569,8 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -13850,9 +13735,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} isexe@4.0.0: resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} @@ -13877,8 +13762,8 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - jackspeak@4.2.3: - resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} jest-changed-files@30.3.0: @@ -13914,6 +13799,10 @@ packages: ts-node: optional: true + jest-diff@30.0.5: + resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-diff@30.3.0: resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -13946,14 +13835,26 @@ packages: resolution: {integrity: sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.0.5: + resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.3.0: resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.0.5: + resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.3.0: resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.0.5: + resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.3.0: resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -14003,6 +13904,10 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.0.5: + resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@30.3.0: resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -14037,8 +13942,8 @@ packages: node-notifier: optional: true - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true js-tokens@4.0.0: @@ -14051,6 +13956,9 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdoc-type-pratt-parser@7.1.1: resolution: {integrity: sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==} engines: {node: '>=20.0.0'} @@ -14275,6 +14183,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + lru-cache@11.2.7: resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} @@ -14302,6 +14214,9 @@ packages: resolution: {integrity: sha512-YKBz1FUAkNBFkQCBdGvLgeq1d4grJOhcKLra9wkOklqdrn7JJwB3d7r9gZlQC/1EXAQQ4YkFO/EfnhvHXh3LpQ==} engines: {node: '>=22.13'} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@14.0.3: resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -14328,9 +14243,9 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} - map-obj@6.0.0: - resolution: {integrity: sha512-PwDvwt/tK70+luLw5k9ySLtzLAzwf7tZTY9GBj63Y010nHRPjwHcQTpTd5JwQqITC2ty7prtxBo71iwyYY0TAg==} - engines: {node: '>=20'} + map-obj@5.0.2: + resolution: {integrity: sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} @@ -14515,11 +14430,11 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} minimatch@7.4.9: @@ -14565,6 +14480,10 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -14605,14 +14524,19 @@ packages: napi-macros@2.2.2: resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} - napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + napi-postinstall@0.3.3: + resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -14641,11 +14565,6 @@ packages: resolution: {integrity: sha512-DDpmn5oLEdCTclEqweOT4U7bEpuoifBMFUXem9sA4turDAZ5tlbrEoWqCorwXey8CaAw44mst5JOQeVNiwtkhw==} engines: {node: '>= 10.13'} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -14655,10 +14574,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-gyp-build-optional-packages@5.2.2: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true @@ -14680,8 +14595,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} @@ -14712,14 +14627,14 @@ packages: resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} - normalize-package-data@7.0.1: - resolution: {integrity: sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==} - engines: {node: ^18.17.0 || >=20.5.0} - normalize-package-data@8.0.0: resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -14728,6 +14643,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-registry-url@2.0.0: + resolution: {integrity: sha512-3e9FwDyRAhbxXw4slm4Tjv40u78yPwMc/WZkACpqNQOs5sM7wic853AeTLkMFEVhivZkclGYlse8iYsklz0Yvg==} + normalize-registry-url@2.0.1: resolution: {integrity: sha512-Ad5kiOvJFA62l6bkzuekf3AbEyCPweePeGIfU9iHtqem68EVKu2Tr6YM+xmO1dkwTzKgTCqzb3NqfIEtWWbQBg==} @@ -14909,6 +14827,10 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@7.1.0: + resolution: {integrity: sha512-7LbrpOjbzBWFHFgRtVrIAwBwW1bB7c7n914Q2+CXr1TvOfbTrVHAEH1Ya9PwDwAoKLeiRrczymYWPwaHNOQ0vA==} + engines: {node: '>=20'} + p-limit@7.3.0: resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} engines: {node: '>=20'} @@ -14941,8 +14863,8 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} p-memoize@4.0.1: @@ -14969,6 +14891,10 @@ packages: resolution: {integrity: sha512-3sG3UlpisPSaX+o7u2q01hIQmrpkvdl5GSO1ZwL7pfc5kHB2bPF0eFNCfYTrW1/LTUdgmPwBAvmT0Zr8eSmaAQ==} engines: {node: '>=12'} + p-settle@4.1.1: + resolution: {integrity: sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==} + engines: {node: '>=10'} + p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} @@ -15014,6 +14940,10 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse-npm-tarball-url@3.0.0: + resolution: {integrity: sha512-InpdgIdNe5xWMEUcrVQUniQKwnggBtJ7+SCwh7zQAZwbbIYZV9XdgJyhtmDSSvykFyQXoe4BINnzKTfCwWLs5g==} + engines: {node: '>=8.15'} + parse-npm-tarball-url@4.0.0: resolution: {integrity: sha512-XueE/Vkz0fzKhMu2L+pBrfpCn5lSnvdbfsVg5+hj0KWQ1VtcHhWRSDyiz9vEdj3I9DKHXoIUAVqkh3I1lwuP/g==} engines: {node: '>=18.12'} @@ -15067,6 +14997,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -15078,16 +15012,16 @@ packages: resolution: {integrity: sha512-92olbatybjsHTGB2CUnAM7s0mU/27gcMfLNA7t09UftndUdxywlQKur3fzXEPpfLrgZD3I2Bt8+UmiL7YDEgXQ==} engines: {node: '>=8.15'} - path-temp@2.1.1: - resolution: {integrity: sha512-2pIjpQb28baC42ttBsQuRRqZ33a8DnWzfSwEFKJjz7SMiCmBECUOebUNLTmmPCG8F4ZIXG7ZRJ8FAxYXdx0Jiw==} + path-temp@2.1.0: + resolution: {integrity: sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w==} engines: {node: '>=8.15'} path-temp@3.0.0: resolution: {integrity: sha512-5lJ7KUrynYR0TTTiU9SELstnX2fhz8qJ1rBfsEaI1IT3WDWcVkrg8T3lTUSJ/LJkIvrolbF0cFcq9shBC0jzxQ==} engines: {node: '>=22.13'} - path-to-regexp@0.1.13: - resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -15102,12 +15036,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pidtree@0.6.0: @@ -15129,8 +15063,8 @@ packages: pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - pino-std-serializers@7.1.0: - resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} pino@9.14.0: resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} @@ -15189,6 +15123,10 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@30.0.5: + resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.3.0: resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -15197,8 +15135,8 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} print-diff@2.0.0: @@ -15271,8 +15209,8 @@ packages: pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -15288,8 +15226,8 @@ packages: resolution: {integrity: sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==} hasBin: true - qs@6.14.2: - resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} qs@6.15.0: @@ -15448,8 +15386,8 @@ packages: peerDependencies: unified: '*' - rename-overwrite@6.0.6: - resolution: {integrity: sha512-bSbsw/VyMyDez6NJKxqURBCLRCm98uezWBi03UZCeEFccCNIthC6Jk5JazMjexOTdrYd4q/jIxTIwGtgk1k1gA==} + rename-overwrite@6.0.3: + resolution: {integrity: sha512-Daqe51STnrCUq/t4dbzCtfNBLElrqVpCtuWK0MuPrzUi6K/13E98y3E8/kzuMZt6IEmghMnF41J0AidrFqjZUA==} engines: {node: '>=18'} rename-overwrite@7.0.1: @@ -15501,6 +15439,11 @@ packages: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -15611,8 +15554,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sanitize-filename@1.6.4: - resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} @@ -15630,17 +15573,22 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-blocking@2.0.0: @@ -15678,9 +15626,6 @@ packages: engines: {node: '>=18'} hasBin: true - shlex@2.1.2: - resolution: {integrity: sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==} - shlex@3.0.0: resolution: {integrity: sha512-jHPXQQk9d/QXCvJuLPYMOYWez3c43sORAgcIEoV7bFv5AJSJRAOyw5lQO12PMfd385qiLRCaDt7OtEzgrIGZUA==} @@ -15758,15 +15703,15 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@3.8.1: resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} - sonic-boom@4.2.1: - resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} sort-keys@4.2.0: resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} @@ -15811,12 +15756,15 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} split-cmd@1.1.0: resolution: {integrity: sha512-WhWthSU0kpuxXPbm3QW/QGS+B7ngFb+E1SGXccrUO/ZBcwnG0zuHk1E8v0UJ9HfyDi46k8wZ3dcl5gwa4c2v8g==} + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -15824,6 +15772,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -15837,6 +15788,10 @@ packages: resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} engines: {node: ^18.17.0 || >=20.5.0} + ssri@13.0.0: + resolution: {integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==} + engines: {node: ^20.17.0 || >=22.9.0} + ssri@13.0.1: resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -15853,6 +15808,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + stacktracey@2.2.0: resolution: {integrity: sha512-ETyQEz+CzXiLjEbyJqpbp+/T79RQD/6wqFucRBIlVNZfYq2Ay7wbretD4cxpbymZlaPWx58aIhPEY1Cr8DlVvg==} @@ -15877,8 +15835,8 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamx@2.25.0: - resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -15896,6 +15854,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string-width@8.2.0: resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} engines: {node: '>=20'} @@ -15930,6 +15892,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} @@ -15965,8 +15931,8 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-indent@4.1.1: - resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} engines: {node: '>=12'} strip-json-comments@3.1.1: @@ -16002,35 +15968,25 @@ packages: engines: {node: '>=18.12'} hasBin: true - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tagged-tag@1.0.0: - resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} - engines: {node: '>=20'} - - tapable@2.3.2: - resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar-stream@3.1.8: - resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} - tar@7.5.13: resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} - teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -16059,8 +16015,8 @@ packages: resolution: {integrity: sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==} engines: {node: 20 || >=22} - text-decoder@1.2.7: - resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -16068,12 +16024,18 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} - engines: {node: '>=18'} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} @@ -16141,8 +16103,8 @@ packages: truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -16155,6 +16117,20 @@ packages: ts-jest-resolver@2.0.1: resolution: {integrity: sha512-FolE73BqVZCs8/RbLKxC67iaAtKpBWx7PeLKFW2zJQlOf9j851I7JRxSDenri2NFvVH3QP7v3S8q1AmL24Zb9Q==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} @@ -16227,10 +16203,6 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.5.0: - resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} - engines: {node: '>=20'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -16267,8 +16239,8 @@ packages: types-ramda@0.31.0: resolution: {integrity: sha512-vaoC35CRC3xvL8Z6HkshDbi6KWM1ezK0LHN0YyxXWUn9HKzBNg/T3xSGlJZjCYspnOD3jE7bcizsp0bUXZDxnQ==} - typescript-eslint@8.57.1: - resolution: {integrity: sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==} + typescript-eslint@8.57.2: + resolution: {integrity: sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -16301,8 +16273,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici@7.19.2: + resolution: {integrity: sha512-4VQSpGEGsWzk0VYxyB/wVX/Q7qf9t5znLRgs0dzszr9w9Fej/8RVNQ+S20vdXSAyra/bJ7ZQfGv6ZMj7UEbzSg==} + engines: {node: '>=20.18.1'} unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} @@ -16376,8 +16349,8 @@ packages: upath2@3.1.23: resolution: {integrity: sha512-HQ7CivlKonWnq7m7VZuZHIDXXUCHOoCoIqgVyCk/z/wsuB/agGwGFhFjGSTArGlvBddiejrW4ChW6SwEMhAURQ==} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -16406,6 +16379,9 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} @@ -16484,10 +16460,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -16514,8 +16486,8 @@ packages: resolution: {integrity: sha512-kLoLJ/y2o0GnU8ZNgI5/nlCbyjpUlqtaJQjMrzR2sKyQQ3BcJJ61oSOdZWIrfoScunyZS5w9U0wyFb0Bij9cyg==} engines: {node: '>=22.13'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -16560,6 +16532,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -16574,6 +16550,10 @@ packages: resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} engines: {node: ^18.17.0 || >=20.5.0} + write-file-atomic@7.0.0: + resolution: {integrity: sha512-YnlPC6JqnZl6aO4uRc+dx5PHguiR9S6WeoLtpxNT9wIG+BDya7ZNE1q7KOjVgaA73hKhKLpVPgJ5QA9THQ5BRg==} + engines: {node: ^20.17.0 || >=22.9.0} + write-file-atomic@7.0.1: resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} engines: {node: ^20.17.0 || >=22.9.0} @@ -16639,6 +16619,11 @@ packages: yaml-tag@1.1.0: resolution: {integrity: sha512-74LVCSjG8KlWeHvIAHk7mrDz/QPnqVtDyQ5PNGxsDOzNdZ9sxHUVvEvSWqqdhg0bIdk0Zv1Y7ConCEJr87lmVw==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yaml@2.8.3: resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} @@ -16660,12 +16645,16 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} yoctocolors-cjs@2.1.3: @@ -16681,191 +16670,228 @@ packages: snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + '@arcanis/slice-ansi@1.1.1': dependencies: grapheme-splitter: 1.0.4 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} + '@babel/compat-data@7.28.0': {} - '@babel/core@7.29.0': + '@babel/core@7.28.3': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2(@babel/types@7.29.0) - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3(@babel/types@7.28.2) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 7.7.4 + semver: 7.7.3 transitivePeerDependencies: - supports-color + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3(@babel/types@7.28.2) + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.2(@babel/types@7.29.0) '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.29.0 + '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.25.3 lru-cache: 5.1.1 - semver: 7.7.4 + semver: 7.7.3 '@babel/helper-globals@7.28.0': {} - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 transitivePeerDependencies: - supports-color + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.29.2': + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/parser@7.28.3(@babel/types@7.28.2)': + dependencies: + '@babel/types': 7.28.2 + + '@babel/parser@7.28.3(@babel/types@7.29.0)': dependencies: - '@babel/template': 7.28.6 '@babel/types': 7.29.0 '@babel/parser@7.29.2(@babel/types@7.29.0)': dependencies: '@babel/types': 7.29.0 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.28.3': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.3(@babel/types@7.28.2) + '@babel/types': 7.28.2 '@babel/template@7.28.6': dependencies: @@ -16873,6 +16899,18 @@ snapshots: '@babel/parser': 7.29.2(@babel/types@7.29.0) '@babel/types': 7.29.0 + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3(@babel/types@7.28.2) + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -16885,6 +16923,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -16908,7 +16951,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.4 + semver: 7.7.3 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -16917,7 +16960,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.4 + semver: 7.7.3 '@changesets/changelog-git@0.2.1': dependencies: @@ -16948,7 +16991,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.4 + semver: 7.7.3 spawndamnit: 3.0.1 term-size: 2.2.1 transitivePeerDependencies: @@ -16974,7 +17017,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.4 + semver: 7.7.3 '@changesets/get-release-plan@4.0.15': dependencies: @@ -17034,7 +17077,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 4.1.3 + human-id: 4.1.1 prettier: 2.8.8 '@commitlint/cli@20.5.0(@types/node@22.19.15)(conventional-commits-parser@6.3.0)(typescript@5.9.3)': @@ -17044,7 +17087,7 @@ snapshots: '@commitlint/load': 20.5.0(@types/node@22.19.15)(typescript@5.9.3) '@commitlint/read': 20.5.0(conventional-commits-parser@6.3.0) '@commitlint/types': 20.5.0 - tinyexec: 1.0.4 + tinyexec: 1.0.1 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -17081,7 +17124,7 @@ snapshots: '@commitlint/is-ignored@20.5.0': dependencies: '@commitlint/types': 20.5.0 - semver: 7.7.4 + semver: 7.7.3 '@commitlint/lint@20.5.0': dependencies: @@ -17097,7 +17140,7 @@ snapshots: '@commitlint/resolve-extends': 20.5.0 '@commitlint/types': 20.5.0 cosmiconfig: 9.0.1(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@22.19.15)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.19.15)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3) is-plain-obj: 4.1.0 lodash.mergewith: 4.6.2 picocolors: 1.1.1 @@ -17116,8 +17159,8 @@ snapshots: '@commitlint/prompt-cli@20.5.0(@types/node@22.19.15)(typescript@5.9.3)': dependencies: '@commitlint/prompt': 20.5.0(@types/node@22.19.15)(typescript@5.9.3) - inquirer: 9.3.8(@types/node@22.19.15) - tinyexec: 1.0.4 + inquirer: 9.3.7 + tinyexec: 1.0.1 transitivePeerDependencies: - '@types/node' - typescript @@ -17127,7 +17170,7 @@ snapshots: '@commitlint/ensure': 20.5.0 '@commitlint/load': 20.5.0(@types/node@22.19.15)(typescript@5.9.3) '@commitlint/types': 20.5.0 - inquirer: 9.3.8(@types/node@22.19.15) + inquirer: 9.3.7 picocolors: 1.1.1 transitivePeerDependencies: - '@types/node' @@ -17139,7 +17182,7 @@ snapshots: '@commitlint/types': 20.5.0 git-raw-commits: 5.0.1(conventional-commits-parser@6.3.0) minimist: 1.2.8 - tinyexec: 1.0.4 + tinyexec: 1.0.1 transitivePeerDependencies: - conventional-commits-filter - conventional-commits-parser @@ -17149,7 +17192,7 @@ snapshots: '@commitlint/config-validator': 20.5.0 '@commitlint/types': 20.5.0 global-directory: 4.0.1 - import-meta-resolve: 4.2.0 + import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 @@ -17175,7 +17218,7 @@ snapshots: dependencies: '@simple-libs/child-process-utils': 1.0.2 '@simple-libs/stream-utils': 1.2.0 - semver: 7.7.4 + semver: 7.7.3 optionalDependencies: conventional-commits-parser: 6.3.0 @@ -17194,14 +17237,14 @@ snapshots: '@cspell/dict-data-science': 2.0.13 '@cspell/dict-django': 4.1.6 '@cspell/dict-docker': 1.1.17 - '@cspell/dict-dotnet': 5.0.12 + '@cspell/dict-dotnet': 5.0.13 '@cspell/dict-elixir': 4.0.8 '@cspell/dict-en-common-misspellings': 2.1.12 '@cspell/dict-en-gb-mit': 3.1.22 '@cspell/dict-en_us': 4.4.33 '@cspell/dict-filetypes': 3.0.18 '@cspell/dict-flutter': 1.1.1 - '@cspell/dict-fonts': 4.0.6 + '@cspell/dict-fonts': 4.0.5 '@cspell/dict-fsharp': 1.1.1 '@cspell/dict-fullstack': 3.2.9 '@cspell/dict-gaming-terms': 1.1.2 @@ -17225,14 +17268,14 @@ snapshots: '@cspell/dict-npm': 5.2.38 '@cspell/dict-php': 4.1.1 '@cspell/dict-powershell': 5.0.15 - '@cspell/dict-public-licenses': 2.0.16 + '@cspell/dict-public-licenses': 2.0.15 '@cspell/dict-python': 4.2.26 '@cspell/dict-r': 2.1.1 '@cspell/dict-ruby': 5.1.1 '@cspell/dict-rust': 4.1.2 '@cspell/dict-scala': 5.0.9 '@cspell/dict-shell': 1.1.2 - '@cspell/dict-software-terms': 5.2.1 + '@cspell/dict-software-terms': 5.2.2 '@cspell/dict-sql': 2.2.1 '@cspell/dict-svelte': 1.0.7 '@cspell/dict-swift': 2.0.6 @@ -17289,7 +17332,7 @@ snapshots: '@cspell/dict-docker@1.1.17': {} - '@cspell/dict-dotnet@5.0.12': {} + '@cspell/dict-dotnet@5.0.13': {} '@cspell/dict-elixir@4.0.8': {} @@ -17303,7 +17346,7 @@ snapshots: '@cspell/dict-flutter@1.1.1': {} - '@cspell/dict-fonts@4.0.6': {} + '@cspell/dict-fonts@4.0.5': {} '@cspell/dict-fsharp@1.1.1': {} @@ -17356,7 +17399,7 @@ snapshots: '@cspell/dict-powershell@5.0.15': {} - '@cspell/dict-public-licenses@2.0.16': {} + '@cspell/dict-public-licenses@2.0.15': {} '@cspell/dict-python@4.2.26': dependencies: @@ -17372,7 +17415,7 @@ snapshots: '@cspell/dict-shell@1.1.2': {} - '@cspell/dict-software-terms@5.2.1': {} + '@cspell/dict-software-terms@5.2.2': {} '@cspell/dict-sql@2.2.1': {} @@ -17401,6 +17444,11 @@ snapshots: '@cspell/url@9.7.0': {} + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + '@cyclonedx/cyclonedx-library@10.0.0(ajv@8.18.0)(spdx-expression-parse@4.0.0)': optionalDependencies: ajv: 8.18.0 @@ -17414,31 +17462,31 @@ snapshots: combined-stream: 1.0.8 extend: 3.0.2 forever-agent: 0.6.1 - form-data: 4.0.5 + form-data: 4.0.4 http-signature: 1.4.0 is-typedarray: 1.0.0 isstream: 0.1.2 json-stringify-safe: 5.0.1 mime-types: 2.1.35 performance-now: 2.1.0 - qs: 6.14.2 + qs: 6.14.1 safe-buffer: 5.2.1 tough-cookie: 5.1.2 tunnel-agent: 0.6.0 uuid: 8.3.2 - '@emnapi/core@1.9.1': + '@emnapi/core@1.4.5': dependencies: - '@emnapi/wasi-threads': 1.2.0 + '@emnapi/wasi-threads': 1.0.4 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.1': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.0': + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true @@ -17523,9 +17571,14 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.0.3(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@10.1.0(jiti@2.5.1))': dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.5.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.5.1))': + dependencies: + eslint: 10.1.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -17546,9 +17599,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.0.3(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.5.1))': optionalDependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.5.1) '@eslint/object-schema@3.0.3': {} @@ -17575,17 +17628,24 @@ snapshots: '@inquirer/external-editor@1.0.3(@types/node@22.19.15)': dependencies: chardet: 2.1.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.0 optionalDependencies: '@types/node': 22.19.15 - '@inquirer/figures@1.0.15': {} + '@inquirer/figures@1.0.13': {} - '@isaacs/cliui@9.0.0': {} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.3 + minipass: 7.1.2 '@istanbuljs/load-nyc-config@1.1.0': dependencies: @@ -17600,13 +17660,13 @@ snapshots: '@jest/console@30.3.0': dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 chalk: 4.1.2 jest-message-util: 30.3.0 jest-util: 30.3.0 slash: 3.0.0 - '@jest/core@30.3.0(@babel/types@7.29.0)': + '@jest/core@30.3.0(@babel/types@7.29.0)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3))': dependencies: '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 @@ -17614,14 +17674,14 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0(@babel/types@7.29.0) '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) jest-changed-files: 30.3.0 - jest-config: 30.3.0(@babel/types@7.29.0)(@types/node@25.5.0) + jest-config: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)) jest-haste-map: 30.3.0 jest-message-util: 30.3.0 jest-regex-util: 30.0.1 @@ -17642,15 +17702,21 @@ snapshots: - supports-color - ts-node + '@jest/diff-sequences@30.0.1': {} + '@jest/diff-sequences@30.3.0': {} '@jest/environment@30.3.0': dependencies: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.7 jest-mock: 30.3.0 + '@jest/expect-utils@30.0.5': + dependencies: + '@jest/get-type': 30.0.1 + '@jest/expect-utils@30.3.0': dependencies: '@jest/get-type': 30.1.0 @@ -17666,11 +17732,13 @@ snapshots: dependencies: '@jest/types': 30.3.0 '@sinonjs/fake-timers': 15.1.1 - '@types/node': 25.5.0 + '@types/node': 22.19.7 jest-message-util: 30.3.0 jest-mock: 30.3.0 jest-util: 30.3.0 + '@jest/get-type@30.0.1': {} + '@jest/get-type@30.1.0': {} '@jest/globals@30.3.0': @@ -17684,7 +17752,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.15 jest-regex-util: 30.0.1 '@jest/reporters@30.3.0(@babel/types@7.29.0)': @@ -17694,10 +17762,10 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0(@babel/types@7.29.0) '@jest/types': 30.3.0 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 25.5.0 + '@jridgewell/trace-mapping': 0.3.30 + '@types/node': 22.19.15 chalk: 4.1.2 - collect-v8-coverage: 1.0.3 + collect-v8-coverage: 1.0.2 exit-x: 0.2.2 glob: 11.1.0 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) @@ -17718,11 +17786,11 @@ snapshots: '@jest/schemas@29.6.3': dependencies: - '@sinclair/typebox': 0.27.10 + '@sinclair/typebox': 0.27.8 '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.48 + '@sinclair/typebox': 0.34.40 '@jest/snapshot-utils@30.3.0': dependencies: @@ -17733,7 +17801,7 @@ snapshots: '@jest/source-map@30.0.1': dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.30 callsites: 3.1.0 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) @@ -17742,7 +17810,7 @@ snapshots: '@jest/console': 30.3.0 '@jest/types': 30.3.0 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.3 + collect-v8-coverage: 1.0.2 '@jest/test-sequencer@30.3.0': dependencies: @@ -17751,11 +17819,31 @@ snapshots: jest-haste-map: 30.3.0 slash: 3.0.0 + '@jest/transform@30.3.0(@babel/types@7.28.2)': + dependencies: + '@babel/core': 7.28.3 + '@jest/types': 30.3.0 + '@jridgewell/trace-mapping': 0.3.30 + babel-plugin-istanbul: 7.0.1(@babel/types@7.28.2) + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) + jest-haste-map: 30.3.0 + jest-regex-util: 30.0.1 + jest-util: 30.3.0 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - '@babel/types' + - supports-color + '@jest/transform@30.3.0(@babel/types@7.29.0)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 '@jest/types': 30.3.0 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.30 babel-plugin-istanbul: 7.0.1(@babel/types@7.29.0) chalk: 4.1.2 convert-source-map: 2.0.0 @@ -17776,8 +17864,18 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.5.0 - '@types/yargs': 17.0.35 + '@types/node': 22.19.7 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jest/types@30.0.5': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.19.15 + '@types/yargs': 17.0.33 chalk: 4.1.2 '@jest/types@30.3.0': @@ -17786,34 +17884,35 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.5.0 - '@types/yargs': 17.0.35 + '@types/node': 22.19.15 + '@types/yargs': 17.0.33 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.31': + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + optional: true + '@keyv/serialize@1.1.1': {} '@lazy-node/types-path@1.0.3(ts-toolbelt@9.6.0)': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 ts-type: 3.0.10(ts-toolbelt@9.6.0) tslib: 2.8.1 transitivePeerDependencies: @@ -17821,14 +17920,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.3 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.3 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -17855,9 +17954,9 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 optional: true '@nodelib/fs.scandir@2.1.5': @@ -17870,7 +17969,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + fastq: 1.19.1 '@npm/types@1.0.2': {} @@ -17878,7 +17977,7 @@ snapshots: '@npmcli/agent@3.0.0': dependencies: - agent-base: 7.1.4 + agent-base: 7.1.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 10.4.3 @@ -17888,7 +17987,7 @@ snapshots: '@npmcli/agent@4.0.0': dependencies: - agent-base: 7.1.4 + agent-base: 7.1.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 11.2.7 @@ -17898,11 +17997,11 @@ snapshots: '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.4 + semver: 7.7.3 '@npmcli/fs@5.0.0': dependencies: - semver: 7.7.4 + semver: 7.7.3 '@npmcli/git@7.0.2': dependencies: @@ -17912,17 +18011,17 @@ snapshots: lru-cache: 11.2.7 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 - semver: 7.7.4 + semver: 7.7.3 which: 6.0.1 '@npmcli/package-json@7.0.5': dependencies: '@npmcli/git': 7.0.2 glob: 13.0.6 - hosted-git-info: 9.0.2 + hosted-git-info: 9.0.0 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 - semver: 7.7.4 + semver: 7.7.3 spdx-expression-parse: 4.0.0 '@npmcli/promise-spawn@9.0.1': @@ -17939,34 +18038,33 @@ snapshots: '@pnpm/byline@1.0.0': {} - '@pnpm/cafs-types@1000.1.0': {} + '@pnpm/cafs-types@1000.0.0': {} - '@pnpm/catalogs.config@1000.0.6': + '@pnpm/catalogs.config@1000.0.2': dependencies: - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.2 '@pnpm/catalogs.types@1000.0.0': {} - '@pnpm/cli-meta@1000.0.16': + '@pnpm/cli-meta@1000.0.8': dependencies: - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 load-json-file: 6.2.0 - '@pnpm/cli-utils@1001.3.10(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/cli-utils@1000.1.5(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0)': dependencies: - '@pnpm/cli-meta': 1000.0.16 - '@pnpm/config': 1004.11.0(@pnpm/logger@1001.0.1) - '@pnpm/config.deps-installer': 1000.1.5(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) - '@pnpm/default-reporter': 1002.1.14(@pnpm/logger@1001.0.1) - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/manifest-utils': 1002.0.5(@pnpm/logger@1001.0.1) - '@pnpm/package-is-installable': 1000.0.21(@pnpm/logger@1001.0.1) - '@pnpm/pnpmfile': 1002.1.13(@pnpm/logger@1001.0.1) - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@pnpm/store-connection-manager': 1002.3.19(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/types': 1001.3.0 - '@pnpm/util.lex-comparator': 3.0.2 + '@pnpm/cli-meta': 1000.0.8 + '@pnpm/config': 1003.1.1(@pnpm/logger@1001.0.0) + '@pnpm/config.deps-installer': 1000.0.5(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15)) + '@pnpm/default-reporter': 1002.0.1(@pnpm/logger@1001.0.0) + '@pnpm/error': 1000.0.2 + '@pnpm/logger': 1001.0.0 + '@pnpm/manifest-utils': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/package-is-installable': 1000.0.10(@pnpm/logger@1001.0.0) + '@pnpm/pnpmfile': 1001.2.2(@pnpm/logger@1001.0.0) + '@pnpm/read-project-manifest': 1000.0.11 + '@pnpm/store-connection-manager': 1002.0.3(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0) + '@pnpm/types': 1000.6.0 chalk: 4.1.2 load-json-file: 6.2.0 transitivePeerDependencies: @@ -17975,19 +18073,17 @@ snapshots: - supports-color - typanion - '@pnpm/client@1001.1.24(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/client@1000.0.19(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0)': dependencies: - '@pnpm/default-resolver': 1002.3.8(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/directory-fetcher': 1000.1.24(@pnpm/logger@1001.0.1) - '@pnpm/fetch': 1001.0.0(@pnpm/logger@1001.0.1) - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/fetching.binary-fetcher': 1005.0.4(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) - '@pnpm/git-fetcher': 1006.0.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/network.auth-header': 1000.0.7 - '@pnpm/node.fetcher': 1001.0.27(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/tarball-fetcher': 1006.0.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/types': 1001.3.0 + '@pnpm/default-resolver': 1002.0.2(@pnpm/logger@1001.0.0) + '@pnpm/directory-fetcher': 1000.1.7(@pnpm/logger@1001.0.0) + '@pnpm/fetch': 1000.2.2(@pnpm/logger@1001.0.0) + '@pnpm/fetching-types': 1000.1.0 + '@pnpm/git-fetcher': 1001.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0) + '@pnpm/network.auth-header': 1000.0.3 + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/tarball-fetcher': 1001.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0) + '@pnpm/types': 1000.6.0 ramda: '@pnpm/ramda@0.28.1' transitivePeerDependencies: - '@pnpm/logger' @@ -18000,30 +18096,28 @@ snapshots: dependencies: chalk: 4.1.2 - '@pnpm/config.config-writer@1000.1.3(@pnpm/logger@1001.0.1)': + '@pnpm/config.config-writer@1000.0.5': dependencies: - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@pnpm/types': 1001.3.0 - '@pnpm/workspace.manifest-writer': 1001.3.1 + '@pnpm/read-project-manifest': 1000.0.11 + '@pnpm/types': 1000.6.0 + '@pnpm/workspace.manifest-writer': 1000.1.4 ramda: '@pnpm/ramda@0.28.1' - transitivePeerDependencies: - - '@pnpm/logger' - '@pnpm/config.deps-installer@1000.1.5(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))': + '@pnpm/config.deps-installer@1000.0.5(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))': dependencies: - '@pnpm/config.config-writer': 1000.1.3(@pnpm/logger@1001.0.1) - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/error': 1000.1.0 - '@pnpm/fetch': 1001.0.0(@pnpm/logger@1001.0.1) - '@pnpm/logger': 1001.0.1 - '@pnpm/network.auth-header': 1000.0.7 - '@pnpm/npm-resolver': 1005.2.3(@pnpm/logger@1001.0.1) - '@pnpm/package-store': 1007.1.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) + '@pnpm/config.config-writer': 1000.0.5 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/error': 1000.0.2 + '@pnpm/fetch': 1000.2.2(@pnpm/logger@1001.0.0) + '@pnpm/logger': 1001.0.0 + '@pnpm/network.auth-header': 1000.0.3 + '@pnpm/npm-resolver': 1004.0.1(@pnpm/logger@1001.0.0) + '@pnpm/package-store': 1002.0.4(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15)) '@pnpm/parse-wanted-dependency': 1001.0.0 - '@pnpm/pick-registry-for-package': 1000.0.16 + '@pnpm/pick-registry-for-package': 1000.0.8 '@pnpm/read-modules-dir': 1000.0.0 - '@pnpm/read-package-json': 1000.1.8 - '@pnpm/types': 1001.3.0 + '@pnpm/read-package-json': 1000.0.9 + '@pnpm/types': 1000.6.0 '@zkochan/rimraf': 3.0.2 get-npm-tarball-url: 2.1.0 transitivePeerDependencies: @@ -18035,32 +18129,33 @@ snapshots: '@pnpm/config.env-replace@3.0.2': {} + '@pnpm/config.nerf-dart@1.0.0': {} + '@pnpm/config.nerf-dart@1.0.1': {} - '@pnpm/config@1004.11.0(@pnpm/logger@1001.0.1)': + '@pnpm/config@1003.1.1(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/catalogs.config': 1000.0.6 + '@pnpm/catalogs.config': 1000.0.2 '@pnpm/catalogs.types': 1000.0.0 '@pnpm/config.env-replace': 3.0.2 - '@pnpm/constants': 1001.3.1 - '@pnpm/error': 1000.1.0 + '@pnpm/constants': 1001.1.0 + '@pnpm/error': 1000.0.2 '@pnpm/git-utils': 1000.0.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/matcher': 1000.1.0 - '@pnpm/npm-conf': 3.0.2 - '@pnpm/pnpmfile': 1002.1.13(@pnpm/logger@1001.0.1) - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@pnpm/types': 1001.3.0 - '@pnpm/workspace.read-manifest': 1000.3.1 + '@pnpm/logger': 1001.0.0 + '@pnpm/matcher': 1000.0.0 + '@pnpm/npm-conf': 3.0.0 + '@pnpm/pnpmfile': 1001.2.2(@pnpm/logger@1001.0.0) + '@pnpm/read-project-manifest': 1000.0.11 + '@pnpm/types': 1000.6.0 + '@pnpm/workspace.read-manifest': 1000.1.5 better-path-resolve: 1.0.0 camelcase: 6.3.0 camelcase-keys: 6.2.2 can-write-to-dir: 1.1.1 - ci-info: 3.9.0 is-subdir: 1.2.0 is-windows: 1.0.2 lodash.kebabcase: 4.1.1 - normalize-registry-url: 2.0.1 + normalize-registry-url: 2.0.0 path-absolute: 1.0.1 path-name: 1.0.0 ramda: '@pnpm/ramda@0.28.1' @@ -18068,60 +18163,54 @@ snapshots: realpath-missing: 1.1.0 which: '@pnpm/which@3.0.1' + '@pnpm/constants@1001.1.0': {} + '@pnpm/constants@1001.3.1': {} - '@pnpm/core-loggers@1001.0.9(@pnpm/logger@1001.0.1)': + '@pnpm/core-loggers@1001.0.1(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/logger': 1001.0.1 - '@pnpm/types': 1001.3.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/types': 1000.6.0 - '@pnpm/create-cafs-store@1000.0.33(@pnpm/logger@1001.0.1)': + '@pnpm/create-cafs-store@1000.0.14(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/exec.pkg-requires-build': 1000.0.16 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/fs.indexed-pkg-importer': 1000.1.26(@pnpm/logger@1001.0.1) - '@pnpm/logger': 1001.0.1 - '@pnpm/store-controller-types': 1004.5.1 - '@pnpm/store.cafs': 1000.1.4 + '@pnpm/exec.pkg-requires-build': 1000.0.8 + '@pnpm/fetcher-base': 1000.0.11 + '@pnpm/fs.indexed-pkg-importer': 1000.1.8(@pnpm/logger@1001.0.0) + '@pnpm/logger': 1001.0.0 + '@pnpm/store-controller-types': 1003.0.2 + '@pnpm/store.cafs': 1000.0.13 mem: 8.1.1 - path-temp: 2.1.1 + path-temp: 2.1.0 ramda: '@pnpm/ramda@0.28.1' - '@pnpm/crypto.hash@1000.2.2': + '@pnpm/crypto.hash@1000.1.1': dependencies: '@pnpm/crypto.polyfill': 1000.1.0 - '@pnpm/graceful-fs': 1000.1.0 + '@pnpm/graceful-fs': 1000.0.0 ssri: 10.0.5 '@pnpm/crypto.polyfill@1000.1.0': {} - '@pnpm/crypto.shasums-file@1001.0.5': - dependencies: - '@pnpm/crypto.hash': 1000.2.2 - '@pnpm/error': 1000.1.0 - '@pnpm/fetching-types': 1000.2.1 - transitivePeerDependencies: - - domexception - - '@pnpm/dedupe.issues-renderer@1000.0.2': + '@pnpm/dedupe.issues-renderer@1000.0.1': dependencies: '@pnpm/dedupe.types': 1000.0.0 - '@pnpm/text.tree-renderer': 1000.0.0 + archy: 1.0.0 chalk: 4.1.2 '@pnpm/dedupe.types@1000.0.0': {} - '@pnpm/default-reporter@1002.1.14(@pnpm/logger@1001.0.1)': + '@pnpm/default-reporter@1002.0.1(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/cli-meta': 1000.0.16 - '@pnpm/config': 1004.11.0(@pnpm/logger@1001.0.1) - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/dedupe.issues-renderer': 1000.0.2 + '@pnpm/cli-meta': 1000.0.8 + '@pnpm/config': 1003.1.1(@pnpm/logger@1001.0.0) + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/dedupe.issues-renderer': 1000.0.1 '@pnpm/dedupe.types': 1000.0.0 - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/render-peer-issues': 1002.0.12 - '@pnpm/types': 1001.3.0 + '@pnpm/error': 1000.0.2 + '@pnpm/logger': 1001.0.0 + '@pnpm/render-peer-issues': 1002.0.0 + '@pnpm/types': 1000.6.0 '@pnpm/util.lex-comparator': 3.0.2 ansi-diff: 1.2.0 boxen: '@zkochan/boxen@5.1.2' @@ -18132,58 +18221,57 @@ snapshots: pretty-ms: 7.0.1 ramda: '@pnpm/ramda@0.28.1' rxjs: 7.8.2 - semver: 7.7.4 - stacktracey: 2.2.0 + semver: 7.7.3 + stacktracey: 2.1.8 string-length: 4.0.2 - '@pnpm/default-resolver@1002.3.8(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/default-resolver@1002.0.2(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/error': 1000.1.0 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/git-resolver': 1001.2.2(@pnpm/logger@1001.0.1) - '@pnpm/local-resolver': 1002.1.13(@pnpm/logger@1001.0.1) - '@pnpm/node.resolver': 1001.0.23(@pnpm/logger@1001.0.1) - '@pnpm/npm-resolver': 1005.2.3(@pnpm/logger@1001.0.1) - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/resolving.bun-resolver': 1005.0.11(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/resolving.deno-resolver': 1005.0.11(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/tarball-resolver': 1002.2.1 + '@pnpm/error': 1000.0.2 + '@pnpm/fetching-types': 1000.1.0 + '@pnpm/git-resolver': 1001.0.2(@pnpm/logger@1001.0.0) + '@pnpm/local-resolver': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/npm-resolver': 1004.0.1(@pnpm/logger@1001.0.0) + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/tarball-resolver': 1002.0.2 transitivePeerDependencies: - '@pnpm/logger' - - '@pnpm/worker' - domexception - supports-color - - typanion - '@pnpm/dependency-path@1001.1.10': + '@pnpm/dependency-path@1000.0.9': dependencies: - '@pnpm/crypto.hash': 1000.2.2 - '@pnpm/types': 1001.3.0 - semver: 7.7.4 + '@pnpm/crypto.hash': 1000.1.1 + '@pnpm/types': 1000.6.0 + semver: 7.7.3 - '@pnpm/directory-fetcher@1000.1.24(@pnpm/logger@1001.0.1)': + '@pnpm/directory-fetcher@1000.1.7(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/exec.pkg-requires-build': 1000.0.16 - '@pnpm/fetcher-base': 1001.2.2 + '@pnpm/exec.pkg-requires-build': 1000.0.8 + '@pnpm/fetcher-base': 1000.0.11 '@pnpm/fs.packlist': 1000.0.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/read-project-manifest': 1000.0.11 + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/types': 1000.6.0 - '@pnpm/env.system-node-version@1000.0.16': + '@pnpm/env.system-node-version@1000.0.8': dependencies: - '@pnpm/cli-meta': 1000.0.16 + '@pnpm/cli-meta': 1000.0.8 execa: safe-execa@0.1.2 mem: 8.1.1 - '@pnpm/error@1000.1.0': + '@pnpm/error@1000.0.2': + dependencies: + '@pnpm/constants': 1001.1.0 + + '@pnpm/error@1000.0.5': dependencies: '@pnpm/constants': 1001.3.1 - '@pnpm/exec.pkg-requires-build@1000.0.16': + '@pnpm/exec.pkg-requires-build@1000.0.8': dependencies: - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 '@pnpm/exec@2.0.0': dependencies: @@ -18191,109 +18279,92 @@ snapshots: command-exists: 1.2.9 cross-spawn: 7.0.6 - '@pnpm/fetch@1001.0.0(@pnpm/logger@1001.0.1)': + '@pnpm/fetch@1000.2.2(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/logger': 1001.0.1 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/fetching-types': 1000.1.0 + '@pnpm/logger': 1001.0.0 '@pnpm/network.agent': 2.0.3 - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 '@zkochan/retry': 0.2.0 node-fetch: '@pnpm/node-fetch@1.0.0' transitivePeerDependencies: - domexception - supports-color - '@pnpm/fetcher-base@1001.2.2': + '@pnpm/fetcher-base@1000.0.11': dependencies: - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/types': 1000.6.0 '@types/ssri': 7.1.5 - '@pnpm/fetching-types@1000.2.1': + '@pnpm/fetching-types@1000.1.0': dependencies: '@zkochan/retry': 0.2.0 node-fetch: '@pnpm/node-fetch@1.0.0' transitivePeerDependencies: - domexception - '@pnpm/fetching.binary-fetcher@1005.0.4(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))': + '@pnpm/find-workspace-dir@1000.1.0': dependencies: - '@pnpm/error': 1000.1.0 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) - adm-zip: 0.5.16 - is-subdir: 1.2.0 - rename-overwrite: 6.0.6 - ssri: 10.0.5 - tempy: 1.0.1 - transitivePeerDependencies: - - domexception - - '@pnpm/find-workspace-dir@1000.1.5': - dependencies: - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.2 find-up: 5.0.0 - '@pnpm/fs.find-packages@1000.0.24(@pnpm/logger@1001.0.1)': + '@pnpm/fs.find-packages@1000.0.11': dependencies: - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@pnpm/types': 1001.3.0 + '@pnpm/read-project-manifest': 1000.0.11 + '@pnpm/types': 1000.6.0 '@pnpm/util.lex-comparator': 3.0.2 p-filter: 2.1.0 tinyglobby: 0.2.15 - transitivePeerDependencies: - - '@pnpm/logger' - '@pnpm/fs.hard-link-dir@1000.0.6(@pnpm/logger@1001.0.1)': + '@pnpm/fs.hard-link-dir@1000.0.1(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - path-temp: 2.1.1 - rename-overwrite: 6.0.6 + '@pnpm/logger': 1001.0.0 - '@pnpm/fs.indexed-pkg-importer@1000.1.26(@pnpm/logger@1001.0.1)': + '@pnpm/fs.indexed-pkg-importer@1000.1.8(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/store-controller-types': 1004.5.1 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/graceful-fs': 1000.0.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/store-controller-types': 1003.0.2 '@reflink/reflink': 0.1.19 '@zkochan/rimraf': 3.0.2 - fs-extra: 11.3.4 + fs-extra: 11.3.3 make-empty-dir: 3.0.2 p-limit: 3.1.0 - path-temp: 2.1.1 - rename-overwrite: 6.0.6 - sanitize-filename: 1.6.4 + path-temp: 2.1.0 + rename-overwrite: 6.0.3 + sanitize-filename: 1.6.3 '@pnpm/fs.packlist@1000.0.0': dependencies: npm-packlist: 5.1.3 - '@pnpm/git-fetcher@1006.0.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/fs.packlist@2.0.0': dependencies: - '@pnpm/error': 1000.1.0 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/fs.packlist': 1000.0.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/prepare-package': 1001.0.7(@pnpm/logger@1001.0.1)(typanion@3.14.0) - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) + npm-packlist: 5.1.3 + + '@pnpm/git-fetcher@1001.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0)': + dependencies: + '@pnpm/fetcher-base': 1000.0.11 + '@pnpm/fs.packlist': 2.0.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/prepare-package': 1000.0.16(@pnpm/logger@1001.0.0)(typanion@3.14.0) + '@pnpm/worker': 1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15) '@zkochan/rimraf': 3.0.2 execa: safe-execa@0.1.2 transitivePeerDependencies: - supports-color - typanion - '@pnpm/git-resolver@1001.2.2(@pnpm/logger@1001.0.1)': + '@pnpm/git-resolver@1001.0.2(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/error': 1000.1.0 - '@pnpm/fetch': 1001.0.0(@pnpm/logger@1001.0.1) - '@pnpm/resolver-base': 1005.4.1 + '@pnpm/fetch': 1000.2.2(@pnpm/logger@1001.0.0) + '@pnpm/resolver-base': 1003.0.1 graceful-git: 4.0.0 hosted-git-info: '@pnpm/hosted-git-info@1.0.0' - semver: 7.7.4 + semver: 7.7.3 transitivePeerDependencies: - '@pnpm/logger' - domexception @@ -18303,105 +18374,103 @@ snapshots: dependencies: execa: safe-execa@0.1.2 - '@pnpm/graceful-fs@1000.1.0': + '@pnpm/graceful-fs@1000.0.0': dependencies: graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) - '@pnpm/hooks.types@1001.0.20': + '@pnpm/hooks.types@1001.0.8': dependencies: - '@pnpm/lockfile.types': 1002.1.0 - '@pnpm/types': 1001.3.0 + '@pnpm/lockfile.types': 1001.0.8 + '@pnpm/types': 1000.6.0 '@pnpm/hosted-git-info@1.0.0': dependencies: lru-cache: 6.0.0 - '@pnpm/lifecycle@1001.0.37(@pnpm/logger@1001.0.1)(typanion@3.14.0)': + '@pnpm/lifecycle@1001.0.15(@pnpm/logger@1001.0.0)(typanion@3.14.0)': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/directory-fetcher': 1000.1.24(@pnpm/logger@1001.0.1) - '@pnpm/error': 1000.1.0 - '@pnpm/link-bins': 1000.3.8(@pnpm/logger@1001.0.1) - '@pnpm/logger': 1001.0.1 - '@pnpm/npm-lifecycle': 1001.0.0(typanion@3.14.0) - '@pnpm/read-package-json': 1000.1.8 - '@pnpm/store-controller-types': 1004.5.1 - '@pnpm/types': 1001.3.0 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/directory-fetcher': 1000.1.7(@pnpm/logger@1001.0.0) + '@pnpm/error': 1000.0.2 + '@pnpm/link-bins': 1000.0.13(@pnpm/logger@1001.0.0) + '@pnpm/logger': 1001.0.0 + '@pnpm/npm-lifecycle': 1000.0.4(typanion@3.14.0) + '@pnpm/read-package-json': 1000.0.9 + '@pnpm/store-controller-types': 1003.0.2 + '@pnpm/types': 1000.6.0 is-windows: 1.0.2 path-exists: 4.0.0 run-groups: 3.0.1 - shlex: 2.1.2 + shell-quote: 1.8.3 transitivePeerDependencies: - supports-color - typanion - '@pnpm/link-bins@1000.3.8(@pnpm/logger@1001.0.1)': + '@pnpm/link-bins@1000.0.13(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/constants': 1001.3.1 - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/manifest-utils': 1002.0.5(@pnpm/logger@1001.0.1) - '@pnpm/package-bins': 1000.0.17 + '@pnpm/error': 1000.0.2 + '@pnpm/logger': 1001.0.0 + '@pnpm/manifest-utils': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/package-bins': 1000.0.8 '@pnpm/read-modules-dir': 1000.0.0 - '@pnpm/read-package-json': 1000.1.8 - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@pnpm/types': 1001.3.0 + '@pnpm/read-package-json': 1000.0.9 + '@pnpm/read-project-manifest': 1000.0.11 + '@pnpm/types': 1000.6.0 '@zkochan/cmd-shim': 7.0.0 '@zkochan/rimraf': 3.0.2 bin-links: 4.0.4 is-subdir: 1.2.0 is-windows: 1.0.2 normalize-path: 3.0.0 + p-settle: 4.1.1 ramda: '@pnpm/ramda@0.28.1' - semver: 7.7.4 + semver: 7.7.3 symlink-dir: 6.0.5 - '@pnpm/local-resolver@1002.1.13(@pnpm/logger@1001.0.1)': + '@pnpm/local-resolver@1001.0.1(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/crypto.hash': 1000.2.2 - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 + '@pnpm/crypto.hash': 1000.1.1 + '@pnpm/error': 1000.0.2 + '@pnpm/logger': 1001.0.0 + '@pnpm/read-project-manifest': 1000.0.11 + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/types': 1000.6.0 normalize-path: 3.0.0 - '@pnpm/lockfile.types@1002.1.0': + '@pnpm/lockfile.types@1001.0.8': dependencies: '@pnpm/patching.types': 1000.1.0 - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 '@pnpm/log.group@3.0.2': dependencies: ci-info: 3.9.0 - '@pnpm/logger@1001.0.1': + '@pnpm/logger@1001.0.0': dependencies: - bole: 5.0.28 - split2: 4.2.0 + bole: 5.0.19 + ndjson: 2.0.0 - '@pnpm/manifest-utils@1002.0.5(@pnpm/logger@1001.0.1)': + '@pnpm/manifest-utils@1001.0.1(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/semver.peer-range': 1000.0.0 - '@pnpm/types': 1001.3.0 - semver: 7.7.4 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/error': 1000.0.2 + '@pnpm/types': 1000.6.0 + transitivePeerDependencies: + - '@pnpm/logger' - '@pnpm/matcher@1000.1.0': + '@pnpm/matcher@1000.0.0': dependencies: escape-string-regexp: 4.0.0 '@pnpm/meta-updater@2.0.6(@types/node@22.19.15)(typanion@3.14.0)': dependencies: - '@pnpm/find-workspace-dir': 1000.1.5 - '@pnpm/logger': 1001.0.1 - '@pnpm/types': 1000.9.0 - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) - '@pnpm/workspace.find-packages': 1000.0.65(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/workspace.read-manifest': 1000.3.1 + '@pnpm/find-workspace-dir': 1000.1.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/types': 1000.6.0 + '@pnpm/worker': 1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15) + '@pnpm/workspace.find-packages': 1000.0.25(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0) + '@pnpm/workspace.read-manifest': 1000.1.5 load-json-file: 7.0.1 meow: 11.0.0 print-diff: 2.0.0 @@ -18421,10 +18490,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@pnpm/network.auth-header@1000.0.7': + '@pnpm/network.auth-header@1000.0.3': dependencies: '@pnpm/config.nerf-dart': 1.0.1 - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.2 '@pnpm/network.ca-file@1.0.2': dependencies: @@ -18436,7 +18505,7 @@ snapshots: '@pnpm/network.proxy-agent@2.0.3': dependencies: - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -18451,53 +18520,27 @@ snapshots: transitivePeerDependencies: - domexception - '@pnpm/node.fetcher@1001.0.27(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': - dependencies: - '@pnpm/create-cafs-store': 1000.0.33(@pnpm/logger@1001.0.1) - '@pnpm/crypto.shasums-file': 1001.0.5 - '@pnpm/error': 1000.1.0 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/fetching.binary-fetcher': 1005.0.4(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) - '@pnpm/node.resolver': 1001.0.23(@pnpm/logger@1001.0.1) - '@pnpm/tarball-fetcher': 1006.0.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - detect-libc: 2.1.2 - transitivePeerDependencies: - - '@pnpm/logger' - - '@pnpm/worker' - - domexception - - supports-color - - typanion - - '@pnpm/node.resolver@1001.0.23(@pnpm/logger@1001.0.1)': - dependencies: - '@pnpm/config': 1004.11.0(@pnpm/logger@1001.0.1) - '@pnpm/constants': 1001.3.1 - '@pnpm/crypto.shasums-file': 1001.0.5 - '@pnpm/error': 1000.1.0 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 - semver: 7.7.4 - version-selector-type: 3.0.0 - transitivePeerDependencies: - - '@pnpm/logger' - - domexception - '@pnpm/nopt@0.3.1': dependencies: abbrev: 1.1.1 + '@pnpm/npm-conf@3.0.0': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@pnpm/npm-conf@3.0.2': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@pnpm/npm-lifecycle@1001.0.0(typanion@3.14.0)': + '@pnpm/npm-lifecycle@1000.0.4(typanion@3.14.0)': dependencies: '@pnpm/byline': 1.0.0 - '@pnpm/error': 1000.1.0 - '@yarnpkg/fslib': 3.1.5 + '@pnpm/error': 1000.0.5 + '@yarnpkg/fslib': 3.1.2 '@yarnpkg/shell': 4.0.0(typanion@3.14.0) node-gyp: 11.5.0 resolve-from: 5.0.0 @@ -18512,8 +18555,8 @@ snapshots: '@pnpm/npm-lifecycle@1100.0.0-1(typanion@3.14.0)': dependencies: '@pnpm/byline': 1.0.0 - '@pnpm/error': 1000.1.0 - '@yarnpkg/fslib': 3.1.5 + '@pnpm/error': 1000.0.5 + '@yarnpkg/fslib': 3.1.2 '@yarnpkg/shell': 4.0.0(typanion@3.14.0) node-gyp: 11.5.0 uid-number: 0.0.6 @@ -18525,25 +18568,23 @@ snapshots: '@pnpm/npm-package-arg@2.0.0': dependencies: hosted-git-info: 4.1.0 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-name: 4.0.0 - '@pnpm/npm-resolver@1005.2.3(@pnpm/logger@1001.0.1)': + '@pnpm/npm-resolver@1004.0.1(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/constants': 1001.3.1 - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/crypto.hash': 1000.2.2 - '@pnpm/error': 1000.1.0 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/pick-registry-for-package': 1000.0.16 - '@pnpm/registry.pkg-metadata-filter': 1000.1.6(@pnpm/logger@1001.0.1) - '@pnpm/registry.types': 1000.1.4 - '@pnpm/resolve-workspace-range': 1000.1.0 - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/resolving.jsr-specifier-parser': 1000.0.4 - '@pnpm/types': 1001.3.0 + '@pnpm/constants': 1001.1.0 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/crypto.hash': 1000.1.1 + '@pnpm/error': 1000.0.2 + '@pnpm/fetching-types': 1000.1.0 + '@pnpm/graceful-fs': 1000.0.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/pick-registry-for-package': 1000.0.8 + '@pnpm/resolve-workspace-range': 1000.0.0 + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/resolving.jsr-specifier-parser': 1000.0.0 + '@pnpm/types': 1000.6.0 '@pnpm/workspace.spec-parser': 1000.0.0 '@zkochan/retry': 0.2.0 encode-registry: 3.0.1 @@ -18552,11 +18593,11 @@ snapshots: normalize-path: 3.0.0 p-limit: 3.1.0 p-memoize: 4.0.1 - parse-npm-tarball-url: 4.0.0 - path-temp: 2.1.1 + parse-npm-tarball-url: 3.0.0 + path-temp: 2.1.0 ramda: '@pnpm/ramda@0.28.1' - rename-overwrite: 6.0.6 - semver: 7.7.4 + rename-overwrite: 6.0.3 + semver: 7.7.3 semver-utils: 1.1.4 ssri: 10.0.5 version-selector-type: 3.0.0 @@ -18570,83 +18611,78 @@ snapshots: '@pnpm/os.env.path-extender-posix@3.0.0': dependencies: - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.5 '@pnpm/os.env.path-extender-windows@3.0.0': dependencies: - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.5 safe-execa: 0.1.4 string.prototype.matchall: 4.0.12 '@pnpm/os.env.path-extender@3.0.0': dependencies: - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.5 '@pnpm/os.env.path-extender-posix': 3.0.0 '@pnpm/os.env.path-extender-windows': 3.0.0 - '@pnpm/package-bins@1000.0.17': + '@pnpm/package-bins@1000.0.8': dependencies: - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 is-subdir: 1.2.0 tinyglobby: 0.2.15 - '@pnpm/package-is-installable@1000.0.21(@pnpm/logger@1001.0.1)': + '@pnpm/package-is-installable@1000.0.10(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/cli-meta': 1000.0.16 - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/env.system-node-version': 1000.0.16 - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/types': 1001.3.0 - detect-libc: 2.1.2 + '@pnpm/cli-meta': 1000.0.8 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/env.system-node-version': 1000.0.8 + '@pnpm/error': 1000.0.2 + '@pnpm/logger': 1001.0.0 + '@pnpm/types': 1000.6.0 + detect-libc: 2.0.4 execa: safe-execa@0.1.2 mem: 8.1.1 - semver: 7.7.4 + semver: 7.7.3 - '@pnpm/package-requester@1011.2.4(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))': + '@pnpm/package-requester@1004.0.2(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/dependency-path': 1001.1.10 - '@pnpm/error': 1000.1.0 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/package-is-installable': 1000.0.21(@pnpm/logger@1001.0.1) - '@pnpm/pick-fetcher': 1001.0.0 - '@pnpm/read-package-json': 1000.1.8 - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/store-controller-types': 1004.5.1 - '@pnpm/store.cafs': 1000.1.4 - '@pnpm/types': 1001.3.0 - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) - detect-libc: 2.1.2 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/dependency-path': 1000.0.9 + '@pnpm/error': 1000.0.2 + '@pnpm/fetcher-base': 1000.0.11 + '@pnpm/graceful-fs': 1000.0.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/package-is-installable': 1000.0.10(@pnpm/logger@1001.0.0) + '@pnpm/pick-fetcher': 1000.0.0 + '@pnpm/read-package-json': 1000.0.9 + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/store-controller-types': 1003.0.2 + '@pnpm/store.cafs': 1000.0.13 + '@pnpm/types': 1000.6.0 + '@pnpm/worker': 1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15) p-defer: 3.0.0 p-limit: 3.1.0 p-queue: 6.6.2 promise-share: 1.0.0 ramda: '@pnpm/ramda@0.28.1' - semver: 7.7.4 + semver: 7.7.3 ssri: 10.0.5 - '@pnpm/package-store@1007.1.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))': + '@pnpm/package-store@1002.0.4(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))': dependencies: - '@pnpm/create-cafs-store': 1000.0.33(@pnpm/logger@1001.0.1) - '@pnpm/crypto.hash': 1000.2.2 - '@pnpm/error': 1000.1.0 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/logger': 1001.0.1 - '@pnpm/package-requester': 1011.2.4(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/store-controller-types': 1004.5.1 - '@pnpm/store.cafs': 1000.1.4 - '@pnpm/types': 1001.3.0 - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) + '@pnpm/create-cafs-store': 1000.0.14(@pnpm/logger@1001.0.0) + '@pnpm/fetcher-base': 1000.0.11 + '@pnpm/logger': 1001.0.0 + '@pnpm/package-requester': 1004.0.2(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15)) + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/store-controller-types': 1003.0.2 + '@pnpm/store.cafs': 1000.0.13 + '@pnpm/types': 1000.6.0 + '@pnpm/worker': 1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15) '@zkochan/rimraf': 3.0.2 - is-subdir: 1.2.0 load-json-file: 6.2.0 ramda: '@pnpm/ramda@0.28.1' ssri: 10.0.5 - symlink-dir: 6.0.5 '@pnpm/parse-wanted-dependency@1001.0.0': dependencies: @@ -18659,43 +18695,43 @@ snapshots: ci-info: 3.9.0 cross-spawn: 7.0.6 find-yarn-workspace-root: 2.0.0 - fs-extra: 11.3.4 + fs-extra: 11.3.1 klaw-sync: 6.0.0 minimist: 1.2.8 open: 7.4.2 rimraf: 2.7.1 - semver: 7.7.4 + semver: 7.7.3 slash: 2.0.0 tmp: 0.2.5 - yaml: 2.8.3 + yaml: 2.8.1 '@pnpm/patching.types@1000.1.0': {} - '@pnpm/pick-fetcher@1001.0.0': {} + '@pnpm/pick-fetcher@1000.0.0': {} - '@pnpm/pick-registry-for-package@1000.0.16': + '@pnpm/pick-registry-for-package@1000.0.8': dependencies: - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 - '@pnpm/pnpmfile@1002.1.13(@pnpm/logger@1001.0.1)': + '@pnpm/pnpmfile@1001.2.2(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/crypto.hash': 1000.2.2 - '@pnpm/error': 1000.1.0 - '@pnpm/hooks.types': 1001.0.20 - '@pnpm/lockfile.types': 1002.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/store-controller-types': 1004.5.1 - '@pnpm/types': 1001.3.0 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/crypto.hash': 1000.1.1 + '@pnpm/error': 1000.0.2 + '@pnpm/hooks.types': 1001.0.8 + '@pnpm/lockfile.types': 1001.0.8 + '@pnpm/logger': 1001.0.0 + '@pnpm/store-controller-types': 1003.0.2 + '@pnpm/types': 1000.6.0 chalk: 4.1.2 path-absolute: 1.0.1 - '@pnpm/prepare-package@1001.0.7(@pnpm/logger@1001.0.1)(typanion@3.14.0)': + '@pnpm/prepare-package@1000.0.16(@pnpm/logger@1001.0.0)(typanion@3.14.0)': dependencies: - '@pnpm/error': 1000.1.0 - '@pnpm/lifecycle': 1001.0.37(@pnpm/logger@1001.0.1)(typanion@3.14.0) - '@pnpm/read-package-json': 1000.1.8 - '@pnpm/types': 1001.3.0 + '@pnpm/error': 1000.0.2 + '@pnpm/lifecycle': 1001.0.15(@pnpm/logger@1001.0.0)(typanion@3.14.0) + '@pnpm/read-package-json': 1000.0.9 + '@pnpm/types': 1000.6.0 '@zkochan/rimraf': 3.0.2 execa: safe-execa@0.1.2 preferred-pm: 3.1.4 @@ -18711,23 +18747,21 @@ snapshots: dependencies: graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) - '@pnpm/read-package-json@1000.1.8': + '@pnpm/read-package-json@1000.0.9': dependencies: - '@pnpm/error': 1000.1.0 - '@pnpm/types': 1001.3.0 + '@pnpm/error': 1000.0.2 + '@pnpm/types': 1000.6.0 load-json-file: 6.2.0 - normalize-package-data: 7.0.1 + normalize-package-data: 5.0.0 - '@pnpm/read-project-manifest@1001.2.6(@pnpm/logger@1001.0.1)': + '@pnpm/read-project-manifest@1000.0.11': dependencies: '@gwhitney/detect-indent': 7.0.1 - '@pnpm/error': 1000.1.0 - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/manifest-utils': 1002.0.5(@pnpm/logger@1001.0.1) + '@pnpm/error': 1000.0.2 + '@pnpm/graceful-fs': 1000.0.0 '@pnpm/text.comments-parser': 1000.0.0 - '@pnpm/types': 1001.3.0 - '@pnpm/write-project-manifest': 1000.0.16 + '@pnpm/types': 1000.6.0 + '@pnpm/write-project-manifest': 1000.0.8 fast-deep-equal: 3.1.3 is-windows: 1.0.2 json5: 2.2.3 @@ -18739,99 +18773,43 @@ snapshots: dependencies: anonymous-npm-registry-client: 0.3.2 execa: 5.1.1 - fs-extra: 11.3.4 + fs-extra: 11.3.3 read-yaml-file: 2.1.0 rimraf: 3.0.2 tempy: 1.0.1 verdaccio: 6.3.2(encoding@0.1.13)(typanion@3.14.0) write-yaml-file: 4.2.0 - '@pnpm/registry.pkg-metadata-filter@1000.1.6(@pnpm/logger@1001.0.1)': + '@pnpm/render-peer-issues@1002.0.0': dependencies: - '@pnpm/logger': 1001.0.1 - '@pnpm/registry.types': 1000.1.4 - semver: 7.7.4 - - '@pnpm/registry.types@1000.1.4': - dependencies: - '@pnpm/types': 1001.3.0 - - '@pnpm/render-peer-issues@1002.0.12': - dependencies: - '@pnpm/error': 1000.1.0 - '@pnpm/text.tree-renderer': 1000.0.0 - '@pnpm/types': 1001.3.0 + '@pnpm/error': 1000.0.2 + '@pnpm/types': 1000.6.0 + archy: 1.0.0 chalk: 4.1.2 cli-columns: 4.0.0 - '@pnpm/resolve-workspace-range@1000.1.0': + '@pnpm/resolve-workspace-range@1000.0.0': dependencies: - semver: 7.7.4 + semver: 7.7.3 - '@pnpm/resolver-base@1005.4.1': + '@pnpm/resolver-base@1003.0.1': dependencies: - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 - '@pnpm/resolving.bun-resolver@1005.0.11(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/resolving.jsr-specifier-parser@1000.0.0': dependencies: - '@pnpm/constants': 1001.3.1 - '@pnpm/crypto.shasums-file': 1001.0.5 - '@pnpm/error': 1000.1.0 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/fetching.binary-fetcher': 1005.0.4(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) - '@pnpm/node.fetcher': 1001.0.27(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/npm-resolver': 1005.2.3(@pnpm/logger@1001.0.1) - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 - '@pnpm/util.lex-comparator': 3.0.2 - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) - semver: 7.7.4 - transitivePeerDependencies: - - '@pnpm/logger' - - domexception - - supports-color - - typanion - - '@pnpm/resolving.deno-resolver@1005.0.11(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': - dependencies: - '@pnpm/constants': 1001.3.1 - '@pnpm/crypto.shasums-file': 1001.0.5 - '@pnpm/error': 1000.1.0 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/fetching.binary-fetcher': 1005.0.4(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) - '@pnpm/node.fetcher': 1001.0.27(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/npm-resolver': 1005.2.3(@pnpm/logger@1001.0.1) - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 - '@pnpm/util.lex-comparator': 3.0.2 - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) - semver: 7.7.4 - transitivePeerDependencies: - - '@pnpm/logger' - - domexception - - supports-color - - typanion - - '@pnpm/resolving.jsr-specifier-parser@1000.0.4': - dependencies: - '@pnpm/error': 1000.1.0 + '@pnpm/error': 1000.0.2 '@pnpm/self-installer@2.2.1': {} '@pnpm/semver-diff@1.1.0': {} - '@pnpm/semver.peer-range@1000.0.0': + '@pnpm/server@1001.0.4(@pnpm/logger@1001.0.0)': dependencies: - semver: 7.7.4 - - '@pnpm/server@1001.0.20(@pnpm/logger@1001.0.1)': - dependencies: - '@pnpm/fetch': 1001.0.0(@pnpm/logger@1001.0.1) - '@pnpm/logger': 1001.0.1 - '@pnpm/store-controller-types': 1004.5.1 - '@pnpm/types': 1001.3.0 + '@pnpm/fetch': 1000.2.2(@pnpm/logger@1001.0.0) + '@pnpm/logger': 1001.0.0 + '@pnpm/store-controller-types': 1003.0.2 + '@pnpm/types': 1000.6.0 p-limit: 3.1.0 promise-share: 1.0.0 uuid: 9.0.1 @@ -18843,16 +18821,16 @@ snapshots: dependencies: grapheme-splitter: 1.0.4 - '@pnpm/store-connection-manager@1002.3.19(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/store-connection-manager@1002.0.3(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0)': dependencies: - '@pnpm/cli-meta': 1000.0.16 - '@pnpm/client': 1001.1.24(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/config': 1004.11.0(@pnpm/logger@1001.0.1) - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/package-store': 1007.1.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)) - '@pnpm/server': 1001.0.20(@pnpm/logger@1001.0.1) - '@pnpm/store-path': 1000.0.6 + '@pnpm/cli-meta': 1000.0.8 + '@pnpm/client': 1000.0.19(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0) + '@pnpm/config': 1003.1.1(@pnpm/logger@1001.0.0) + '@pnpm/error': 1000.0.2 + '@pnpm/logger': 1001.0.0 + '@pnpm/package-store': 1002.0.4(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15)) + '@pnpm/server': 1001.0.4(@pnpm/logger@1001.0.0) + '@pnpm/store-path': 1000.0.2 '@zkochan/diable': 1.0.2 delay: 5.0.0 dir-is-case-sensitive: 2.0.0 @@ -18862,79 +18840,77 @@ snapshots: - supports-color - typanion - '@pnpm/store-controller-types@1004.5.1': + '@pnpm/store-controller-types@1003.0.2': dependencies: - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/resolver-base': 1005.4.1 - '@pnpm/types': 1001.3.0 + '@pnpm/fetcher-base': 1000.0.11 + '@pnpm/resolver-base': 1003.0.1 + '@pnpm/types': 1000.6.0 - '@pnpm/store-path@1000.0.6': + '@pnpm/store-path@1000.0.2': dependencies: - '@pnpm/constants': 1001.3.1 - '@pnpm/error': 1000.1.0 + '@pnpm/constants': 1001.1.0 + '@pnpm/error': 1000.0.2 '@zkochan/rimraf': 3.0.2 can-link: 2.0.0 path-absolute: 1.0.1 - path-temp: 2.1.1 + path-temp: 2.1.0 root-link-target: 3.1.0 touch: 3.1.0 - '@pnpm/store.cafs@1000.1.4': + '@pnpm/store.cafs@1000.0.13': dependencies: - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/store-controller-types': 1004.5.1 + '@pnpm/fetcher-base': 1000.0.11 + '@pnpm/graceful-fs': 1000.0.0 + '@pnpm/store-controller-types': 1003.0.2 '@zkochan/rimraf': 3.0.2 is-gzip: 2.0.0 - is-subdir: 1.2.0 p-limit: 3.1.0 - rename-overwrite: 6.0.6 + rename-overwrite: 6.0.3 ssri: 10.0.5 strip-bom: 4.0.0 - '@pnpm/symlink-dependency@1000.0.17(@pnpm/logger@1001.0.1)': + '@pnpm/symlink-dependency@1000.0.9(@pnpm/logger@1001.0.0)': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/logger': 1001.0.1 - '@pnpm/types': 1001.3.0 + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/logger': 1001.0.0 + '@pnpm/types': 1000.6.0 symlink-dir: 6.0.5 '@pnpm/tabtab@0.5.4': dependencies: - debug: 4.4.3 + debug: 4.4.1 enquirer: 2.4.1 minimist: 1.2.8 untildify: 4.0.0 transitivePeerDependencies: - supports-color - '@pnpm/tarball-fetcher@1006.0.6(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/tarball-fetcher@1001.0.8(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0)': dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/error': 1000.1.0 - '@pnpm/fetcher-base': 1001.2.2 - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/fs.packlist': 1000.0.0 - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/prepare-package': 1001.0.7(@pnpm/logger@1001.0.1)(typanion@3.14.0) - '@pnpm/types': 1001.3.0 - '@pnpm/worker': 1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15) + '@pnpm/core-loggers': 1001.0.1(@pnpm/logger@1001.0.0) + '@pnpm/error': 1000.0.2 + '@pnpm/fetcher-base': 1000.0.11 + '@pnpm/fetching-types': 1000.1.0 + '@pnpm/fs.packlist': 2.0.0 + '@pnpm/graceful-fs': 1000.0.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/prepare-package': 1000.0.16(@pnpm/logger@1001.0.0)(typanion@3.14.0) + '@pnpm/worker': 1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15) '@zkochan/retry': 0.2.0 lodash.throttle: 4.1.1 p-map-values: 1.0.0 - path-temp: 2.1.1 + path-temp: 2.1.0 ramda: '@pnpm/ramda@0.28.1' - rename-overwrite: 6.0.6 + rename-overwrite: 6.0.3 transitivePeerDependencies: - domexception - supports-color - typanion - '@pnpm/tarball-resolver@1002.2.1': + '@pnpm/tarball-resolver@1002.0.2': dependencies: - '@pnpm/fetching-types': 1000.2.1 - '@pnpm/resolver-base': 1005.4.1 + '@pnpm/fetching-types': 1000.1.0 + '@pnpm/resolver-base': 1003.0.1 transitivePeerDependencies: - domexception @@ -18942,13 +18918,9 @@ snapshots: dependencies: strip-comments-strings: 1.2.0 - '@pnpm/text.tree-renderer@1000.0.0': {} - '@pnpm/tgz-fixtures@0.0.0': {} - '@pnpm/types@1000.9.0': {} - - '@pnpm/types@1001.3.0': {} + '@pnpm/types@1000.6.0': {} '@pnpm/util.lex-comparator@3.0.2': {} @@ -18956,32 +18928,33 @@ snapshots: dependencies: isexe: 2.0.0 - '@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15)': + '@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15)': dependencies: - '@pnpm/cafs-types': 1000.1.0 - '@pnpm/create-cafs-store': 1000.0.33(@pnpm/logger@1001.0.1) + '@pnpm/cafs-types': 1000.0.0 + '@pnpm/create-cafs-store': 1000.0.14(@pnpm/logger@1001.0.0) '@pnpm/crypto.polyfill': 1000.1.0 - '@pnpm/error': 1000.1.0 - '@pnpm/exec.pkg-requires-build': 1000.0.16 - '@pnpm/fs.hard-link-dir': 1000.0.6(@pnpm/logger@1001.0.1) - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/store.cafs': 1000.1.4 - '@pnpm/symlink-dependency': 1000.0.17(@pnpm/logger@1001.0.1) + '@pnpm/error': 1000.0.2 + '@pnpm/exec.pkg-requires-build': 1000.0.8 + '@pnpm/fs.hard-link-dir': 1000.0.1(@pnpm/logger@1001.0.0) + '@pnpm/graceful-fs': 1000.0.0 + '@pnpm/logger': 1001.0.0 + '@pnpm/store.cafs': 1000.0.13 + '@pnpm/symlink-dependency': 1000.0.9(@pnpm/logger@1001.0.0) '@rushstack/worker-pool': 0.4.9(@types/node@22.19.15) is-windows: 1.0.2 load-json-file: 6.2.0 p-limit: 3.1.0 + shell-quote: 1.8.3 transitivePeerDependencies: - '@types/node' - '@pnpm/workspace.find-packages@1000.0.65(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0)': + '@pnpm/workspace.find-packages@1000.0.25(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0)': dependencies: - '@pnpm/cli-utils': 1001.3.10(@pnpm/logger@1001.0.1)(@pnpm/worker@1000.6.7(@pnpm/logger@1001.0.1)(@types/node@22.19.15))(typanion@3.14.0) - '@pnpm/constants': 1001.3.1 - '@pnpm/fs.find-packages': 1000.0.24(@pnpm/logger@1001.0.1) - '@pnpm/logger': 1001.0.1 - '@pnpm/types': 1001.3.0 + '@pnpm/cli-utils': 1000.1.5(@pnpm/logger@1001.0.0)(@pnpm/worker@1000.1.7(@pnpm/logger@1001.0.0)(@types/node@22.19.15))(typanion@3.14.0) + '@pnpm/constants': 1001.1.0 + '@pnpm/fs.find-packages': 1000.0.11 + '@pnpm/logger': 1001.0.0 + '@pnpm/types': 1000.6.0 '@pnpm/util.lex-comparator': 3.0.2 transitivePeerDependencies: - '@pnpm/worker' @@ -18989,40 +18962,31 @@ snapshots: - supports-color - typanion - '@pnpm/workspace.manifest-writer@1001.3.1': + '@pnpm/workspace.manifest-writer@1000.1.4': dependencies: - '@pnpm/catalogs.types': 1000.0.0 - '@pnpm/constants': 1001.3.1 - '@pnpm/lockfile.types': 1002.1.0 + '@pnpm/constants': 1001.1.0 '@pnpm/object.key-sorting': 1000.0.1 - '@pnpm/types': 1001.3.0 - '@pnpm/workspace.read-manifest': 1000.3.1 - '@pnpm/yaml.document-sync': 1000.0.0 + '@pnpm/workspace.read-manifest': 1000.1.5 ramda: '@pnpm/ramda@0.28.1' - write-file-atomic: 5.0.1 - yaml: 2.8.3 + write-yaml-file: 5.0.0 - '@pnpm/workspace.read-manifest@1000.3.1': + '@pnpm/workspace.read-manifest@1000.1.5': dependencies: - '@pnpm/constants': 1001.3.1 - '@pnpm/error': 1000.1.0 - '@pnpm/types': 1001.3.0 + '@pnpm/constants': 1001.1.0 + '@pnpm/error': 1000.0.2 + '@pnpm/types': 1000.6.0 read-yaml-file: 2.1.0 '@pnpm/workspace.spec-parser@1000.0.0': {} - '@pnpm/write-project-manifest@1000.0.16': + '@pnpm/write-project-manifest@1000.0.8': dependencies: '@pnpm/text.comments-parser': 1000.0.0 - '@pnpm/types': 1001.3.0 + '@pnpm/types': 1000.6.0 json5: 2.2.3 write-file-atomic: 5.0.1 write-yaml-file: 5.0.0 - '@pnpm/yaml.document-sync@1000.0.0': - dependencies: - yaml: 2.8.3 - '@postman/form-data@3.1.1': dependencies: asynckit: 0.4.0 @@ -19065,9 +19029,9 @@ snapshots: optionalDependencies: '@types/node': 22.19.15 - '@rushstack/worker-pool@0.7.7(@types/node@25.5.0)': + '@rushstack/worker-pool@0.7.7(@types/node@22.19.15)': optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.15 '@sec-ant/readable-stream@0.4.1': {} @@ -19109,9 +19073,9 @@ snapshots: '@simple-libs/stream-utils@1.2.0': {} - '@sinclair/typebox@0.27.10': {} + '@sinclair/typebox@0.27.8': {} - '@sinclair/typebox@0.34.48': {} + '@sinclair/typebox@0.34.40': {} '@sindresorhus/is@4.6.0': {} @@ -19125,20 +19089,32 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@stylistic/eslint-plugin@5.10.0(eslint@10.0.3(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.5.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.5.1)) '@typescript-eslint/types': 8.57.2 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.5.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.4 + picomatch: 4.0.3 '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 + '@tsconfig/node10@1.0.12': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@4.1.0': @@ -19146,37 +19122,37 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 10.2.4 - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.0': dependencies: tslib: 2.8.1 optional: true - '@types/adm-zip@0.5.8': + '@types/adm-zip@0.5.7': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/archy@0.0.36': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.2(@babel/types@7.29.0) - '@babel/types': 7.29.0 + '@babel/parser': 7.28.3(@babel/types@7.28.2) + '@babel/types': 7.28.2 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 + '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.2 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.2(@babel/types@7.29.0) - '@babel/types': 7.29.0 + '@babel/parser': 7.28.3(@babel/types@7.28.2) + '@babel/types': 7.28.2 - '@types/babel__traverse@7.28.0': + '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.2 '@types/bintrees@1.0.6': {} @@ -19184,24 +19160,24 @@ snapshots: '@types/byline@4.2.36': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/cacheable-request@6.0.3': dependencies: - '@types/http-cache-semantics': 4.2.0 + '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/responselike': 1.0.3 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 - '@types/emscripten@1.41.5': {} + '@types/emscripten@1.40.1': {} '@types/esrecurse@4.3.1': {} @@ -19210,19 +19186,19 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/hosted-git-info@3.0.5': {} - '@types/http-cache-semantics@4.2.0': {} + '@types/http-cache-semantics@4.0.4': {} - '@types/http-proxy@1.17.17': + '@types/http-proxy@1.17.16': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/ini@4.1.1': {} @@ -19232,7 +19208,7 @@ snapshots: '@types/isexe@2.0.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.15 '@types/istanbul-lib-coverage@2.0.6': {} @@ -19246,8 +19222,8 @@ snapshots: '@types/jest@30.0.0': dependencies: - expect: 30.3.0 - pretty-format: 30.3.0 + expect: 30.0.5 + pretty-format: 30.0.5 '@types/js-yaml@4.0.9': {} @@ -19255,11 +19231,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/keyv@3.1.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/libnpmpublish@9.0.1': dependencies: @@ -19269,19 +19245,19 @@ snapshots: '@types/lodash.kebabcase@4.1.9': dependencies: - '@types/lodash': 4.17.24 + '@types/lodash': 4.17.17 '@types/lodash.throttle@4.1.9': dependencies: - '@types/lodash': 4.17.24 + '@types/lodash': 4.17.17 - '@types/lodash@4.17.24': {} + '@types/lodash@4.17.17': {} '@types/mdast@4.0.4': dependencies: - '@types/unist': 3.0.3 + '@types/unist': 2.0.11 - '@types/micromatch@4.0.10': + '@types/micromatch@4.0.9': dependencies: '@types/braces': 3.0.5 @@ -19291,12 +19267,12 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 25.5.0 - form-data: 4.0.5 + '@types/node': 22.19.7 + form-data: 4.0.4 '@types/node@12.20.55': {} - '@types/node@18.19.130': + '@types/node@18.19.110': dependencies: undici-types: 5.26.5 @@ -19304,9 +19280,9 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@25.5.0': + '@types/node@22.19.7': dependencies: - undici-types: 7.18.2 + undici-types: 6.21.0 '@types/normalize-package-data@2.4.4': {} @@ -19316,7 +19292,7 @@ snapshots: '@types/npm-registry-fetch@8.0.9': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/node-fetch': 2.6.13 '@types/npm-package-arg': 6.1.4 '@types/npmlog': 7.0.0 @@ -19324,7 +19300,7 @@ snapshots: '@types/npmlog@7.0.0': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/object-hash@3.0.6': {} @@ -19342,21 +19318,23 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.15 '@types/responselike@1.0.3': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/retry@0.12.5': {} '@types/semver@6.2.7': {} + '@types/semver@7.7.0': {} + '@types/semver@7.7.1': {} '@types/ssri@7.1.5': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/stack-utils@2.0.3': {} @@ -19364,7 +19342,7 @@ snapshots: '@types/tar-stream@3.1.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/tar@7.0.87': dependencies: @@ -19372,10 +19350,12 @@ snapshots: '@types/touch@3.1.5': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.15 '@types/treeify@1.0.3': {} + '@types/unist@2.0.11': {} + '@types/unist@3.0.3': {} '@types/validate-npm-package-name@4.0.2': {} @@ -19384,66 +19364,40 @@ snapshots: '@types/write-file-atomic@4.0.3': dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.35': + '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 '@types/yarnpkg__lockfile@1.1.9': {} - '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/type-utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.1 - eslint: 10.0.3(jiti@2.6.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.57.2 - '@typescript-eslint/type-utils': 8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.57.2 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.5.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - optional: true - - '@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.1 - debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.1(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.2 '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3 + eslint: 10.1.0(jiti@2.5.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -19457,68 +19411,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.57.1': - dependencies: - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/visitor-keys': 8.57.1 - '@typescript-eslint/scope-manager@8.57.2': dependencies: '@typescript-eslint/types': 8.57.2 '@typescript-eslint/visitor-keys': 8.57.2 - '@typescript-eslint/tsconfig-utils@8.57.1(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.57.2 '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@5.9.3) + eslint: 10.1.0(jiti@2.5.1) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - optional: true - - '@typescript-eslint/types@8.57.1': {} '@typescript-eslint/types@8.57.2': {} - '@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.57.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/visitor-keys': 8.57.1 - debug: 4.4.3 - minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3) @@ -19527,40 +19442,24 @@ snapshots: '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3 minimatch: 10.2.4 - semver: 7.7.4 + semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.5.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.5.1)) '@typescript-eslint/scope-manager': 8.57.2 '@typescript-eslint/types': 8.57.2 '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.5.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.57.1': - dependencies: - '@typescript-eslint/types': 8.57.1 - eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.57.2': dependencies: '@typescript-eslint/types': 8.57.2 @@ -19827,18 +19726,18 @@ snapshots: '@yarnpkg/shell': 4.1.3(typanion@3.14.0) camelcase: 5.3.1 chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 clipanion: 3.2.0-rc.6(typanion@3.14.0) cross-spawn: 7.0.6 - diff: 8.0.4 - dotenv: 16.6.1 + diff: 8.0.3 + dotenv: 16.5.0 es-toolkit: 1.45.1 fast-glob: 3.3.3 got: 11.8.6 hpagent: 1.2.0 micromatch: 4.0.8 p-limit: 2.3.0 - semver: 7.7.4 + semver: 7.7.3 strip-ansi: 6.0.1 tar: 7.5.13 tinylogic: 2.0.0 @@ -19850,7 +19749,7 @@ snapshots: '@yarnpkg/core@4.6.0(typanion@3.14.0)': dependencies: '@arcanis/slice-ansi': 1.1.1 - '@types/semver': 7.7.1 + '@types/semver': 7.7.0 '@types/treeify': 1.0.3 '@yarnpkg/fslib': 3.1.5 '@yarnpkg/libzip': 3.2.2(@yarnpkg/fslib@3.1.5) @@ -19858,18 +19757,18 @@ snapshots: '@yarnpkg/shell': 4.1.3(typanion@3.14.0) camelcase: 5.3.1 chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 clipanion: 3.2.0-rc.6(typanion@3.14.0) cross-spawn: 7.0.6 - diff: 8.0.4 - dotenv: 16.6.1 + diff: 8.0.3 + dotenv: 16.5.0 es-toolkit: 1.45.1 fast-glob: 3.3.3 got: 11.8.6 hpagent: 1.2.0 micromatch: 4.0.8 p-limit: 2.3.0 - semver: 7.7.4 + semver: 7.7.3 strip-ansi: 6.0.1 tar: 7.5.13 tinylogic: 2.0.0 @@ -19882,13 +19781,17 @@ snapshots: dependencies: '@yarnpkg/core': 4.5.0(typanion@3.14.0) + '@yarnpkg/fslib@3.1.2': + dependencies: + tslib: 2.8.1 + '@yarnpkg/fslib@3.1.5': dependencies: tslib: 2.8.1 '@yarnpkg/libzip@3.2.2(@yarnpkg/fslib@3.1.5)': dependencies: - '@types/emscripten': 1.41.5 + '@types/emscripten': 1.40.1 '@yarnpkg/fslib': 3.1.5 tslib: 2.8.1 @@ -19897,8 +19800,8 @@ snapshots: '@yarnpkg/nm@4.0.7(typanion@3.14.0)': dependencies: '@yarnpkg/core': 4.6.0(typanion@3.14.0) - '@yarnpkg/fslib': 3.1.5 - '@yarnpkg/pnp': 4.1.3 + '@yarnpkg/fslib': 3.1.2 + '@yarnpkg/pnp': 4.1.1 transitivePeerDependencies: - typanion @@ -19907,14 +19810,19 @@ snapshots: js-yaml: 3.14.2 tslib: 2.8.1 - '@yarnpkg/pnp@4.1.3': + '@yarnpkg/pnp@4.0.8': dependencies: - '@types/node': 18.19.130 - '@yarnpkg/fslib': 3.1.5 + '@types/node': 18.19.110 + '@yarnpkg/fslib': 3.1.2 + + '@yarnpkg/pnp@4.1.1': + dependencies: + '@types/node': 18.19.110 + '@yarnpkg/fslib': 3.1.2 '@yarnpkg/shell@4.0.0(typanion@3.14.0)': dependencies: - '@yarnpkg/fslib': 3.1.5 + '@yarnpkg/fslib': 3.1.2 '@yarnpkg/parsers': 3.0.3 chalk: 3.0.0 clipanion: 3.2.0-rc.6(typanion@3.14.0) @@ -20010,10 +19918,21 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + optional: true + + acorn@8.15.0: {} + acorn@8.16.0: {} adm-zip@0.5.16: {} @@ -20024,7 +19943,7 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.4: {} + agent-base@7.1.3: {} agentkeepalive@4.6.0: dependencies: @@ -20045,7 +19964,7 @@ snapshots: ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -20060,7 +19979,7 @@ snapshots: request: postman-request@2.88.1-postman.40 retry: 0.13.1 safe-buffer: 5.2.1 - semver: 7.7.4 + semver: 7.7.3 slide: 1.1.6 ssri: 8.0.1 optionalDependencies: @@ -20081,7 +20000,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.3.0: + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -20092,6 +20011,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.0: {} + ansi-regex@6.2.2: {} ansi-split@1.0.1: @@ -20104,12 +20025,14 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.2 + picomatch: 2.3.1 apache-md5@1.1.8: {} @@ -20124,6 +20047,9 @@ snapshots: readable-stream: 2.3.8 optional: true + arg@4.1.3: + optional: true + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -20150,7 +20076,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -20185,15 +20111,17 @@ snapshots: aws4@1.13.2: {} - b4a@1.8.0: {} + b4a@1.6.7: {} - babel-jest@30.3.0(@babel/core@7.29.0)(@babel/types@7.29.0): + b4a@1.7.3: {} + + babel-jest@30.3.0(@babel/core@7.28.3)(@babel/types@7.29.0): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 '@jest/transform': 30.3.0(@babel/types@7.29.0) '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1(@babel/types@7.29.0) - babel-preset-jest: 30.3.0(@babel/core@7.29.0) + babel-preset-jest: 30.3.0(@babel/core@7.28.3) chalk: 4.1.2 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) slash: 3.0.0 @@ -20201,9 +20129,20 @@ snapshots: - '@babel/types' - supports-color + babel-plugin-istanbul@7.0.1(@babel/types@7.28.2): + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3(@babel/types@7.28.2) + test-exclude: 6.0.0 + transitivePeerDependencies: + - '@babel/types' + - supports-color + babel-plugin-istanbul@7.0.1(@babel/types@7.29.0): dependencies: - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 6.0.3(@babel/types@7.29.0) @@ -20216,30 +20155,30 @@ snapshots: dependencies: '@types/babel__core': 7.20.5 - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.3): dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + '@babel/core': 7.28.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3) - babel-preset-jest@30.3.0(@babel/core@7.29.0): + babel-preset-jest@30.3.0(@babel/core@7.28.3): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 babel-plugin-jest-hoist: 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3) bail@2.0.2: {} @@ -20247,41 +20186,8 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.6: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.10.0(bare-events@2.8.2) - bare-url: 2.4.0 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - bare-os@3.8.0: {} - - bare-path@3.0.0: - dependencies: - bare-os: 3.8.0 - - bare-stream@2.10.0(bare-events@2.8.2): - dependencies: - streamx: 2.25.0 - teex: 1.0.1 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - bare-url@2.4.0: - dependencies: - bare-path: 3.0.0 - base64-js@1.5.1: {} - baseline-browser-mapping@2.10.10: {} - bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -20309,7 +20215,7 @@ snapshots: npm-normalize-package-bin: 5.0.0 proc-log: 6.1.0 read-cmd-shim: 6.0.0 - write-file-atomic: 7.0.1 + write-file-atomic: 7.0.0 bintrees@1.0.2: {} @@ -20321,21 +20227,26 @@ snapshots: bluebird@2.11.0: {} - body-parser@2.2.2: + body-parser@2.2.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.0 on-finished: 2.4.1 - qs: 6.15.0 + qs: 6.14.1 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: - supports-color - bole@5.0.28: + bole@5.0.17: + dependencies: + fast-safe-stringify: 2.1.1 + individual: 3.0.0 + + bole@5.0.19: dependencies: fast-safe-stringify: 2.1.1 individual: 3.0.0 @@ -20356,13 +20267,12 @@ snapshots: dependencies: pako: 0.2.9 - browserslist@4.28.1: + browserslist@4.25.3: dependencies: - baseline-browser-mapping: 2.10.10 - caniuse-lite: 1.0.30001781 - electron-to-chromium: 1.5.322 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + caniuse-lite: 1.0.30001737 + electron-to-chromium: 1.5.211 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.3) bser@2.1.1: dependencies: @@ -20386,7 +20296,7 @@ snapshots: builtins@5.1.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 bytes@3.1.2: {} @@ -20410,11 +20320,11 @@ snapshots: fs-minipass: 3.0.3 glob: 11.1.0 lru-cache: 10.4.3 - minipass: 7.1.3 + minipass: 7.1.2 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 7.0.4 + p-map: 7.0.3 ssri: 12.0.0 tar: 7.5.13 unique-filename: 4.0.0 @@ -20424,13 +20334,13 @@ snapshots: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 glob: 13.0.6 - lru-cache: 11.2.7 - minipass: 7.1.3 + lru-cache: 11.1.0 + minipass: 7.1.2 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 7.0.4 - ssri: 13.0.1 + p-map: 7.0.3 + ssri: 13.0.0 cacheable-lookup@5.0.4: {} @@ -20475,12 +20385,12 @@ snapshots: callsites@3.1.0: {} - camelcase-keys@10.0.2: + camelcase-keys@10.0.1: dependencies: - camelcase: 9.0.0 - map-obj: 6.0.0 + camelcase: 8.0.0 + map-obj: 5.0.2 quick-lru: 7.3.0 - type-fest: 5.5.0 + type-fest: 4.41.0 camelcase-keys@6.2.2: dependencies: @@ -20501,6 +20411,8 @@ snapshots: camelcase@7.0.1: {} + camelcase@8.0.0: {} + camelcase@9.0.0: {} can-link@2.0.0: {} @@ -20509,13 +20421,13 @@ snapshots: can-write-to-dir@1.1.1: dependencies: - path-temp: 2.1.1 + path-temp: 2.1.0 can-write-to-dir@2.0.0: dependencies: path-temp: 3.0.0 - caniuse-lite@1.0.30001781: {} + caniuse-lite@1.0.30001737: {} caseless@0.12.0: {} @@ -20533,21 +20445,25 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.0: {} + chalk@5.6.2: {} char-regex@1.0.2: {} character-entities@2.0.2: {} + chardet@0.7.0: {} + chardet@2.1.1: {} chownr@3.0.0: {} ci-info@3.9.0: {} - ci-info@4.4.0: {} + ci-info@4.3.0: {} - cjs-module-lexer@2.2.0: {} + cjs-module-lexer@2.1.0: {} clean-stack@2.2.0: {} @@ -20616,7 +20532,7 @@ snapshots: code-point-at@1.1.0: optional: true - collect-v8-coverage@1.0.3: {} + collect-v8-coverage@1.0.2: {} color-convert@2.0.1: dependencies: @@ -20647,7 +20563,7 @@ snapshots: array-timsort: 1.0.3 esprima: 4.0.1 - comment-parser@1.4.5: {} + comment-parser@1.4.1: {} compare-func@2.0.0: dependencies: @@ -20717,9 +20633,9 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.0.7: {} + cookie-signature@1.0.6: {} - cookie@0.7.2: {} + cookie@0.7.1: {} core-util-is@1.0.2: {} @@ -20730,11 +20646,11 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@6.2.0(@types/node@22.19.15)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@22.19.15)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3): dependencies: '@types/node': 22.19.15 cosmiconfig: 9.0.1(typescript@5.9.3) - jiti: 2.6.1 + jiti: 2.5.1 typescript: 5.9.3 cosmiconfig@9.0.1(typescript@5.9.3): @@ -20746,6 +20662,9 @@ snapshots: optionalDependencies: typescript: 5.9.3 + create-require@1.1.1: + optional: true + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 @@ -20787,7 +20706,7 @@ snapshots: cspell-glob@9.7.0: dependencies: '@cspell/url': 9.7.0 - picomatch: 4.0.4 + picomatch: 4.0.3 cspell-grammar@9.7.0: dependencies: @@ -20850,7 +20769,7 @@ snapshots: cspell-io: 9.7.0 cspell-lib: 9.7.0 fast-json-stable-stringify: 2.1.0 - flatted: 3.4.2 + flatted: 3.3.3 semver: 7.7.4 tinyglobby: 0.2.15 @@ -20866,8 +20785,6 @@ snapshots: data-uri-to-buffer@3.0.1: {} - data-uri-to-buffer@4.0.1: {} - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -20888,6 +20805,11 @@ snapshots: dayjs@1.11.13: {} + debug@3.2.7: + dependencies: + ms: 2.1.3 + optional: true + debug@4.4.1: dependencies: ms: 2.1.3 @@ -20903,7 +20825,7 @@ snapshots: decamelize@1.2.0: {} - decamelize@6.0.1: {} + decamelize@6.0.0: {} decode-named-character-reference@1.3.0: dependencies: @@ -20913,7 +20835,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.7.2: {} + dedent@1.6.0: {} deep-is@0.1.4: {} @@ -20984,7 +20906,9 @@ snapshots: detect-indent@7.0.2: {} - detect-libc@2.1.2: {} + detect-libc@2.0.3: {} + + detect-libc@2.0.4: {} detect-newline@3.1.0: {} @@ -20994,11 +20918,14 @@ snapshots: didyoumean2@7.0.4: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.3 fastest-levenshtein: 1.0.16 lodash.deburr: 4.1.0 - diff@8.0.4: {} + diff@8.0.3: {} + + diff@8.0.4: + optional: true dint@5.1.0: dependencies: @@ -21022,7 +20949,7 @@ snapshots: dependencies: is-obj: 2.0.0 - dotenv@16.6.1: {} + dotenv@16.5.0: {} dunder-proto@1.0.1: dependencies: @@ -21039,6 +20966,8 @@ snapshots: each-limit@1.0.0: {} + eastasianwidth@0.2.0: {} + ecc-jsbn@0.1.2: dependencies: jsbn: 0.1.1 @@ -21050,16 +20979,20 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.322: {} + electron-to-chromium@1.5.211: {} emittery@0.13.1: {} emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + encode-registry@3.0.1: dependencies: mem: 8.1.1 + encodeurl@1.0.2: {} + encodeurl@2.0.0: {} encoding@0.1.13: @@ -21071,10 +21004,10 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.20.1: + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) - tapable: 2.3.2 + tapable: 2.3.0 enquirer@2.4.1: dependencies: @@ -21093,11 +21026,11 @@ snapshots: err-code@2.0.3: {} - error-ex@1.3.4: + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.24.1: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -21152,7 +21085,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} @@ -21216,88 +21149,98 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@10.0.3(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@10.1.0(jiti@2.5.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) - semver: 7.7.4 + eslint: 10.1.0(jiti@2.5.1) + semver: 7.7.3 eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - get-tsconfig: 4.13.7 + get-tsconfig: 4.10.1 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 - eslint-plugin-es-x@7.8.0(eslint@10.0.3(jiti@2.6.1)): + eslint-import-resolver-node@0.3.9: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - eslint: 10.0.3(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@10.0.3(jiti@2.6.1)) + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + optional: true - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@10.1.0(jiti@2.5.1)): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.5.1)) + '@eslint-community/regexpp': 4.12.2 + eslint: 10.1.0(jiti@2.5.1) + eslint-compat-utils: 0.5.1(eslint@10.1.0(jiti@2.5.1)) + + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.1.0(jiti@2.5.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.57.2 - comment-parser: 1.4.5 + comment-parser: 1.4.1 debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.2.4 - semver: 7.7.4 + semver: 7.7.3 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(jest@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15))(typescript@5.9.3): + eslint-plugin-jest@29.12.1(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.5.1))(jest@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.57.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - jest: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15) - typescript: 5.9.3 + '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) + jest: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)) transitivePeerDependencies: - supports-color + - typescript - eslint-plugin-n@17.24.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@17.23.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) - enhanced-resolve: 5.20.1 - eslint: 10.0.3(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@10.0.3(jiti@2.6.1)) - get-tsconfig: 4.13.7 + '@eslint-community/eslint-utils': 4.7.0(eslint@10.1.0(jiti@2.5.1)) + enhanced-resolve: 5.18.4 + eslint: 10.1.0(jiti@2.5.1) + eslint-plugin-es-x: 7.8.0(eslint@10.1.0(jiti@2.5.1)) + get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.4 + semver: 7.7.3 ts-declaration-location: 1.0.7(typescript@5.9.3) transitivePeerDependencies: - typescript - eslint-plugin-promise@7.2.1(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-promise@7.2.1(eslint@10.1.0(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) - eslint: 10.0.3(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@10.1.0(jiti@2.5.1)) + eslint: 10.1.0(jiti@2.5.1) - eslint-plugin-regexp@3.1.0(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-regexp@3.1.0(eslint@10.1.0(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.2 - comment-parser: 1.4.5 - eslint: 10.0.3(jiti@2.6.1) + comment-parser: 1.4.1 + eslint: 10.1.0(jiti@2.5.1) jsdoc-type-pratt-parser: 7.1.1 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-simple-import-sort@12.1.1(eslint@10.1.0(jiti@2.5.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.5.1) eslint-scope@9.1.2: dependencies: @@ -21312,9 +21255,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.0.3(jiti@2.6.1): + eslint@10.1.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.3 '@eslint/config-helpers': 0.5.3 @@ -21345,14 +21288,14 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.5.1 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 espree@11.2.0: @@ -21381,7 +21324,7 @@ snapshots: eventemitter3@4.0.7: {} - eventemitter3@5.0.4: {} + eventemitter3@5.0.1: {} events-universal@1.0.1: dependencies: @@ -21423,7 +21366,7 @@ snapshots: is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.3.0 + pretty-ms: 9.2.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 yoctocolors: 2.1.2 @@ -21432,6 +21375,15 @@ snapshots: exit-x@0.2.2: {} + expect@30.0.5: + dependencies: + '@jest/expect-utils': 30.0.5 + '@jest/get-type': 30.0.1 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 + expect@30.3.0: dependencies: '@jest/expect-utils': 30.3.0 @@ -21441,7 +21393,7 @@ snapshots: jest-mock: 30.3.0 jest-util: 30.3.0 - exponential-backoff@3.1.3: {} + exponential-backoff@3.1.2: {} express-rate-limit@5.5.1: {} @@ -21449,30 +21401,30 @@ snapshots: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 2.2.2 + body-parser: 2.2.1 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 + cookie: 0.7.1 + cookie-signature: 1.0.6 debug: 4.4.3 depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.3.2 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.1 merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.13 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.2 + qs: 6.14.1 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.2 type-is: 1.6.18 @@ -21485,6 +21437,12 @@ snapshots: extendable-error@0.1.7: {} + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.2.5 + extsprintf@1.3.0: {} fast-deep-equal@3.1.3: {} @@ -21509,11 +21467,11 @@ snapshots: fast-string-compare@3.0.0: {} - fast-uri@3.1.0: {} + fast-uri@3.0.6: {} fastest-levenshtein@1.0.16: {} - fastq@1.20.1: + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -21521,17 +21479,16 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.4.5(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.3 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 fetch-blob@2.1.2: {} - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 @@ -21555,14 +21512,14 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.2: + finalhandler@1.3.1: dependencies: debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.2 + statuses: 2.0.1 unpipe: 1.0.0 transitivePeerDependencies: - supports-color @@ -21616,12 +21573,12 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.4.2: {} + flatted@3.3.3: {} - follow-redirects@1.15.11: {} + follow-redirects@1.15.9: {} for-each@0.3.5: dependencies: @@ -21636,7 +21593,7 @@ snapshots: form-data-encoder@1.7.2: {} - form-data@4.0.5: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -21644,10 +21601,6 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - forwarded@0.2.0: {} fresh@0.5.2: {} @@ -21658,6 +21611,18 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-extra@11.3.1: + dependencies: + graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) + jsonfile: 6.2.0 + universalify: 2.0.1 + fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) @@ -21684,7 +21649,7 @@ snapshots: fs-minipass@3.0.3: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 fs.realpath@1.0.0: {} @@ -21740,8 +21705,6 @@ snapshots: wide-align: 1.1.5 optional: true - generator-function@2.0.1: {} - gensequence@8.0.8: {} gensync@1.0.0-beta.2: {} @@ -21767,7 +21730,7 @@ snapshots: get-package-type@0.1.0: {} - get-port@7.2.0: {} + get-port@7.1.0: {} get-proto@1.0.1: dependencies: @@ -21781,11 +21744,11 @@ snapshots: get-stream@4.1.0: dependencies: - pump: 3.0.4 + pump: 3.0.3 get-stream@5.2.0: dependencies: - pump: 3.0.4 + pump: 3.0.3 get-stream@6.0.1: {} @@ -21800,7 +21763,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.7: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -21836,11 +21799,11 @@ snapshots: glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 4.2.3 + jackspeak: 4.1.1 minimatch: 10.2.4 - minipass: 7.1.3 + minipass: 7.1.2 package-json-from-dist: 1.0.1 - path-scurry: 2.0.2 + path-scurry: 2.0.0 glob@13.0.6: dependencies: @@ -21853,7 +21816,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.5 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -21862,7 +21825,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.9 + minimatch: 5.1.6 once: 1.4.0 global-directory@4.0.1: @@ -22010,17 +21973,17 @@ snapshots: dependencies: lru-cache: 7.18.3 + hosted-git-info@6.1.3: + dependencies: + lru-cache: 7.18.3 + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 - hosted-git-info@8.1.0: + hosted-git-info@9.0.0: dependencies: - lru-cache: 10.4.3 - - hosted-git-info@9.0.2: - dependencies: - lru-cache: 11.2.7 + lru-cache: 11.1.0 hpagent@1.2.0: {} @@ -22046,14 +22009,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.4 + agent-base: 7.1.3 debug: 4.4.3 transitivePeerDependencies: - supports-color http-proxy-middleware@2.0.9: dependencies: - '@types/http-proxy': 1.17.17 + '@types/http-proxy': 1.17.16 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 @@ -22064,7 +22027,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11 + follow-redirects: 1.15.9 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -22102,7 +22065,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.4 + agent-base: 7.1.3 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -22116,7 +22079,7 @@ snapshots: - debug - supports-color - human-id@4.1.3: {} + human-id@4.1.1: {} human-signals@2.1.0: {} @@ -22131,23 +22094,30 @@ snapshots: hyperdrive-schemas@2.0.0: dependencies: protocol-buffers-encodings: 1.2.0 - transitivePeerDependencies: - - react-native-b4a + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 optional: true + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 + optional: true ieee754@1.2.1: {} ignore-walk@5.0.1: dependencies: - minimatch: 5.1.9 + minimatch: 5.1.6 ignore-walk@8.0.0: dependencies: @@ -22167,6 +22137,8 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} imurmurhash@0.1.4: {} @@ -22175,7 +22147,7 @@ snapshots: indent-string@5.0.0: {} - index-to-position@1.2.0: {} + index-to-position@1.1.0: {} individual@3.0.0: {} @@ -22194,12 +22166,12 @@ snapshots: ini@6.0.0: {} - inquirer@9.3.8(@types/node@22.19.15): + inquirer@9.3.7: dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@22.19.15) - '@inquirer/figures': 1.0.15 + '@inquirer/figures': 1.0.13 ansi-escapes: 4.3.2 cli-width: 4.1.0 + external-editor: 3.1.0 mute-stream: 1.0.0 ora: 5.4.1 run-async: 3.0.0 @@ -22208,8 +22180,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 - transitivePeerDependencies: - - '@types/node' internal-slot@1.1.0: dependencies: @@ -22219,7 +22189,10 @@ snapshots: interpret@1.4.0: {} - ip-address@10.1.0: {} + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 ipaddr.js@1.9.1: {} @@ -22288,10 +22261,9 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.1.2: + is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 - generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -22384,7 +22356,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 is-typedarray@1.0.0: {} @@ -22415,7 +22387,7 @@ snapshots: isexe@2.0.0: {} - isexe@3.1.5: {} + isexe@3.1.1: {} isexe@4.0.0: {} @@ -22423,13 +22395,24 @@ snapshots: istanbul-lib-coverage@3.2.2: {} - istanbul-lib-instrument@6.0.3(@babel/types@7.29.0): + istanbul-lib-instrument@6.0.3(@babel/types@7.28.2): dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.2(@babel/types@7.29.0) + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3(@babel/types@7.28.2) '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.4 + semver: 7.7.3 + transitivePeerDependencies: + - '@babel/types' + - supports-color + + istanbul-lib-instrument@6.0.3(@babel/types@7.29.0): + dependencies: + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3(@babel/types@7.29.0) + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.3 transitivePeerDependencies: - '@babel/types' - supports-color @@ -22442,15 +22425,15 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.30 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - jackspeak@4.2.3: + jackspeak@4.1.1: dependencies: - '@isaacs/cliui': 9.0.0 + '@isaacs/cliui': 8.0.2 jest-changed-files@30.3.0: dependencies: @@ -22464,10 +22447,10 @@ snapshots: '@jest/expect': 30.3.0 '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.2 + dedent: 1.6.0 is-generator-fn: 2.1.0 jest-each: 30.3.0 jest-matcher-utils: 30.3.0 @@ -22485,15 +22468,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15): + jest-cli@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)): dependencies: - '@jest/core': 30.3.0(@babel/types@7.29.0) + '@jest/core': 30.3.0(@babel/types@7.29.0)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)) '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15) + jest-config: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)) jest-util: 30.3.0 jest-validate: 30.3.0 yargs: 17.7.2 @@ -22505,16 +22488,16 @@ snapshots: - supports-color - ts-node - jest-config@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15): + jest-config@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 '@jest/test-sequencer': 30.3.0 '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.0)(@babel/types@7.29.0) + babel-jest: 30.3.0(@babel/core@7.28.3)(@babel/types@7.29.0) chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 deepmerge: 4.3.1 glob: 11.1.0 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) @@ -22532,42 +22515,18 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.19.15 + ts-node: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) transitivePeerDependencies: - '@babel/types' - babel-plugin-macros - supports-color - jest-config@30.3.0(@babel/types@7.29.0)(@types/node@25.5.0): + jest-diff@30.0.5: dependencies: - '@babel/core': 7.29.0 - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.3.0 - '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.0)(@babel/types@7.29.0) + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.0.1 chalk: 4.1.2 - ci-info: 4.4.0 - deepmerge: 4.3.1 - glob: 11.1.0 - graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) - jest-circus: 30.3.0(@babel/types@7.29.0) - jest-docblock: 30.2.0 - jest-environment-node: 30.3.0 - jest-regex-util: 30.0.1 - jest-resolve: 30.3.0 - jest-runner: 30.3.0(@babel/types@7.29.0) - jest-util: 30.3.0 - jest-validate: 30.3.0 - parse-json: 5.2.0 - pretty-format: 30.3.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 25.5.0 - transitivePeerDependencies: - - '@babel/types' - - babel-plugin-macros - - supports-color + pretty-format: 30.0.5 jest-diff@30.3.0: dependencies: @@ -22593,7 +22552,7 @@ snapshots: '@jest/environment': 30.3.0 '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 jest-mock: 30.3.0 jest-util: 30.3.0 jest-validate: 30.3.0 @@ -22604,7 +22563,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 25.5.0 + '@types/node': 22.19.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) @@ -22619,14 +22578,14 @@ snapshots: jest-haste-map@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) jest-regex-util: 30.0.1 jest-util: 30.3.0 jest-worker: 30.3.0 - picomatch: 4.0.4 + picomatch: 4.0.3 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -22636,6 +22595,13 @@ snapshots: '@jest/get-type': 30.1.0 pretty-format: 30.3.0 + jest-matcher-utils@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + jest-diff: 30.0.5 + pretty-format: 30.0.5 + jest-matcher-utils@30.3.0: dependencies: '@jest/get-type': 30.1.0 @@ -22643,22 +22609,40 @@ snapshots: jest-diff: 30.3.0 pretty-format: 30.3.0 + jest-message-util@30.0.5: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.0.5 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) + micromatch: 4.0.8 + pretty-format: 30.0.5 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-message-util@30.3.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.27.1 '@jest/types': 30.3.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) - picomatch: 4.0.4 + picomatch: 4.0.3 pretty-format: 30.3.0 slash: 3.0.0 stack-utils: 2.0.6 + jest-mock@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 22.19.15 + jest-util: 30.0.5 + jest-mock@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.7 jest-util: 30.3.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -22688,7 +22672,7 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.11 + resolve: 1.22.10 resolve.exports: 2.0.3 slash: 3.0.0 @@ -22710,7 +22694,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0(@babel/types@7.29.0) '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -22740,10 +22724,10 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0(@babel/types@7.29.0) '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 chalk: 4.1.2 - cjs-module-lexer: 2.2.0 - collect-v8-coverage: 1.0.3 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.2 glob: 11.1.0 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) jest-haste-map: 30.3.0 @@ -22761,17 +22745,17 @@ snapshots: jest-snapshot@30.3.0: dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/types': 7.29.0 + '@babel/core': 7.28.3 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/types': 7.28.2 '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.3.0 - '@jest/transform': 30.3.0(@babel/types@7.29.0) + '@jest/transform': 30.3.0(@babel/types@7.28.2) '@jest/types': 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3) chalk: 4.1.2 expect: 30.3.0 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) @@ -22780,28 +22764,37 @@ snapshots: jest-message-util: 30.3.0 jest-util: 30.3.0 pretty-format: 30.3.0 - semver: 7.7.4 - synckit: 0.11.12 + semver: 7.7.3 + synckit: 0.11.11 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 25.5.0 + '@types/node': 22.19.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) - picomatch: 2.3.2 + picomatch: 2.3.1 + + jest-util@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 22.19.15 + chalk: 4.1.2 + ci-info: 4.3.0 + graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) + picomatch: 4.0.3 jest-util@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 chalk: 4.1.2 - ci-info: 4.4.0 + ci-info: 4.3.0 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) - picomatch: 4.0.4 + picomatch: 4.0.3 jest-validate@29.7.0: dependencies: @@ -22825,7 +22818,7 @@ snapshots: dependencies: '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 22.19.15 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -22834,25 +22827,25 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.3.0: dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.15 '@ungap/structured-clone': 1.3.0 jest-util: 30.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15): + jest@30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)): dependencies: - '@jest/core': 30.3.0(@babel/types@7.29.0) + '@jest/core': 30.3.0(@babel/types@7.29.0)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)) '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15) + jest-cli: 30.3.0(@babel/types@7.29.0)(@types/node@22.19.15)(ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3)) transitivePeerDependencies: - '@babel/types' - '@types/node' @@ -22861,7 +22854,7 @@ snapshots: - supports-color - ts-node - jiti@2.6.1: {} + jiti@2.5.1: {} js-tokens@4.0.0: {} @@ -22872,6 +22865,8 @@ snapshots: jsbn@0.1.1: {} + jsbn@1.1.0: {} + jsdoc-type-pratt-parser@7.1.1: {} jsesc@3.1.0: {} @@ -22966,13 +22961,13 @@ snapshots: libnpmpublish@11.1.3: dependencies: '@npmcli/package-json': 7.0.5 - ci-info: 4.4.0 + ci-info: 4.3.0 npm-package-arg: 13.0.2 npm-registry-fetch: 19.1.1 proc-log: 6.1.0 - semver: 7.7.4 + semver: 7.7.3 sigstore: 4.1.0 - ssri: 13.0.1 + ssri: 13.0.0 transitivePeerDependencies: - supports-color @@ -23092,6 +23087,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lru-cache@11.2.7: {} lru-cache@5.1.1: @@ -23106,7 +23103,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 make-empty-dir@3.0.2: dependencies: @@ -23116,12 +23113,15 @@ snapshots: dependencies: '@zkochan/rimraf': 4.0.0 + make-error@1.3.6: + optional: true + make-fetch-happen@14.0.3: dependencies: '@npmcli/agent': 3.0.0 cacache: 19.0.1 http-cache-semantics: 4.2.0 - minipass: 7.1.3 + minipass: 7.1.2 minipass-fetch: 4.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -23139,13 +23139,13 @@ snapshots: '@npmcli/redact': 4.0.0 cacache: 20.0.4 http-cache-semantics: 4.2.0 - minipass: 7.1.3 + minipass: 7.1.2 minipass-fetch: 5.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 1.0.0 proc-log: 6.1.0 - ssri: 13.0.1 + ssri: 13.0.0 transitivePeerDependencies: - supports-color @@ -23163,7 +23163,7 @@ snapshots: map-obj@4.3.0: {} - map-obj@6.0.0: {} + map-obj@5.0.2: {} math-intrinsics@1.1.0: {} @@ -23227,7 +23227,7 @@ snapshots: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 8.0.2 - decamelize: 6.0.1 + decamelize: 6.0.0 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 minimist-options: 4.1.0 @@ -23399,7 +23399,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.2 + picomatch: 2.3.1 mime-db@1.52.0: {} @@ -23433,11 +23433,11 @@ snapshots: dependencies: brace-expansion: 5.0.5 - minimatch@3.1.5: + minimatch@3.1.2: dependencies: brace-expansion: 5.0.5 - minimatch@5.1.9: + minimatch@5.1.6: dependencies: brace-expansion: 5.0.5 @@ -23455,11 +23455,11 @@ snapshots: minipass-collect@2.0.1: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 minipass-fetch@4.0.1: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 minipass-sized: 1.0.3 minizlib: 3.1.0 optionalDependencies: @@ -23467,7 +23467,7 @@ snapshots: minipass-fetch@5.0.2: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 minipass-sized: 2.0.0 minizlib: 3.1.0 optionalDependencies: @@ -23487,17 +23487,19 @@ snapshots: minipass-sized@2.0.0: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 minipass@3.3.6: dependencies: yallist: 4.0.0 + minipass@7.1.2: {} + minipass@7.1.3: {} minizlib@3.1.0: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 mkdirp@1.0.4: {} @@ -23533,10 +23535,18 @@ snapshots: napi-macros@2.2.2: optional: true - napi-postinstall@0.3.4: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} + ndjson@2.0.0: + dependencies: + json-stringify-safe: 5.0.1 + minimist: 1.2.8 + readable-stream: 3.6.2 + split2: 3.2.2 + through2: 4.0.2 + negotiator@0.6.3: {} negotiator@0.6.4: {} @@ -23565,23 +23575,15 @@ snapshots: transitivePeerDependencies: - supports-color - node-domexception@1.0.0: {} - node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-gyp-build-optional-packages@5.2.2: dependencies: - detect-libc: 2.1.2 + detect-libc: 2.0.4 optional: true node-gyp-build@4.8.4: @@ -23590,12 +23592,12 @@ snapshots: node-gyp@11.5.0: dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.3 + exponential-backoff: 3.1.2 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) make-fetch-happen: 14.0.3 nopt: 8.1.0 proc-log: 5.0.0 - semver: 7.7.4 + semver: 7.7.3 tar: 7.5.13 tinyglobby: 0.2.15 which: 5.0.0 @@ -23605,12 +23607,12 @@ snapshots: node-gyp@12.2.0: dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.3 + exponential-backoff: 3.1.2 graceful-fs: 4.2.11(patch_hash=68ebc232025360cb3dcd3081f4067f4e9fc022ab6b6f71a3230e86c7a5b337d1) make-fetch-happen: 15.0.5 nopt: 9.0.0 proc-log: 6.1.0 - semver: 7.7.4 + semver: 7.7.3 tar: 7.5.13 tinyglobby: 0.2.15 which: 6.0.1 @@ -23619,7 +23621,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.36: {} + node-releases@2.0.19: {} nopt@1.0.10: dependencies: @@ -23639,43 +23641,46 @@ snapshots: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.11 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@4.0.1: dependencies: hosted-git-info: 5.2.1 is-core-module: 2.16.1 - semver: 7.7.4 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + + normalize-package-data@5.0.0: + dependencies: + hosted-git-info: 6.1.3 + is-core-module: 2.16.1 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.4 - validate-npm-package-license: 3.0.4 - - normalize-package-data@7.0.1: - dependencies: - hosted-git-info: 8.1.0 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@8.0.0: dependencies: - hosted-git-info: 9.0.2 - semver: 7.7.4 + hosted-git-info: 9.0.0 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} + normalize-registry-url@2.0.0: {} + normalize-registry-url@2.0.1: {} normalize-url@6.1.0: {} @@ -23686,7 +23691,7 @@ snapshots: npm-install-checks@8.0.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 npm-normalize-package-bin@2.0.0: {} @@ -23696,15 +23701,15 @@ snapshots: npm-package-arg@13.0.2: dependencies: - hosted-git-info: 9.0.2 + hosted-git-info: 9.0.0 proc-log: 6.1.0 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-name: 7.0.2 npm-package-arg@8.1.5: dependencies: hosted-git-info: 4.1.0 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-name: 3.0.0 npm-packlist@10.0.4: @@ -23724,14 +23729,14 @@ snapshots: npm-install-checks: 8.0.0 npm-normalize-package-bin: 5.0.0 npm-package-arg: 13.0.2 - semver: 7.7.4 + semver: 7.7.3 npm-registry-fetch@19.1.1: dependencies: '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 make-fetch-happen: 15.0.5 - minipass: 7.1.3 + minipass: 7.1.2 minipass-fetch: 5.0.2 minizlib: 3.1.0 npm-package-arg: 13.0.2 @@ -23857,7 +23862,7 @@ snapshots: p-filter@4.1.0: dependencies: - p-map: 7.0.4 + p-map: 7.0.3 p-finally@1.0.0: {} @@ -23871,11 +23876,15 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.2.2 + yocto-queue: 1.2.1 + + p-limit@7.1.0: + dependencies: + yocto-queue: 1.2.1 p-limit@7.3.0: dependencies: - yocto-queue: 1.2.2 + yocto-queue: 1.2.1 p-locate@4.1.0: dependencies: @@ -23899,7 +23908,7 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-map@7.0.4: {} + p-map@7.0.3: {} p-memoize@4.0.1: dependencies: @@ -23918,13 +23927,18 @@ snapshots: p-queue@9.1.0: dependencies: - eventemitter3: 5.0.4 + eventemitter3: 5.0.1 p-timeout: 7.0.1 p-reflect@2.1.0: {} p-reflect@3.1.0: {} + p-settle@4.1.1: + dependencies: + p-limit: 2.3.0 + p-reflect: 2.1.0 + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 @@ -23951,24 +23965,28 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 - error-ex: 1.3.4 + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.29.0 - index-to-position: 1.2.0 + '@babel/code-frame': 7.27.1 + index-to-position: 1.1.0 type-fest: 4.41.0 parse-ms@2.1.0: {} parse-ms@4.0.0: {} + parse-npm-tarball-url@3.0.0: + dependencies: + semver: 7.7.3 + parse-npm-tarball-url@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 parseurl@1.3.3: {} @@ -23998,9 +24016,14 @@ snapshots: path-parse@1.0.7: {} + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + path-scurry@2.0.2: dependencies: - lru-cache: 11.2.7 + lru-cache: 11.1.0 minipass: 7.1.3 path-strip-sep@1.0.21: @@ -24011,7 +24034,7 @@ snapshots: dependencies: unique-string: 2.0.0 - path-temp@2.1.1: + path-temp@2.1.0: dependencies: unique-string: 2.0.0 @@ -24019,7 +24042,7 @@ snapshots: dependencies: unique-string: 3.0.0 - path-to-regexp@0.1.13: {} + path-to-regexp@0.1.12: {} path-type@4.0.0: {} @@ -24033,9 +24056,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.1: {} - picomatch@4.0.4: {} + picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -24052,7 +24075,7 @@ snapshots: dependencies: split2: 4.2.0 - pino-std-serializers@7.1.0: {} + pino-std-serializers@7.0.0: {} pino@9.14.0: dependencies: @@ -24060,12 +24083,12 @@ snapshots: atomic-sleep: 1.0.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 - pino-std-serializers: 7.1.0 + pino-std-serializers: 7.0.0 process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 - sonic-boom: 4.2.1 + sonic-boom: 4.2.0 thread-stream: 3.1.0 pirates@4.0.7: {} @@ -24136,6 +24159,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.0.5: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-format@30.3.0: dependencies: '@jest/schemas': 30.0.5 @@ -24146,13 +24175,13 @@ snapshots: dependencies: parse-ms: 2.1.0 - pretty-ms@9.3.0: + pretty-ms@9.2.0: dependencies: parse-ms: 4.0.0 print-diff@2.0.0: dependencies: - diff: 8.0.4 + diff: 8.0.3 printable-characters@1.0.42: {} @@ -24189,11 +24218,9 @@ snapshots: protocol-buffers-encodings@1.2.0: dependencies: - b4a: 1.8.0 + b4a: 1.6.7 signed-varint: 2.0.1 varint: 5.0.0 - transitivePeerDependencies: - - react-native-b4a proxy-addr@2.0.7: dependencies: @@ -24217,7 +24244,7 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 - pump@3.0.4: + pump@3.0.3: dependencies: end-of-stream: 1.4.5 once: 1.4.0 @@ -24234,7 +24261,7 @@ snapshots: qrcode-terminal@0.12.0: {} - qs@6.14.2: + qs@6.14.1: dependencies: side-channel: 1.1.0 @@ -24266,7 +24293,7 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.0 unpipe: 1.0.0 react-is@18.3.1: {} @@ -24378,7 +24405,7 @@ snapshots: redent@4.0.0: dependencies: indent-string: 5.0.0 - strip-indent: 4.1.1 + strip-indent: 4.0.0 refa@0.12.1: dependencies: @@ -24388,7 +24415,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -24426,7 +24453,7 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - rename-overwrite@6.0.6: + rename-overwrite@6.0.3: dependencies: '@zkochan/rimraf': 3.0.2 fs-extra: 11.3.0 @@ -24464,6 +24491,12 @@ snapshots: resolve.exports@2.0.3: {} + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -24579,7 +24612,7 @@ snapshots: safer-buffer@2.1.2: {} - sanitize-filename@1.6.4: + sanitize-filename@1.6.3: dependencies: truncate-utf8-bytes: 1.0.2 @@ -24592,38 +24625,40 @@ snapshots: semver-range-intersect@0.3.1: dependencies: '@types/semver': 6.2.7 - semver: 7.7.4 + semver: 7.7.3 semver-utils@1.1.4: {} semver@7.7.2: {} + semver@7.7.3: {} + semver@7.7.4: {} - send@0.19.2: + send@0.19.0: dependencies: debug: 4.4.3 depd: 2.0.0 destroy: 1.2.0 - encodeurl: 2.0.0 + encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 - http-errors: 2.0.1 + http-errors: 2.0.0 mime: 1.6.0 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.2 + statuses: 2.0.1 transitivePeerDependencies: - supports-color - serve-static@1.16.3: + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.2 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -24669,8 +24704,6 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shlex@2.1.2: {} - shlex@3.0.0: {} short-tree@3.0.0: @@ -24759,22 +24792,22 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.4 + agent-base: 7.1.3 debug: 4.4.3 - socks: 2.8.7 + socks: 2.8.4 transitivePeerDependencies: - supports-color - socks@2.8.7: + socks@2.8.4: dependencies: - ip-address: 10.1.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 sonic-boom@3.8.1: dependencies: atomic-sleep: 1.0.0 - sonic-boom@4.2.1: + sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 @@ -24813,28 +24846,34 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.22 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.22 spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.23: {} + spdx-license-ids@3.0.22: {} split-cmd@1.1.0: {} + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + split2@4.2.0: {} sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -24849,15 +24888,19 @@ snapshots: ssri@10.0.5: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 ssri@12.0.0: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 + + ssri@13.0.0: + dependencies: + minipass: 7.1.2 ssri@13.0.1: dependencies: - minipass: 7.1.3 + minipass: 7.1.2 ssri@8.0.1: dependencies: @@ -24869,6 +24912,11 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stacktracey@2.1.8: + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + stacktracey@2.2.0: dependencies: as-table: 1.0.55 @@ -24893,11 +24941,11 @@ snapshots: stream-shift@1.0.3: {} - streamx@2.25.0: + streamx@2.23.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.7 + text-decoder: 1.2.3 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -24922,6 +24970,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string-width@8.2.0: dependencies: get-east-asian-width: 1.5.0 @@ -24932,7 +24986,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -24949,7 +25003,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -24983,6 +25037,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.2.0 + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -25005,7 +25063,9 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-indent@4.1.1: {} + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 strip-json-comments@3.1.1: {} @@ -25034,9 +25094,9 @@ snapshots: symlink-dir@6.0.5: dependencies: better-path-resolve: 1.0.0 - rename-overwrite: 6.0.6 + rename-overwrite: 6.0.3 - synckit@0.11.12: + synckit@0.11.11: dependencies: '@pkgr/core': 0.2.9 @@ -25048,45 +25108,25 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tagged-tag@1.0.0: {} - - tapable@2.3.2: {} + tapable@2.3.0: {} tar-stream@3.1.7: dependencies: - b4a: 1.8.0 + b4a: 1.7.3 fast-fifo: 1.3.2 - streamx: 2.25.0 + streamx: 2.23.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - tar-stream@3.1.8: - dependencies: - b4a: 1.8.0 - bare-fs: 4.5.6 - fast-fifo: 1.3.2 - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.3 + minipass: 7.1.2 minizlib: 3.1.0 yallist: 5.0.0 - teex@1.0.1: - dependencies: - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - temp-dir@2.0.0: {} tempy@1.0.1: @@ -25108,14 +25148,14 @@ snapshots: terminal-link@5.0.0: dependencies: - ansi-escapes: 7.3.0 + ansi-escapes: 7.0.0 supports-hyperlinks: 4.4.0 test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 - minimatch: 3.1.5 + minimatch: 3.1.2 test-exclude@8.0.0: dependencies: @@ -25123,9 +25163,9 @@ snapshots: glob: 13.0.6 minimatch: 10.2.4 - text-decoder@1.2.7: + text-decoder@1.2.3: dependencies: - b4a: 1.8.0 + b4a: 1.7.3 transitivePeerDependencies: - react-native-b4a @@ -25138,14 +25178,23 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + through@2.3.8: {} - tinyexec@1.0.4: {} + tinyexec@1.0.1: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.5(picomatch@4.0.3) + picomatch: 4.0.3 tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinylogic@2.0.0: {} @@ -25191,24 +25240,43 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.5.0(typescript@5.9.3): + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: - picomatch: 4.0.4 + picomatch: 4.0.3 typescript: 5.9.3 ts-jest-resolver@2.0.1: dependencies: jest-resolve: 29.7.0 + ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.19.15 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 8.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-toolbelt@9.6.0: {} ts-type@3.0.10(ts-toolbelt@9.6.0): dependencies: - '@types/node': 25.5.0 + '@types/node': 22.19.7 ts-toolbelt: 9.6.0 tslib: 2.8.1 typedarray-dts: 1.0.0 @@ -25257,10 +25325,6 @@ snapshots: type-fest@4.41.0: {} - type-fest@5.5.0: - dependencies: - tagged-tag: 1.0.0 - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -25317,13 +25381,13 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.5.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.5.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -25348,7 +25412,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.18.2: {} + undici@7.19.2: {} unicorn-magic@0.1.0: {} @@ -25413,7 +25477,7 @@ snapshots: unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.4 + napi-postinstall: 0.3.3 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -25440,16 +25504,16 @@ snapshots: upath2@3.1.23(ts-toolbelt@9.6.0): dependencies: '@lazy-node/types-path': 1.0.3(ts-toolbelt@9.6.0) - '@types/node': 25.5.0 + '@types/node': 22.19.7 path-is-network-drive: 1.0.24 path-strip-sep: 1.0.21 tslib: 2.8.1 transitivePeerDependencies: - ts-toolbelt - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.1.3(browserslist@4.25.3): dependencies: - browserslist: 4.28.1 + browserslist: 4.25.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -25472,11 +25536,14 @@ snapshots: uuid@9.0.1: {} + v8-compile-cache-lib@3.0.1: + optional: true + v8-compile-cache@2.4.0: {} v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.30 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -25575,7 +25642,7 @@ snapshots: version-selector-type@3.0.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 vfile-message@4.0.3: dependencies: @@ -25607,8 +25674,6 @@ snapshots: dependencies: defaults: 1.0.4 - web-streams-polyfill@3.3.3: {} - webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -25632,13 +25697,13 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 + is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -25656,7 +25721,7 @@ snapshots: dependencies: load-yaml-file: 1.0.0 - which-typed-array@1.1.20: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -25672,11 +25737,11 @@ snapshots: which@4.0.0: dependencies: - isexe: 3.1.5 + isexe: 3.1.1 which@5.0.0: dependencies: - isexe: 3.1.5 + isexe: 3.1.1 which@6.0.1: dependencies: @@ -25707,6 +25772,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@3.0.3: @@ -25726,6 +25797,11 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + write-file-atomic@7.0.0: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + write-file-atomic@7.0.1: dependencies: signal-exit: 4.1.0 @@ -25801,6 +25877,8 @@ snapshots: dependencies: js-yaml: 3.14.2 + yaml@2.8.1: {} + yaml@2.8.3: {} yargs-parser@20.2.9: {} @@ -25827,9 +25905,12 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: + optional: true + yocto-queue@0.1.0: {} - yocto-queue@1.2.2: {} + yocto-queue@1.2.1: {} yoctocolors-cjs@2.1.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8fad6980ab..ea274aac93 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -86,7 +86,6 @@ catalog: '@pnpm/log.group': 3.0.2 '@pnpm/logger': '>=1001.0.0 <1002.0.0' '@pnpm/meta-updater': 2.0.6 - '@pnpm/network.agent': ^2.0.3 '@pnpm/nopt': ^0.3.1 '@pnpm/npm-conf': 3.0.2 '@pnpm/npm-lifecycle': 1100.0.0-1 @@ -234,11 +233,8 @@ catalog: # msgpackr 1.11.9 has broken type definitions (uses Iterable/Iterator without # required type arguments), incompatible with TypeScript 5.9. msgpackr: 1.11.8 - nm-prune: ^5.0.0 - # nock 14 doesn't properly intercept node-fetch requests, causing tests - # that mock HTTP endpoints (e.g. audit) to hang indefinitely. nock: 13.3.4 - node-fetch: ^3.3.2 + nm-prune: ^5.0.0 normalize-newline: 5.0.0 normalize-package-data: ^8.0.0 normalize-path: ^3.0.0 @@ -260,7 +256,7 @@ catalog: path-temp: ^3.0.0 pidtree: ^0.6.0 preferred-pm: ^5.0.0 - pretty-bytes: ^7.0.1 + pretty-bytes: ^7.1.0 pretty-ms: ^9.2.0 promise-share: ^2.0.0 proxyquire: ^2.1.3 @@ -288,6 +284,7 @@ catalog: semver-utils: ^1.1.4 shlex: ^3.0.0 shx: ^0.4.0 + socks: ^2.8.1 sort-keys: ^6.0.0 split-cmd: ^1.1.0 split2: ^4.2.0 @@ -310,6 +307,7 @@ catalog: ts-jest-resolver: 2.0.1 typescript: 5.9.3 typescript-eslint: ^8.57.1 + undici: ^7.2.0 unified: ^11.0.5 validate-npm-package-name: 7.0.2 verdaccio: 6.3.2 @@ -423,6 +421,7 @@ overrides: jws@<3.2.3: '^3.2.3' lodash@>=4.0.0 <=4.17.22: '^4.17.23' minimatch@>=7.0.0 <7.4.7: '^7.4.7' + minimatch@>=9.0.0 <10.0.0: '>=10.2.4' nopt@5: npm:@pnpm/nopt@^0.2.1 on-headers@<1.1.0: '>=1.1.0' path-to-regexp@<0.1.12: ^0.1.12 diff --git a/resolving/default-resolver/package.json b/resolving/default-resolver/package.json index 9056ce3e55..cb700766ce 100644 --- a/resolving/default-resolver/package.json +++ b/resolving/default-resolver/package.json @@ -52,8 +52,7 @@ "@pnpm/fetching.tarball-fetcher": "workspace:*", "@pnpm/network.fetch": "workspace:*", "@pnpm/resolving.default-resolver": "workspace:*", - "@pnpm/store.cafs-types": "workspace:*", - "node-fetch": "catalog:" + "@pnpm/store.cafs-types": "workspace:*" }, "engines": { "node": ">=22.13" diff --git a/resolving/default-resolver/test/customResolver.ts b/resolving/default-resolver/test/customResolver.ts index 9f26eccdf2..dbb65e7c3e 100644 --- a/resolving/default-resolver/test/customResolver.ts +++ b/resolving/default-resolver/test/customResolver.ts @@ -2,7 +2,6 @@ import { jest } from '@jest/globals' import type { CustomResolver, WantedDependency } from '@pnpm/hooks.types' import { createResolver } from '@pnpm/resolving.default-resolver' -import { Response } from 'node-fetch' test('custom resolver intercepts matching packages', async () => { const customResolver: CustomResolver = { diff --git a/resolving/git-resolver/__mocks__/@pnpm/fetch.js b/resolving/git-resolver/__mocks__/@pnpm/fetch.js index a140553653..a4385bb377 100644 --- a/resolving/git-resolver/__mocks__/@pnpm/fetch.js +++ b/resolving/git-resolver/__mocks__/@pnpm/fetch.js @@ -1,6 +1,6 @@ module.exports = jest.createMockFromModule('@pnpm/network.fetch') // default implementation -module.exports.fetchWithAgent.mockImplementation(async (_url, _opts) => { +module.exports.fetchWithDispatcher.mockImplementation(async (_url, _opts) => { return { ok: true } }) diff --git a/resolving/git-resolver/package.json b/resolving/git-resolver/package.json index c7f06b5132..f1c70058e9 100644 --- a/resolving/git-resolver/package.json +++ b/resolving/git-resolver/package.json @@ -43,7 +43,6 @@ }, "devDependencies": { "@jest/globals": "catalog:", - "@pnpm/network.agent": "catalog:", "@pnpm/resolving.git-resolver": "workspace:*", "@types/hosted-git-info": "catalog:", "@types/is-windows": "catalog:", diff --git a/resolving/git-resolver/src/index.ts b/resolving/git-resolver/src/index.ts index 27ec96528f..820dd53a41 100644 --- a/resolving/git-resolver/src/index.ts +++ b/resolving/git-resolver/src/index.ts @@ -1,5 +1,5 @@ import { PnpmError } from '@pnpm/error' -import type { AgentOptions } from '@pnpm/network.agent' +import type { DispatcherOptions } from '@pnpm/network.fetch' import type { GitResolution, PkgResolutionId, ResolveOptions, ResolveResult, TarballResolution } from '@pnpm/resolving.resolver-base' import { gracefulGit as git } from 'graceful-git' import semver from 'semver' @@ -23,7 +23,7 @@ export type GitResolver = ( ) => Promise export function createGitResolver ( - opts: AgentOptions + opts: DispatcherOptions ): GitResolver { return async function resolveGit (wantedDependency, resolveOpts?): Promise { const parsedSpecFunc = parseBareSpecifier(wantedDependency.bareSpecifier, opts) diff --git a/resolving/git-resolver/src/parseBareSpecifier.ts b/resolving/git-resolver/src/parseBareSpecifier.ts index b9d401c633..1509f8c9d0 100644 --- a/resolving/git-resolver/src/parseBareSpecifier.ts +++ b/resolving/git-resolver/src/parseBareSpecifier.ts @@ -1,8 +1,7 @@ // cspell:ignore sshurl import urlLib, { URL } from 'node:url' -import type { AgentOptions } from '@pnpm/network.agent' -import { fetchWithAgent } from '@pnpm/network.fetch' +import { type DispatcherOptions, fetchWithDispatcher } from '@pnpm/network.fetch' import { gracefulGit as git } from 'graceful-git' import HostedGit from 'hosted-git-info' @@ -32,7 +31,7 @@ const gitProtocols = new Set([ 'ssh', ]) -export function parseBareSpecifier (bareSpecifier: string, opts: AgentOptions): null | (() => Promise) { +export function parseBareSpecifier (bareSpecifier: string, opts: DispatcherOptions): null | (() => Promise) { const hosted = HostedGit.fromUrl(bareSpecifier) if (hosted != null) { return () => fromHostedGit(hosted, opts) @@ -68,11 +67,11 @@ function urlToFetchSpec (url: URL): string { return fetchSpec } -async function fromHostedGit (hosted: any, agentOptions: AgentOptions): Promise { // eslint-disable-line +async function fromHostedGit (hosted: any, dispatcherOptions: DispatcherOptions): Promise { // eslint-disable-line let fetchSpec: string | null = null // try git/https url before fallback to ssh url const gitHttpsUrl = hosted.https({ noCommittish: true, noGitPlus: true }) - if (gitHttpsUrl && await isRepoPublic(gitHttpsUrl, agentOptions) && await accessRepository(gitHttpsUrl)) { + if (gitHttpsUrl && await isRepoPublic(gitHttpsUrl, dispatcherOptions) && await accessRepository(gitHttpsUrl)) { fetchSpec = gitHttpsUrl } else { const gitSshUrl = hosted.ssh({ noCommittish: true }) @@ -84,7 +83,7 @@ async function fromHostedGit (hosted: any, agentOptions: AgentOptions): Promise< if (!fetchSpec) { const httpsUrl: string | null = hosted.https({ noGitPlus: true, noCommittish: true }) if (httpsUrl) { - if ((hosted.auth || !await isRepoPublic(httpsUrl, agentOptions)) && await accessRepository(httpsUrl)) { + if ((hosted.auth || !await isRepoPublic(httpsUrl, dispatcherOptions)) && await accessRepository(httpsUrl)) { return { fetchSpec: httpsUrl, hosted: { @@ -103,7 +102,7 @@ async function fromHostedGit (hosted: any, agentOptions: AgentOptions): Promise< // npm instead tries git ls-remote directly which prompts user for login credentials. // HTTP HEAD on https://domain/user/repo, strip out ".git" - const response = await fetchWithAgent(httpsUrl.replace(/\.git$/, ''), { method: 'HEAD', follow: 0, retry: { retries: 0 }, agentOptions }) + const response = await fetchWithDispatcher(httpsUrl.replace(/\.git$/, ''), { method: 'HEAD', redirect: 'manual', retry: { retries: 0 }, dispatcherOptions }) if (response.ok) { fetchSpec = httpsUrl } @@ -131,9 +130,9 @@ async function fromHostedGit (hosted: any, agentOptions: AgentOptions): Promise< } } -async function isRepoPublic (httpsUrl: string, agentOptions: AgentOptions): Promise { +async function isRepoPublic (httpsUrl: string, dispatcherOptions: DispatcherOptions): Promise { try { - const response = await fetchWithAgent(httpsUrl.replace(/\.git$/, ''), { method: 'HEAD', follow: 0, retry: { retries: 0 }, agentOptions }) + const response = await fetchWithDispatcher(httpsUrl.replace(/\.git$/, ''), { method: 'HEAD', redirect: 'manual', retry: { retries: 0 }, dispatcherOptions }) return response.ok } catch { return false diff --git a/resolving/git-resolver/test/index.ts b/resolving/git-resolver/test/index.ts index 0b49313efd..0d1e157eaf 100644 --- a/resolving/git-resolver/test/index.ts +++ b/resolving/git-resolver/test/index.ts @@ -4,15 +4,15 @@ import path from 'node:path' import { jest } from '@jest/globals' import isWindows from 'is-windows' -const { fetchWithAgent: fetchWithAgentOriginal } = await import('@pnpm/network.fetch') +const { fetchWithDispatcher: fetchWithDispatcherOriginal } = await import('@pnpm/network.fetch') jest.unstable_mockModule('@pnpm/network.fetch', () => ({ - fetchWithAgent: jest.fn(), + fetchWithDispatcher: jest.fn(), })) const { gracefulGit: gitOriginal } = await import('graceful-git') jest.unstable_mockModule('graceful-git', () => ({ gracefulGit: jest.fn(), })) -const { fetchWithAgent } = await import('@pnpm/network.fetch') +const { fetchWithDispatcher } = await import('@pnpm/network.fetch') const { gracefulGit: git } = await import('graceful-git') const { createGitResolver } = await import('@pnpm/resolving.git-resolver') @@ -20,11 +20,11 @@ const resolveFromGit = createGitResolver({}) beforeEach(() => { jest.mocked(git).mockImplementation(gitOriginal) - jest.mocked(fetchWithAgent).mockImplementation(fetchWithAgentOriginal) + jest.mocked(fetchWithDispatcher).mockImplementation(fetchWithDispatcherOriginal) }) function mockFetchAsPrivate (): void { - jest.mocked(fetchWithAgent).mockImplementation(async (_url, _opts) => { + jest.mocked(fetchWithDispatcher).mockImplementation(async (_url, _opts) => { return { ok: false } as any // eslint-disable-line @typescript-eslint/no-explicit-any }) } diff --git a/resolving/npm-resolver/package.json b/resolving/npm-resolver/package.json index ee10e829d3..4465b862af 100644 --- a/resolving/npm-resolver/package.json +++ b/resolving/npm-resolver/package.json @@ -74,12 +74,12 @@ "@pnpm/network.fetch": "workspace:*", "@pnpm/resolving.npm-resolver": "workspace:*", "@pnpm/test-fixtures": "workspace:*", + "@pnpm/testing.mock-agent": "workspace:*", "@types/normalize-path": "catalog:", "@types/ramda": "catalog:", "@types/semver": "catalog:", "@types/ssri": "catalog:", "load-json-file": "catalog:", - "nock": "catalog:", "tempy": "catalog:" }, "engines": { diff --git a/resolving/npm-resolver/src/fetch.ts b/resolving/npm-resolver/src/fetch.ts index dcec0b31e6..f7244fdb9a 100644 --- a/resolving/npm-resolver/src/fetch.ts +++ b/resolving/npm-resolver/src/fetch.ts @@ -117,9 +117,17 @@ export async function fetchMetadataFromFromRegistry ( reject(op.mainError()) return } + // Extract error properties into a plain object because Error properties + // are non-enumerable and don't serialize well through the logging system + const errorInfo = { + name: error.name, + message: error.message, + code: error.code, + errno: error.errno, + } requestRetryLogger.debug({ attempt, - error, + error: errorInfo, maxRetries: fetchOpts.retry.retries!, method: 'GET', timeout, diff --git a/resolving/npm-resolver/test/clearCache.test.ts b/resolving/npm-resolver/test/clearCache.test.ts index 1d296e2580..1a550bb7a1 100644 --- a/resolving/npm-resolver/test/clearCache.test.ts +++ b/resolving/npm-resolver/test/clearCache.test.ts @@ -2,9 +2,10 @@ import { createFetchFromRegistry } from '@pnpm/network.fetch' import { createNpmResolver } from '@pnpm/resolving.npm-resolver' import type { PackageMeta } from '@pnpm/resolving.registry.types' import type { Registries } from '@pnpm/types' -import nock from 'nock' import { temporaryDirectory } from 'tempy' +import { getMockAgent, setupMockAgent, teardownMockAgent } from './utils/index.js' + const registries: Registries = { default: 'https://registry.npmjs.org/', } @@ -13,14 +14,12 @@ const fetch = createFetchFromRegistry({}) const getAuthHeader = () => undefined const createResolveFromNpm = createNpmResolver.bind(null, fetch, getAuthHeader) -beforeEach(() => { - nock.disableNetConnect() +beforeEach(async () => { + await setupMockAgent() }) -afterEach(() => { - // https://github.com/nock/nock?tab=readme-ov-file#resetting-netconnect - nock.cleanAll() - nock.enableNetConnect() +afterEach(async () => { + await teardownMockAgent() }) test('metadata is fetched again after calling clearCache()', async () => { @@ -43,8 +42,8 @@ test('metadata is fetched again after calling clearCache()', async () => { }, } - nock(registries.default) - .get(`/${name}`) + const mockPool = getMockAgent().get('https://registry.npmjs.org') + mockPool.intercept({ path: `/${name}`, method: 'GET' }) .reply(200, meta) const cacheDir = temporaryDirectory() @@ -66,19 +65,16 @@ test('metadata is fetched again after calling clearCache()', async () => { } meta['dist-tags'].latest = '3.1.0' - const scope = nock(registries.default) - .get(`/${name}`) + mockPool.intercept({ path: `/${name}`, method: 'GET' }) .reply(200, meta) // Until the cache is cleared, the resolver will still return 3.0.0. const res2 = await resolveFromNpm({ alias: name, bareSpecifier: 'latest' }, {}) expect(res2?.id).toBe(`${name}@3.0.0`) - expect(scope.isDone()).toBe(false) clearCache() // After clearing cache, the resolver should start returning 3.1.0. const res3 = await resolveFromNpm({ alias: name, bareSpecifier: 'latest' }, {}) expect(res3?.id).toBe(`${name}@3.1.0`) - expect(scope.isDone()).toBe(true) }) diff --git a/resolving/npm-resolver/test/distTagsByDate.test.ts b/resolving/npm-resolver/test/distTagsByDate.test.ts index 6f47403af3..1dfda1e30a 100644 --- a/resolving/npm-resolver/test/distTagsByDate.test.ts +++ b/resolving/npm-resolver/test/distTagsByDate.test.ts @@ -1,9 +1,10 @@ import { createFetchFromRegistry } from '@pnpm/network.fetch' import { createNpmResolver } from '@pnpm/resolving.npm-resolver' import type { Registries } from '@pnpm/types' -import nock from 'nock' import { temporaryDirectory } from 'tempy' +import { getMockAgent, setupMockAgent, teardownMockAgent } from './utils/index.js' + const registries: Registries = { default: 'https://registry.npmjs.org/', } @@ -12,13 +13,12 @@ const fetch = createFetchFromRegistry({}) const getAuthHeader = () => undefined const createResolveFromNpm = createNpmResolver.bind(null, fetch, getAuthHeader) -afterEach(() => { - nock.cleanAll() - nock.disableNetConnect() +afterEach(async () => { + await teardownMockAgent() }) -beforeEach(() => { - nock.enableNetConnect() +beforeEach(async () => { + await setupMockAgent() }) test('repopulate dist-tag to highest same-major version within the date cutoff', async () => { @@ -61,8 +61,8 @@ test('repopulate dist-tag to highest same-major version within the date cutoff', // Cutoff before 3.2.0, so latest must be remapped to 3.1.0 (same major 3) const cutoff = new Date('2020-04-01T00:00:00.000Z') - nock(registries.default) - .get(`/${name}`) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: `/${name}`, method: 'GET' }) .reply(200, meta) const cacheDir = temporaryDirectory() @@ -121,8 +121,8 @@ test('repopulate dist-tag to highest same-major version within the date cutoff. // Cutoff before 3.2.0, so latest must be remapped to 3.1.0 (same major 3) const cutoff = new Date('2020-04-01T00:00:00.000Z') - nock(registries.default) - .get(`/${name}`) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: `/${name}`, method: 'GET' }) .reply(200, meta) const cacheDir = temporaryDirectory() @@ -180,8 +180,8 @@ test('repopulate dist-tag to highest non-prerelease same-major version within th // Cutoff before 3.2.0, so latest must be remapped to 3.1.0 (same major 3) const cutoff = new Date('2020-04-01T00:00:00.000Z') - nock(registries.default) - .get(`/${name}`) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: `/${name}`, method: 'GET' }) .reply(200, meta) const cacheDir = temporaryDirectory() @@ -245,8 +245,8 @@ test('repopulate dist-tag to highest prerelease same-major version within the da // Cutoff before 3.2.0 and 3.0.0-alpha.2, so latest must be remapped to 3.0.0-alpha.1 (the highest prerelease version within the cutoff) const cutoff = new Date('2020-04-01T00:00:00.000Z') - nock(registries.default) - .get(`/${name}`) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: `/${name}`, method: 'GET' }) .reply(200, meta) const cacheDir = temporaryDirectory() @@ -281,8 +281,8 @@ test('keep dist-tag if original version is within the date cutoff', async () => const cutoff = new Date('2020-02-01T00:00:00.000Z') - nock(registries.default) - .get(`/${name}`) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: `/${name}`, method: 'GET' }) .reply(200, meta) const cacheDir = temporaryDirectory() diff --git a/resolving/npm-resolver/test/index.ts b/resolving/npm-resolver/test/index.ts index 022fcdec78..86d6b568eb 100644 --- a/resolving/npm-resolver/test/index.ts +++ b/resolving/npm-resolver/test/index.ts @@ -14,11 +14,10 @@ import { import { fixtures } from '@pnpm/test-fixtures' import type { ProjectRootDir, Registries } from '@pnpm/types' import { loadJsonFileSync } from 'load-json-file' -import nock from 'nock' import { omit } from 'ramda' import { temporaryDirectory } from 'tempy' -import { delay, retryLoadJsonFile } from './utils/index.js' +import { delay, getMockAgent, retryLoadJsonFile, setupMockAgent, teardownMockAgent } from './utils/index.js' const f = fixtures(import.meta.dirname) /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -40,18 +39,17 @@ const fetch = createFetchFromRegistry({}) const getAuthHeader = () => undefined const createResolveFromNpm = createNpmResolver.bind(null, fetch, getAuthHeader) -afterEach(() => { - nock.cleanAll() - nock.disableNetConnect() +afterEach(async () => { + await teardownMockAgent() }) -beforeEach(() => { - nock.enableNetConnect() +beforeEach(async () => { + await setupMockAgent() }) test('resolveFromNpm()', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -83,8 +81,8 @@ test('resolveFromNpm()', async () => { }) test('resolveFromNpm() strips port 80 from http tarball URLs', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, versions: { @@ -113,8 +111,8 @@ test('resolveFromNpm() strips port 80 from http tarball URLs', async () => { }) test('resolveFromNpm() does not save mutated meta to the cache', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -134,8 +132,8 @@ test('resolveFromNpm() does not save mutated meta to the cache', async () => { }) test('resolveFromNpm() should save metadata to a unique file when the package name has upper case letters', async () => { - nock(registries.default) - .get('/JSON') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/JSON', method: 'GET' }) .reply(200, jsonMeta) const cacheDir = temporaryDirectory() @@ -172,8 +170,8 @@ test('relative workspace protocol is skipped', async () => { }) test('dry run', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -203,8 +201,8 @@ test('dry run', async () => { }) test('resolve to latest when no bareSpecifier specified', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -217,8 +215,8 @@ test('resolve to latest when no bareSpecifier specified', async () => { }) test('resolve to defaultTag when no bareSpecifier specified', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -233,8 +231,8 @@ test('resolve to defaultTag when no bareSpecifier specified', async () => { }) test('resolve to biggest non-deprecated version that satisfies the range', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMetaWithDeprecated) const { resolveFromNpm } = createResolveFromNpm({ @@ -248,8 +246,8 @@ test('resolve to biggest non-deprecated version that satisfies the range', async }) test('resolve to a deprecated version if there are no non-deprecated ones that satisfy the range', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMetaWithDeprecated) const { resolveFromNpm } = createResolveFromNpm({ @@ -262,8 +260,8 @@ test('resolve to a deprecated version if there are no non-deprecated ones that s }) test('can resolve aliased dependency', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -276,8 +274,8 @@ test('can resolve aliased dependency', async () => { }) test('can resolve aliased dependency w/o version specifier', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -290,8 +288,8 @@ test('can resolve aliased dependency w/o version specifier', async () => { }) test('can resolve aliased dependency w/o version specifier to default tag', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -308,8 +306,8 @@ test('can resolve aliased dependency w/o version specifier to default tag', asyn }) test('can resolve aliased scoped dependency', async () => { - nock(registries.default) - .get('/@sindresorhus%2Fis') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/@sindresorhus%2Fis', method: 'GET' }) .reply(200, sindresorhusIsMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -322,8 +320,8 @@ test('can resolve aliased scoped dependency', async () => { }) test('can resolve aliased scoped dependency w/o version specifier', async () => { - nock(registries.default) - .get('/@sindresorhus%2Fis') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/@sindresorhus%2Fis', method: 'GET' }) .reply(200, sindresorhusIsMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -336,8 +334,8 @@ test('can resolve aliased scoped dependency w/o version specifier', async () => }) test('can resolve package with version prefixed with v', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -350,8 +348,8 @@ test('can resolve package with version prefixed with v', async () => { }) test('can resolve package version loosely', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -364,8 +362,8 @@ test('can resolve package version loosely', async () => { }) test("resolves to latest if it's inside the wanted range. Even if there are newer versions available inside the range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.0.0' }, @@ -386,8 +384,8 @@ test("resolves to latest if it's inside the wanted range. Even if there are newe }) test("resolves to latest if it's inside the preferred range. Even if there are newer versions available inside the preferred range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.0.0' }, @@ -412,8 +410,8 @@ test("resolves to latest if it's inside the preferred range. Even if there are n }) test("resolve using the wanted range, when it doesn't intersect with the preferred range. Even if the preferred range contains the latest version", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '2.0.0' }, @@ -437,8 +435,8 @@ test("resolve using the wanted range, when it doesn't intersect with the preferr }) test("use the preferred version if it's inside the wanted range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.1.0' }, @@ -463,8 +461,8 @@ test("use the preferred version if it's inside the wanted range", async () => { }) test("ignore the preferred version if it's not inside the wanted range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.1.0' }, @@ -487,8 +485,8 @@ test("ignore the preferred version if it's not inside the wanted range", async ( }) test('use the preferred range if it intersects with the wanted range', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '1.0.0' }, @@ -513,8 +511,8 @@ test('use the preferred range if it intersects with the wanted range', async () }) test('use the preferred range if it intersects with the wanted range (an array of preferred versions is passed)', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '1.0.0' }, @@ -542,8 +540,8 @@ test('use the preferred range if it intersects with the wanted range (an array o }) test("ignore the preferred range if it doesn't intersect with the wanted range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.1.0' }, @@ -566,8 +564,8 @@ test("ignore the preferred range if it doesn't intersect with the wanted range", }) test("use the preferred dist-tag if it's inside the wanted range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { @@ -593,8 +591,8 @@ test("use the preferred dist-tag if it's inside the wanted range", async () => { }) test("ignore the preferred dist-tag if it's not inside the wanted range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { @@ -620,8 +618,8 @@ test("ignore the preferred dist-tag if it's not inside the wanted range", async }) test("prefer a version that is both inside the wanted and preferred ranges. Even if it's not the latest of any of them", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { @@ -646,8 +644,8 @@ test("prefer a version that is both inside the wanted and preferred ranges. Even }) test('prefer the version that is matched by more preferred selectors', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -668,8 +666,8 @@ test('prefer the version that is matched by more preferred selectors', async () }) test('prefer the version that has bigger weight in preferred selectors', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -694,8 +692,8 @@ test('prefer the version that has bigger weight in preferred selectors', async ( }) test('versions without selector weights should have higher priority than negatively weighted versions', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -735,8 +733,8 @@ test('offline resolution fails when package meta not found in the store', async }) test('offline resolution succeeds when package meta is found in the store', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -767,8 +765,8 @@ test('offline resolution succeeds when package meta is found in the store', asyn }) test('prefer offline resolution does not fail when package meta not found in the store', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -783,8 +781,8 @@ test('prefer offline resolution does not fail when package meta not found in the }) test('when prefer offline is used, meta from store is used, where latest might be out-of-date', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.0.0' }, @@ -803,8 +801,8 @@ test('when prefer offline is used, meta from store is used, where latest might b await resolveFromNpm({ alias: 'is-positive', bareSpecifier: '1.0.0' }, {}) } - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.1.0' }, @@ -822,14 +820,13 @@ test('when prefer offline is used, meta from store is used, where latest might b expect(resolveResult!.id).toBe('is-positive@3.0.0') } - nock.cleanAll() }) test('error is thrown when package is not found in the registry', async () => { const notExistingPackage = 'foo' - nock(registries.default) - .get(`/${notExistingPackage}`) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: `/${notExistingPackage}`, method: 'GET' }) .reply(404, {}) const { resolveFromNpm } = createResolveFromNpm({ @@ -845,8 +842,7 @@ test('error is thrown when package is not found in the registry', async () => { }, { status: 404, - // statusText: 'Not Found', - statusText: '', + statusText: 'Not Found', }, notExistingPackage ) @@ -857,6 +853,15 @@ test('error is thrown when registry not responding', async () => { const notExistingPackage = 'foo' const notExistingRegistry = 'http://not-existing.pnpm.io' + // Mock a network error for the non-existing registry + const dnsError = Object.assign(new Error('getaddrinfo ENOTFOUND not-existing.pnpm.io'), { code: 'ENOTFOUND' }) + getMockAgent().get(notExistingRegistry) + .intercept({ path: `/${notExistingPackage}`, method: 'GET' }) + .replyWithError(dnsError) + getMockAgent().get(notExistingRegistry) + .intercept({ path: `/${notExistingPackage}`, method: 'GET' }) + .replyWithError(dnsError) + const { resolveFromNpm } = createResolveFromNpm({ storeDir: temporaryDirectory(), cacheDir: temporaryDirectory(), @@ -875,16 +880,13 @@ test('error is thrown when registry not responding', async () => { expect(thrown).toBeTruthy() expect(thrown.code).toBe('ERR_PNPM_META_FETCH_FAIL') expect(thrown.message).toContain(`GET ${notExistingRegistry}/${notExistingPackage}:`) - expect(thrown.message).toContain('ENOTFOUND') - expect(thrown.cause).toBeTruthy() - expect(thrown.cause.code).toBe('ENOTFOUND') }) test('extra info is shown if package has valid semver appended', async () => { const notExistingPackage = 'foo1.0.0' - nock(registries.default) - .get(`/${notExistingPackage}`) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: `/${notExistingPackage}`, method: 'GET' }) .reply(404, {}) const { resolveFromNpm } = createResolveFromNpm({ @@ -900,8 +902,7 @@ test('extra info is shown if package has valid semver appended', async () => { }, { status: 404, - // statusText: 'Not Found', - statusText: '', + statusText: 'Not Found', }, notExistingPackage ) @@ -909,8 +910,8 @@ test('extra info is shown if package has valid semver appended', async () => { }) test('error is thrown when there is no package found for the requested version', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -930,9 +931,9 @@ test('error is thrown when there is no package found for the requested version', }) test('error is thrown when package needs authorization', async () => { - nock(registries.default) - .get('/needs-auth') - .reply(403) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/needs-auth', method: 'GET' }) + .reply(403, {}) const { resolveFromNpm } = createResolveFromNpm({ storeDir: temporaryDirectory(), @@ -947,8 +948,7 @@ test('error is thrown when package needs authorization', async () => { }, { status: 403, - // statusText: 'Forbidden', - statusText: '', + statusText: 'Forbidden', }, 'needs-auth' ) @@ -956,8 +956,8 @@ test('error is thrown when package needs authorization', async () => { }) test('error is thrown when registry returns 400 Bad Request', async () => { - nock(registries.default) - .get('/bad-pkg') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/bad-pkg', method: 'GET' }) .reply(400) const { resolveFromNpm } = createResolveFromNpm({ @@ -973,7 +973,7 @@ test('error is thrown when registry returns 400 Bad Request', async () => { }, { status: 400, - statusText: '', + statusText: 'Bad Request', }, 'bad-pkg' ) @@ -981,8 +981,8 @@ test('error is thrown when registry returns 400 Bad Request', async () => { }) test('error is thrown when there is no package found for the requested range', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -1002,8 +1002,8 @@ test('error is thrown when there is no package found for the requested range', a }) test('error is thrown when there is no package found for the requested tag', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -1023,11 +1023,11 @@ test('error is thrown when there is no package found for the requested tag', asy }) test('resolveFromNpm() loads full metadata even if non-full metadata is already cached in store', async () => { - nock(registries.default) - .get('/is-positive') - .reply(200, isPositiveMeta) - .get('/is-positive') - .reply(200, isPositiveMetaFull) + const mockPool = getMockAgent().get(registries.default.replace(/\/$/, '')) + // First request returns abbreviated metadata + mockPool.intercept({ path: '/is-positive', method: 'GET' }).reply(200, isPositiveMeta) + // Second request returns full metadata + mockPool.intercept({ path: '/is-positive', method: 'GET' }).reply(200, isPositiveMetaFull) const cacheDir = temporaryDirectory() @@ -1055,8 +1055,8 @@ test('resolveFromNpm() loads full metadata even if non-full metadata is already }) test('resolve when tarball URL is requested from the registry', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1093,8 +1093,8 @@ test('resolve when tarball URL is requested from the registry', async () => { }) test('resolve when tarball URL is requested from the registry and alias is not specified', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1126,8 +1126,8 @@ test('resolve when tarball URL is requested from the registry and alias is not s }) test('resolve from local directory when it matches the latest version of the package', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1164,8 +1164,8 @@ test('resolve from local directory when it matches the latest version of the pac }) test('resolve injected dependency from local directory when it matches the latest version of the package', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1205,8 +1205,8 @@ test('resolve injected dependency from local directory when it matches the lates }) test('do not resolve from local directory when alwaysTryWorkspacePackages is false', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1312,8 +1312,8 @@ test('resolve from local directory when alwaysTryWorkspacePackages is false but }) test('use version from the registry if it is newer than the local one', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.1.0' }, @@ -1355,8 +1355,8 @@ test('use version from the registry if it is newer than the local one', async () }) test('preferWorkspacePackages: use version from the workspace even if there is newer version in the registry', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.1.0' }, @@ -1396,8 +1396,8 @@ test('preferWorkspacePackages: use version from the workspace even if there is n }) test('use local version if it is newer than the latest in the registry', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { ...isPositiveMeta, 'dist-tags': { latest: '3.1.0' }, @@ -1439,8 +1439,8 @@ test('use local version if it is newer than the latest in the registry', async ( }) test('resolve from local directory when package is not found in the registry', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(404, {}) const cacheDir = temporaryDirectory() @@ -1491,8 +1491,8 @@ test('resolve from local directory when package is not found in the registry', a }) test('resolve from local directory when package is not found in the registry and latest installed', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(404, {}) const cacheDir = temporaryDirectory() @@ -1543,8 +1543,8 @@ test('resolve from local directory when package is not found in the registry and }) test('resolve from local directory when package is not found in the registry and local prerelease available', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(404, {}) const cacheDir = temporaryDirectory() @@ -1581,8 +1581,8 @@ test('resolve from local directory when package is not found in the registry and }) test('resolve from local directory when package is not found in the registry and specific version is requested', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(404, {}) const cacheDir = temporaryDirectory() @@ -1633,8 +1633,8 @@ test('resolve from local directory when package is not found in the registry and }) test('resolve from local directory when the requested version is not found in the registry but is available locally', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1705,8 +1705,8 @@ test('workspace protocol: resolve from local directory even when it does not mat }) test('workspace protocol: resolve from local package that has a pre-release version', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1743,8 +1743,8 @@ test('workspace protocol: resolve from local package that has a pre-release vers }) test("workspace protocol: don't resolve from local package that has a pre-release version that don't satisfy the range", async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1868,8 +1868,8 @@ test('throws error when package name has "/" but not starts with @scope', async }) test('resolveFromNpm() should always return the name of the package that is specified in the root of the meta', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveBrokenMeta) const cacheDir = temporaryDirectory() @@ -1900,22 +1900,22 @@ test('resolveFromNpm() should always return the name of the package that is spec }) test('request to metadata is retried if the received JSON is broken', async () => { - const registries: Registries = { + const localRegistries: Registries = { default: 'https://registry1.com/', } - nock(registries.default) - .get('/is-positive') + const mockPool = getMockAgent().get(localRegistries.default.replace(/\/$/, '')) + // First request returns broken JSON + mockPool.intercept({ path: '/is-positive', method: 'GET' }) .reply(200, '{') - - nock(registries.default) - .get('/is-positive') + // Second request (retry) returns valid meta + mockPool.intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() const { resolveFromNpm } = createResolveFromNpm({ retry: { retries: 1 }, storeDir: temporaryDirectory(), - registries, + registries: localRegistries, cacheDir, }) const resolveResult = await resolveFromNpm({ alias: 'is-positive', bareSpecifier: '1.0.0' }, {})! @@ -1924,9 +1924,9 @@ test('request to metadata is retried if the received JSON is broken', async () = }) test('request to a package with unpublished versions', async () => { - nock(registries.default) - .get('/code-snippet') - .reply(200, loadJsonFileSync(f.find('unpublished.json'))) + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/code-snippet', method: 'GET' }) + .reply(200, loadJsonFileSync(f.find('unpublished.json')) as object) const cacheDir = temporaryDirectory() const { resolveFromNpm } = createResolveFromNpm({ @@ -1942,8 +1942,8 @@ test('request to a package with unpublished versions', async () => { }) test('request to a package with no versions', async () => { - nock(registries.default) - .get('/code-snippet') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/code-snippet', method: 'GET' }) .reply(200, { name: 'code-snippet' }) const cacheDir = temporaryDirectory() @@ -1961,8 +1961,8 @@ test('request to a package with no versions', async () => { test('request to a package with no dist-tags', async () => { const isPositiveMeta = omit(['dist-tags'], loadJsonFileSync(f.find('is-positive.json'))) // eslint-disable-line - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -1987,8 +1987,8 @@ test('request to a package with no dist-tags', async () => { }) test('resolveFromNpm() does not fail if the meta file contains no integrity information', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, brokenIntegrity) const cacheDir = temporaryDirectory() @@ -2012,8 +2012,8 @@ test('resolveFromNpm() does not fail if the meta file contains no integrity info }) test('resolveFromNpm() fails if the meta file contains invalid shasum', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, brokenIntegrity) const cacheDir = temporaryDirectory() @@ -2028,8 +2028,8 @@ test('resolveFromNpm() fails if the meta file contains invalid shasum', async () }) test('resolveFromNpm() should normalize the registry', async () => { - nock('https://reg.com/owner') - .get('/is-positive') + getMockAgent().get('https://reg.com') + .intercept({ path: '/owner/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -2055,8 +2055,8 @@ test('resolveFromNpm() should normalize the registry', async () => { }) test('pick lowest version by * when there are only prerelease versions', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, { versions: { '1.0.0-alpha.1': { @@ -2089,8 +2089,8 @@ test('pick lowest version by * when there are only prerelease versions', async ( }) test('throws when workspace package version does not match and package is not found in the registry', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(404, {}) const cacheDir = temporaryDirectory() @@ -2120,8 +2120,8 @@ test('throws when workspace package version does not match and package is not fo }) test('throws NoMatchingVersionError when workspace package version does not match and registry has no matching version', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() @@ -2151,8 +2151,8 @@ test('throws NoMatchingVersionError when workspace package version does not matc }) test('resolve from registry when workspace package version does not match the requested version', async () => { - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, isPositiveMeta) const cacheDir = temporaryDirectory() diff --git a/resolving/npm-resolver/test/optionalDependencies.test.ts b/resolving/npm-resolver/test/optionalDependencies.test.ts index 88eebb359a..dffcae6c55 100644 --- a/resolving/npm-resolver/test/optionalDependencies.test.ts +++ b/resolving/npm-resolver/test/optionalDependencies.test.ts @@ -2,9 +2,10 @@ import { createFetchFromRegistry } from '@pnpm/network.fetch' import { createNpmResolver } from '@pnpm/resolving.npm-resolver' import type { Registries } from '@pnpm/types' -import nock from 'nock' import { temporaryDirectory } from 'tempy' +import { getMockAgent, setupMockAgent, teardownMockAgent } from './utils/index.js' + const registries = { default: 'https://registry.npmjs.org/', } satisfies Registries @@ -13,13 +14,12 @@ const fetch = createFetchFromRegistry({}) const getAuthHeader = () => undefined const createResolveFromNpm = createNpmResolver.bind(null, fetch, getAuthHeader) -afterEach(() => { - nock.cleanAll() - nock.disableNetConnect() +afterEach(async () => { + await teardownMockAgent() }) -beforeEach(() => { - nock.enableNetConnect() +beforeEach(async () => { + await setupMockAgent() }) describe('optional dependencies', () => { @@ -44,10 +44,9 @@ describe('optional dependencies', () => { }, } - // Verify that full metadata is requested (no abbreviated Accept header) - const scope = nock(registries.default) - .get('/platform-pkg') - .matchHeader('accept', (value) => !value.includes('application/vnd.npm.install-v1+json')) + // Mock the full metadata request for optional dependency + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/platform-pkg', method: 'GET' }) .reply(200, packageMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -68,7 +67,6 @@ describe('optional dependencies', () => { expect(result!.manifest!.libc).toEqual(['glibc']) expect(result!.manifest!.os).toEqual(['linux']) expect(result!.manifest!.cpu).toEqual(['x64']) - expect(scope.isDone()).toBe(true) }) test('abbreviated and full metadata are cached separately', async () => { @@ -108,17 +106,19 @@ describe('optional dependencies', () => { }, } - // First request: abbreviated metadata for regular dependency - const abbreviatedScope = nock(registries.default) - .get('/cache-test') - .matchHeader('accept', /application\/vnd\.npm\.install-v1\+json/) - .reply(200, abbreviatedMeta) - - // Second request: full metadata for optional dependency - const fullScope = nock(registries.default) - .get('/cache-test') - .matchHeader('accept', (value) => !value.includes('application/vnd.npm.install-v1+json')) - .reply(200, fullMeta) + const mockPool = getMockAgent().get(registries.default.replace(/\/$/, '')) + // First request: abbreviated metadata for regular dependency (accept header prefers abbreviated) + mockPool.intercept({ + path: '/cache-test', + method: 'GET', + headers: { accept: /application\/vnd\.npm\.install-v1\+json/ }, + }).reply(200, abbreviatedMeta) + // Second request: full metadata for optional dependency (accept header prefers full JSON) + mockPool.intercept({ + path: '/cache-test', + method: 'GET', + headers: { accept: /application\/json/ }, + }).reply(200, fullMeta) const cacheDir = temporaryDirectory() @@ -141,8 +141,5 @@ describe('optional dependencies', () => { {} ) expect(optionalResult!.manifest!.scripts).toEqual({ test: 'jest', build: 'tsc' }) - - expect(abbreviatedScope.isDone()).toBe(true) - expect(fullScope.isDone()).toBe(true) }) }) diff --git a/resolving/npm-resolver/test/publishedBy.test.ts b/resolving/npm-resolver/test/publishedBy.test.ts index 692a828c7a..aa70867bed 100644 --- a/resolving/npm-resolver/test/publishedBy.test.ts +++ b/resolving/npm-resolver/test/publishedBy.test.ts @@ -7,9 +7,10 @@ import { createNpmResolver } from '@pnpm/resolving.npm-resolver' import { fixtures } from '@pnpm/test-fixtures' import type { Registries } from '@pnpm/types' import { loadJsonFileSync } from 'load-json-file' -import nock from 'nock' import { temporaryDirectory } from 'tempy' +import { getMockAgent, setupMockAgent, teardownMockAgent } from './utils/index.js' + const f = fixtures(import.meta.dirname) const registries: Registries = { @@ -25,18 +26,17 @@ const fetch = createFetchFromRegistry({}) const getAuthHeader = () => undefined const createResolveFromNpm = createNpmResolver.bind(null, fetch, getAuthHeader) -afterEach(() => { - nock.cleanAll() - nock.disableNetConnect() +afterEach(async () => { + await teardownMockAgent() }) -beforeEach(() => { - nock.enableNetConnect() +beforeEach(async () => { + await setupMockAgent() }) test('fall back to a newer version if there is no version published by the given date', async () => { - nock(registries.default) - .get('/bad-dates') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/bad-dates', method: 'GET' }) .reply(200, badDatesMeta) const cacheDir = temporaryDirectory() @@ -66,8 +66,8 @@ test('request metadata when the one in cache does not have a version satisfying fs.mkdirSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org`), { recursive: true }) fs.writeFileSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org/bad-dates.json`), JSON.stringify(cachedMeta), 'utf8') - nock(registries.default) - .get('/bad-dates') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/bad-dates', method: 'GET' }) .reply(200, badDatesMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -106,8 +106,8 @@ test('do not pick version that does not satisfy the date requirement even if it fs.mkdirSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org`), { recursive: true }) fs.writeFileSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org/foo.json`), JSON.stringify(fooMeta), 'utf8') - nock(registries.default) - .get('/foo') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/foo', method: 'GET' }) .reply(200, fooMeta) const { resolveFromNpm } = createResolveFromNpm({ @@ -130,8 +130,8 @@ test('should skip time field validation for excluded packages', async () => { fs.mkdirSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org`), { recursive: true }) fs.writeFileSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org/is-positive.json`), JSON.stringify(metaWithoutTime), 'utf8') - nock(registries.default) - .get('/is-positive') + getMockAgent().get(registries.default.replace(/\/$/, '')) + .intercept({ path: '/is-positive', method: 'GET' }) .reply(200, metaWithoutTime) const { resolveFromNpm } = createResolveFromNpm({ diff --git a/resolving/npm-resolver/test/resolveJsr.test.ts b/resolving/npm-resolver/test/resolveJsr.test.ts index b8141c283d..5e75ac8f52 100644 --- a/resolving/npm-resolver/test/resolveJsr.test.ts +++ b/resolving/npm-resolver/test/resolveJsr.test.ts @@ -6,10 +6,9 @@ import { createNpmResolver } from '@pnpm/resolving.npm-resolver' import { fixtures } from '@pnpm/test-fixtures' import type { Registries } from '@pnpm/types' import { loadJsonFileSync } from 'load-json-file' -import nock from 'nock' import { temporaryDirectory } from 'tempy' -import { retryLoadJsonFile } from './utils/index.js' +import { getMockAgent, retryLoadJsonFile, setupMockAgent, teardownMockAgent } from './utils/index.js' const f = fixtures(import.meta.dirname) /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -26,27 +25,22 @@ const fetch = createFetchFromRegistry({}) const getAuthHeader = () => undefined const createResolveFromNpm = createNpmResolver.bind(null, fetch, getAuthHeader) -afterEach(() => { - nock.cleanAll() - nock.disableNetConnect() +afterEach(async () => { + await teardownMockAgent() }) -beforeEach(() => { - nock.enableNetConnect() +beforeEach(async () => { + await setupMockAgent() }) test('resolveFromJsr() on jsr', async () => { const slash = '%2F' - nock(registries.default) - .get(`/@jsr${slash}rus__greet`) - .reply(404) - .get(`/@jsr${slash}luca__cases`) - .reply(404) - nock(registries['@jsr']) - .get(`/@jsr${slash}rus__greet`) - .reply(200, jsrRusGreetMeta) - .get(`/@jsr${slash}luca__cases`) - .reply(200, jsrLucaCasesMeta) + const defaultPool = getMockAgent().get(registries.default.replace(/\/$/, '')) + defaultPool.intercept({ path: `/@jsr${slash}rus__greet`, method: 'GET' }).reply(404, {}) + defaultPool.intercept({ path: `/@jsr${slash}luca__cases`, method: 'GET' }).reply(404, {}) + const jsrPool = getMockAgent().get(registries['@jsr'].replace(/\/$/, '')) + jsrPool.intercept({ path: `/@jsr${slash}rus__greet`, method: 'GET' }).reply(200, jsrRusGreetMeta) + jsrPool.intercept({ path: `/@jsr${slash}luca__cases`, method: 'GET' }).reply(200, jsrLucaCasesMeta) const cacheDir = temporaryDirectory() const { resolveFromJsr } = createResolveFromNpm({ @@ -83,16 +77,12 @@ test('resolveFromJsr() on jsr', async () => { test('resolveFromJsr() on jsr with alias renaming', async () => { const slash = '%2F' - nock(registries.default) - .get(`/@jsr${slash}rus__greet`) - .reply(404) - .get(`/@jsr${slash}luca__cases`) - .reply(404) - nock(registries['@jsr']) - .get(`/@jsr${slash}rus__greet`) - .reply(200, jsrRusGreetMeta) - .get(`/@jsr${slash}luca__cases`) - .reply(200, jsrLucaCasesMeta) + const defaultPool = getMockAgent().get(registries.default.replace(/\/$/, '')) + defaultPool.intercept({ path: `/@jsr${slash}rus__greet`, method: 'GET' }).reply(404, {}) + defaultPool.intercept({ path: `/@jsr${slash}luca__cases`, method: 'GET' }).reply(404, {}) + const jsrPool = getMockAgent().get(registries['@jsr'].replace(/\/$/, '')) + jsrPool.intercept({ path: `/@jsr${slash}rus__greet`, method: 'GET' }).reply(200, jsrRusGreetMeta) + jsrPool.intercept({ path: `/@jsr${slash}luca__cases`, method: 'GET' }).reply(200, jsrLucaCasesMeta) const cacheDir = temporaryDirectory() const { resolveFromJsr } = createResolveFromNpm({ diff --git a/resolving/npm-resolver/test/utils/index.ts b/resolving/npm-resolver/test/utils/index.ts index eed72720b3..1e18834756 100644 --- a/resolving/npm-resolver/test/utils/index.ts +++ b/resolving/npm-resolver/test/utils/index.ts @@ -1,5 +1,7 @@ import fs from 'node:fs' +export { getMockAgent, setupMockAgent, teardownMockAgent } from '@pnpm/testing.mock-agent' + export async function retryLoadJsonFile (filePath: string): Promise { let retry = 0 /* eslint-disable no-await-in-loop */ diff --git a/resolving/npm-resolver/tsconfig.json b/resolving/npm-resolver/tsconfig.json index 0de5f3eb0a..aea50e5474 100644 --- a/resolving/npm-resolver/tsconfig.json +++ b/resolving/npm-resolver/tsconfig.json @@ -51,6 +51,9 @@ { "path": "../../store/index" }, + { + "path": "../../testing/mock-agent" + }, { "path": "../../worker" }, diff --git a/testing/mock-agent/package.json b/testing/mock-agent/package.json new file mode 100644 index 0000000000..d57c87db59 --- /dev/null +++ b/testing/mock-agent/package.json @@ -0,0 +1,46 @@ +{ + "name": "@pnpm/testing.mock-agent", + "version": "0.0.0", + "private": true, + "description": "Shared undici MockAgent helpers for pnpm tests", + "keywords": [ + "pnpm", + "pnpm11", + "testing" + ], + "license": "MIT", + "funding": "https://opencollective.com/pnpm", + "repository": "https://github.com/pnpm/pnpm/tree/main/testing/mock-agent", + "homepage": "https://github.com/pnpm/pnpm/tree/main/testing/mock-agent#readme", + "bugs": { + "url": "https://github.com/pnpm/pnpm/issues" + }, + "type": "module", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "exports": { + ".": "./lib/index.js" + }, + "files": [ + "lib", + "!*.map" + ], + "scripts": { + "prepublishOnly": "pn compile", + "lint": "eslint \"src/**/*.ts\"", + "test": "pn compile", + "compile": "tsgo --build && pn lint --fix" + }, + "dependencies": { + "undici": "catalog:" + }, + "peerDependencies": { + "@pnpm/network.fetch": "workspace:*" + }, + "engines": { + "node": ">=22.13" + }, + "devDependencies": { + "@pnpm/testing.mock-agent": "workspace:*" + } +} diff --git a/testing/mock-agent/src/index.ts b/testing/mock-agent/src/index.ts new file mode 100644 index 0000000000..ba85837b6b --- /dev/null +++ b/testing/mock-agent/src/index.ts @@ -0,0 +1,35 @@ +import { type Dispatcher, getGlobalDispatcher, MockAgent, setGlobalDispatcher } from 'undici' + +let originalDispatcher: Dispatcher | null = null +let currentMockAgent: MockAgent | null = null + +export async function setupMockAgent (): Promise { + if (!originalDispatcher) { + originalDispatcher = getGlobalDispatcher() + } + // Dynamic import to avoid circular tsconfig reference with @pnpm/network.fetch + const { clearDispatcherCache } = await import('@pnpm/network.fetch') + clearDispatcherCache() + currentMockAgent = new MockAgent() + currentMockAgent.disableNetConnect() + setGlobalDispatcher(currentMockAgent) + return currentMockAgent +} + +export async function teardownMockAgent (): Promise { + if (currentMockAgent) { + await currentMockAgent.close() + currentMockAgent = null + } + if (originalDispatcher) { + setGlobalDispatcher(originalDispatcher) + originalDispatcher = null + } +} + +export function getMockAgent (): MockAgent { + if (!currentMockAgent) { + throw new Error('MockAgent not initialized. Call setupMockAgent() first.') + } + return currentMockAgent +} diff --git a/testing/mock-agent/tsconfig.json b/testing/mock-agent/tsconfig.json new file mode 100644 index 0000000000..9eb563dff9 --- /dev/null +++ b/testing/mock-agent/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "@pnpm/tsconfig", + "compilerOptions": { + "outDir": "lib", + "rootDir": "src" + }, + "include": [ + "src/**/*.ts", + "../../__typings__/**/*.d.ts" + ], + "references": [ + { + "path": "../../network/fetch" + } + ] +} diff --git a/testing/mock-agent/tsconfig.lint.json b/testing/mock-agent/tsconfig.lint.json new file mode 100644 index 0000000000..1bbe711971 --- /dev/null +++ b/testing/mock-agent/tsconfig.lint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "src/**/*.ts", + "test/**/*.ts", + "../../__typings__/**/*.d.ts" + ] +}