diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 73692d79..ed3f43eb 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,17 +1,18 @@ { "packages/commitlint-config": "2.0.0", - "packages/prettier-config": "1.0.0", + "packages/prettier-config": "4.1.0", "packages/eslint-config": "8.0.0", "packages/eslint-plugin": "0.1.0", "packages/typescript-config": "2.0.0", "packages/error-express-handler": "4.0.0", - "packages/express-access-log-middleware": "4.0.0", - "packages/js-logger": "4.0.0", + "packages/express-access-log-middleware": "4.1.0", + "packages/js-logger": "5.0.0", "packages/read-pkg": "2.0.0", - "packages/openapi-express-viewer": "5.0.0", + "packages/openapi-express-viewer": "4.1.0", "packages/openapi-helpers": "5.1.0", "packages/semantic-conventions": "1.0.0", "packages/tracing": "1.0.0", "packages/tracing-utils": "1.0.0", - "packages/prometheus": "1.0.0" + "packages/prometheus": "1.0.0", + "packages/vitest-utils": "0.1.0" } diff --git a/.vscode/project.code-workspace b/.vscode/project.code-workspace index edbf5911..df374cfb 100644 --- a/.vscode/project.code-workspace +++ b/.vscode/project.code-workspace @@ -68,5 +68,9 @@ "name": "prometheus", "path": "../packages/prometheus", }, + { + "name": "vitest-utils", + "path": "../packages/vitest-utils", + }, ], } diff --git a/knip.config.ts b/knip.config.ts index eb37bdc5..c9acda7f 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -56,6 +56,10 @@ const config: KnipConfig = { ignoreDependencies: ['@protobuf-ts/plugin'], ignore: ['tests/generated/**'], }, + 'packages/vitest-utils': { + ...basePackageConfig, + ignoreDependencies: ['jest-extended', 'jest-openapi'], + }, }, tags: ['-lintignore'], }; diff --git a/packages/express-access-log-middleware/CHANGELOG.md b/packages/express-access-log-middleware/CHANGELOG.md index 36062314..0e65ff16 100644 --- a/packages/express-access-log-middleware/CHANGELOG.md +++ b/packages/express-access-log-middleware/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [4.1.0](https://github.com/MapColonies/infra-packages/compare/express-access-log-middleware-v4.0.0...express-access-log-middleware-v4.1.0) (2026-03-08) + +### 🐛 Bug Fixes + +* **express-access-log-middleware:** update attribute name from ATTR_URL_FULL to ATTR_URL_PATH ([#152](https://github.com/MapColonies/infra-packages/issues/152)) ([3905090](https://github.com/MapColonies/infra-packages/commit/39050901456ad0cff89256de41e601f7856c23dc)) + ## [4.0.0](https://github.com/MapColonies/infra-packages/compare/express-access-log-middleware-v3.0.1...express-access-log-middleware-v4.0.0) (2026-01-18) diff --git a/packages/express-access-log-middleware/package.json b/packages/express-access-log-middleware/package.json index 2fddc0aa..422de40f 100644 --- a/packages/express-access-log-middleware/package.json +++ b/packages/express-access-log-middleware/package.json @@ -1,6 +1,6 @@ { "name": "@map-colonies/express-access-log-middleware", - "version": "4.0.0", + "version": "4.1.0", "description": "An access and error logger for express based on pino-http", "main": "./dist/index.js", "type": "commonjs", diff --git a/packages/js-logger/CHANGELOG.md b/packages/js-logger/CHANGELOG.md index 864b448b..3d4c7418 100644 --- a/packages/js-logger/CHANGELOG.md +++ b/packages/js-logger/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## [5.0.0](https://github.com/MapColonies/infra-packages/compare/js-logger-v4.1.0...js-logger-v5.0.0) (2026-03-08) + + +### ⚠ BREAKING CHANGES + +* **js-logger:** added ability to define k8s resource attributes ([#161](https://github.com/MapColonies/infra-packages/issues/161)) + +### 🎉 Features + +* **js-logger:** added ability to define k8s resource attributes ([#161](https://github.com/MapColonies/infra-packages/issues/161)) ([f48aaa4](https://github.com/MapColonies/infra-packages/commit/f48aaa4522b7987675308a1b3a1f5b692979534d)) + +## [4.1.0](https://github.com/MapColonies/infra-packages/compare/js-logger-v4.0.0...js-logger-v4.1.0) (2026-03-08) + + +### 🐛 Bug Fixes + +* **js-logger:** removed formatter and added attributes so log parse correctly ([#151](https://github.com/MapColonies/infra-packages/issues/151)) ([482f709](https://github.com/MapColonies/infra-packages/commit/482f709522d604ddbc695e965405a91be05d3bbc)) + + +### 🔧 Miscellaneous Chores + +* **js-logger:** release 4.1.0 ([2a8a574](https://github.com/MapColonies/infra-packages/commit/2a8a574992a1cbf7f2b76f990ebfe436afb73ff5)) + ## [4.0.0](https://github.com/MapColonies/infra-packages/compare/js-logger-v3.0.2...js-logger-v4.0.0) (2026-01-18) diff --git a/packages/js-logger/etc/js-logger.api.md b/packages/js-logger/etc/js-logger.api.md index 65d20c17..43308b35 100644 --- a/packages/js-logger/etc/js-logger.api.md +++ b/packages/js-logger/etc/js-logger.api.md @@ -8,7 +8,7 @@ import { Logger } from 'pino'; import { LoggerOptions as LoggerOptions_2 } from 'pino'; // @public -export function jsLogger(options?: LoggerOptions, destination?: string | number): Logger; +export function jsLogger(options?: LoggerOptions, destination?: string | number): Promise; export { Logger } diff --git a/packages/js-logger/package.json b/packages/js-logger/package.json index 095d3fb9..3ec0fe1d 100644 --- a/packages/js-logger/package.json +++ b/packages/js-logger/package.json @@ -1,6 +1,6 @@ { "name": "@map-colonies/js-logger", - "version": "4.0.0", + "version": "5.0.0", "description": "Javascript and typescript logger for MapColonies based on pino", "main": "./dist/index.js", "type": "commonjs", @@ -51,6 +51,9 @@ "pino": "^10.1.0", "pino-caller": "^4.0.0", "pino-opentelemetry-transport": "^2.0.0", - "pino-pretty": "^13.1.2" + "pino-pretty": "^13.1.2", + "@opentelemetry/resources": "^2.6.0", + "@opentelemetry/resource-detector-container": "^0.8.4", + "@opentelemetry/semantic-conventions": "^1.40.0" } } diff --git a/packages/js-logger/src/index.ts b/packages/js-logger/src/index.ts index 91a6383a..771cc200 100644 --- a/packages/js-logger/src/index.ts +++ b/packages/js-logger/src/index.ts @@ -6,6 +6,10 @@ import { transport as pinoTransport, type DestinationStream, } from 'pino'; +import { detectResources } from '@opentelemetry/resources'; +import { containerDetector } from '@opentelemetry/resource-detector-container'; +import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; +import { ATTR_K8S_POD_UID } from '@opentelemetry/semantic-conventions/incubating'; import { pinoCaller } from 'pino-caller'; import type { Options } from 'pino-opentelemetry-transport'; import { readPackageJsonSync } from '@map-colonies/read-pkg'; @@ -84,7 +88,7 @@ const baseOptions: PinoOptions = { * @returns The configured logger instance. * @public */ -export function jsLogger(options?: LoggerOptions, destination: string | number = 1): Logger { +export async function jsLogger(options?: LoggerOptions, destination: string | number = 1): Promise { let transport: TransportSingleOptions = { target: 'pino/file', options: { destination } }; /* istanbul ignore next */ @@ -96,10 +100,20 @@ export function jsLogger(options?: LoggerOptions, destination: string | number = if (options?.opentelemetryOptions?.enabled === true) { const pkg = readPackageJsonSync(); + + const detectedResources = detectResources({ detectors: [containerDetector] }); + await detectedResources.waitForAsyncAttributes?.(); + const otelOptions: Options = { loggerName: 'js-logger', serviceVersion: PACKAGE_VERSION, - resourceAttributes: { 'service.name': pkg.name, 'service.version': pkg.version, ...options.opentelemetryOptions.resourceAttributes }, + resourceAttributes: { + ...detectedResources.attributes, + [ATTR_SERVICE_NAME]: pkg.name, + [ATTR_SERVICE_VERSION]: pkg.version, + [ATTR_K8S_POD_UID]: process.env.K8S_POD_UID, + ...options.opentelemetryOptions.resourceAttributes, + }, logRecordProcessorOptions: [ { recordProcessorType: 'simple', diff --git a/packages/js-logger/tests/index.spec.ts b/packages/js-logger/tests/index.spec.ts index 398bcacf..177f5d61 100644 --- a/packages/js-logger/tests/index.spec.ts +++ b/packages/js-logger/tests/index.spec.ts @@ -4,15 +4,15 @@ import { jsLogger } from '../src'; import { waitForFileCreation } from './helpers'; describe('jsLogger', function () { - it('should initialize the logger without errors', function () { - const logger = jsLogger(); + it('should initialize the logger without errors', async function () { + const logger = await jsLogger(); expect(logger).toBeDefined(); expect(() => logger.info('test')).not.toThrow(); }); it('should support other destinations', async function () { - const logger = jsLogger({}, 'avi.log'); + const logger = await jsLogger({}, 'avi.log'); logger.info('avi'); @@ -24,7 +24,7 @@ describe('jsLogger', function () { }); it('should support base option', async function () { - const logger = jsLogger({ base: { key: 'value' } }, 'avi-base.log'); + const logger = await jsLogger({ base: { key: 'value' } }, 'avi-base.log'); logger.info('avi'); @@ -38,7 +38,7 @@ describe('jsLogger', function () { }); it('should include caller information if enabled', async function () { - const logger = jsLogger({ pinoCaller: true }, 'avi-caller.log'); + const logger = await jsLogger({ pinoCaller: true }, 'avi-caller.log'); logger.info('avi'); @@ -51,8 +51,8 @@ describe('jsLogger', function () { expect(logLine).toHaveProperty('caller'); }); - it('should still output logs when opentelemetry is enabled', function () { - const logger = jsLogger({ opentelemetryOptions: { enabled: true } }); + it('should still output logs when opentelemetry is enabled', async function () { + const logger = await jsLogger({ opentelemetryOptions: { enabled: true } }); expect(logger).toBeDefined(); expect(() => logger.info('test otel')).not.toThrow(); diff --git a/packages/js-logger/turbo.json b/packages/js-logger/turbo.json new file mode 100644 index 00000000..2e15a234 --- /dev/null +++ b/packages/js-logger/turbo.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://turborepo.com/schema.json", + "extends": ["//"], + "tasks": { + "build": { + "cache": false, + "outputs": ["$TURBO_EXTENDS$", "src/**"] + } + } +} diff --git a/packages/prettier-config/CHANGELOG.md b/packages/prettier-config/CHANGELOG.md index 2aa85e6b..d6bed314 100644 --- a/packages/prettier-config/CHANGELOG.md +++ b/packages/prettier-config/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [4.1.0](https://github.com/MapColonies/infra-packages/compare/prettier-config-v1.0.0...prettier-config-v4.1.0) (2026-04-14) + + +### 🔧 Miscellaneous Chores + +* **js-logger:** release 4.1.0 ([2a8a574](https://github.com/MapColonies/infra-packages/commit/2a8a574992a1cbf7f2b76f990ebfe436afb73ff5)) + ## [1.0.0](https://github.com/MapColonies/infra-packages/compare/prettier-config-v0.0.1...prettier-config-v1.0.0) (2026-01-18) diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index 4750c877..3de9aa7c 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -1,6 +1,6 @@ { "name": "@map-colonies/prettier-config", - "version": "1.0.0", + "version": "4.1.0", "description": "Common prettier configuration for the MapColonies project", "license": "MIT", "repository": "github:MapColonies/infra-packages", diff --git a/packages/vitest-utils/README.md b/packages/vitest-utils/README.md new file mode 100644 index 00000000..d909bc1a --- /dev/null +++ b/packages/vitest-utils/README.md @@ -0,0 +1,111 @@ +# vitest-utils + +Shared utilities for the Vitest testing framework used across MapColonies packages. + +## Install + +```sh +npm install --save-dev @map-colonies/vitest-utils +``` + +Peer dependencies (`vitest`, `jest-openapi`, `jest-extended`) are optional — install only what you use. + +## API documentation + +Check the autogenerated documentation [here](https://mapcolonies.github.io/infra-packages/modules/_map-colonies_vitest-utils.html). + +## Usage + +### `reporters` + +A pre-configured reporters array for `vitest.config.ts`. Includes `default` and `html` reporters, and automatically adds `github-actions` when running in CI. + +```typescript +// vitest.config.ts +import { defineConfig } from 'vitest/config'; +import { reporters } from '@map-colonies/vitest-utils'; + +export default defineConfig({ + test: { + reporters, + }, +}); +``` + +### `getPathAlias` + +Converts `compilerOptions.paths` from a `tsconfig.json` into a Vitest `resolve.alias` map, keeping path aliases in sync between TypeScript and test runs. + +```typescript +// vitest.config.ts +import { defineConfig } from 'vitest/config'; +import { getPathAlias } from '@map-colonies/vitest-utils'; +import tsconfigJson from './tsconfig.json'; + +export default defineConfig({ + resolve: { + alias: getPathAlias(tsconfigJson, __dirname), + }, +}); +``` + +### `setupOpenapi` + +Patches Vitest's `expect` into the global scope so that `jest-openapi` matchers (e.g. `toSatisfyApiSpec`) work inside Vitest tests. Resets the global after setup to avoid conflicts. + +**Recommended**: call it from a Vitest setup file so it runs once for the entire suite. + +```typescript +// tests/setup.ts +import { setupOpenapi } from '@map-colonies/vitest-utils'; + +setupOpenapi('/absolute/path/to/openapi.yaml'); +``` + +```typescript +// vitest.config.ts +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + setupFiles: ['./tests/setup.ts'], + }, +}); +``` + +Then use the matcher in your tests: + +```typescript +it('should satisfy the OpenAPI spec', async function () { + const response = await supertest(app).get('/resource'); + expect(response).toSatisfyApiSpec(); +}); +``` + +Alternatively, call it inside a `beforeAll` when you need per-suite control: + +```typescript +beforeAll(function () { + setupOpenapi('/absolute/path/to/openapi.yaml'); +}); +``` + +### `vitest-extended` (side-effect import) + +Registers all [jest-extended](https://jest-extended.jestcommunity.dev/) matchers into Vitest's `expect`. Import it once from a setup file. + +```typescript +// tests/setup.ts +import '@map-colonies/vitest-utils/extended'; +``` + +```typescript +// vitest.config.ts +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + setupFiles: ['./tests/setup.ts'], + }, +}); +``` diff --git a/packages/vitest-utils/api-extractor.json b/packages/vitest-utils/api-extractor.json new file mode 100644 index 00000000..bdf6b165 --- /dev/null +++ b/packages/vitest-utils/api-extractor.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "extends": "../../api-extractor.json" +} diff --git a/packages/vitest-utils/eslint.config.mjs b/packages/vitest-utils/eslint.config.mjs new file mode 100644 index 00000000..d65b7eef --- /dev/null +++ b/packages/vitest-utils/eslint.config.mjs @@ -0,0 +1,4 @@ +import baseConfig from '@map-colonies/eslint-config/ts-base'; +import { defineConfig } from 'eslint/config'; + +export default defineConfig(baseConfig, { ignores: ['vitest.config.ts'] }); diff --git a/packages/vitest-utils/etc/vitest-utils.api.md b/packages/vitest-utils/etc/vitest-utils.api.md new file mode 100644 index 00000000..02cfed8f --- /dev/null +++ b/packages/vitest-utils/etc/vitest-utils.api.md @@ -0,0 +1,24 @@ +## API Report File for "@map-colonies/vitest-utils" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import type { ViteUserConfig } from 'vitest/config'; + +// @public +export function getPathAlias(tsconfig: { + compilerOptions: { + paths: Record; + }; +}, rootDir: string): Record; + +// @public +export const reporters: Exclude['reporters']; + +// @public +export function setupOpenapi(path: string): void; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/packages/vitest-utils/package.json b/packages/vitest-utils/package.json new file mode 100644 index 00000000..9ac7c61b --- /dev/null +++ b/packages/vitest-utils/package.json @@ -0,0 +1,67 @@ +{ + "name": "@map-colonies/vitest-utils", + "version": "0.1.0", + "description": "Utilities for Vitest testing framework", + "main": "./dist/index.js", + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js" + }, + "./extended": { + "import": "./dist/vitest-extended.js" + } + }, + "type": "module", + "scripts": { + "lint": "eslint .", + "lint:fix": "eslint --fix .", + "test": "vitest run", + "prebuild": "pnpm run clean", + "build": "tsc --project tsconfig.build.json", + "clean": "rimraf dist", + "prepack": "turbo run build", + "check-dist": "publint && attw --pack --profile esm-only .", + "knip": "knip --directory ../.. --workspace packages/vitest-utils", + "api": "api-extractor run --local --verbose", + "api:check": "api-extractor run --verbose" + }, + "repository": "github:MapColonies/infra-packages", + "files": [ + "dist/**/*" + ], + "publishConfig": { + "access": "public" + }, + "engines": { + "node": ">=24" + }, + "homepage": "https://github.com/MapColonies/vitest-utils#readme", + "devDependencies": { + "@map-colonies/eslint-config": "workspace:^", + "@map-colonies/tsconfig": "workspace:^", + "@types/node": "catalog:", + "eslint": "catalog:", + "rimraf": "catalog:", + "typescript": "catalog:", + "vitest-config": "workspace:^", + "vitest": "catalog:", + "@microsoft/api-extractor": "catalog:", + "jest-extended": "^7.0.0", + "jest-openapi": "^0.14.2" + }, + "dependencies": {}, + "peerDependencies": { + "vitest": "^4.1.4", + "jest-extended": "^7.0.0", + "jest-openapi": "^0.14.2" + }, + "peerDependenciesMeta": { + "jest-extended": { + "optional": true + }, + "jest-openapi": { + "optional": true + } + } +} diff --git a/packages/vitest-utils/src/index.ts b/packages/vitest-utils/src/index.ts new file mode 100644 index 00000000..cca142fb --- /dev/null +++ b/packages/vitest-utils/src/index.ts @@ -0,0 +1,3 @@ +export * from './pathAlias.js'; +export * from './reporters.js'; +export * from './openapi.js'; diff --git a/packages/vitest-utils/src/openapi.ts b/packages/vitest-utils/src/openapi.ts new file mode 100644 index 00000000..158ceeb7 --- /dev/null +++ b/packages/vitest-utils/src/openapi.ts @@ -0,0 +1,50 @@ +import jestOpenApi from 'jest-openapi'; +import { expect } from 'vitest'; + +/** + * Configures `jest-openapi` to validate responses against an OpenAPI specification. + * + * This function bridges `jest-openapi` (which relies on a global `expect`) with + * Vitest's local `expect` instance, then resets the global to avoid polluting + * other tests. + * + * @param path - Absolute or relative path to the OpenAPI specification file (JSON or YAML) + * + * @example + * The recommended approach is to call this from a Vitest setup file so it runs once + * before the entire suite: + * ```typescript + * // tests/setup.ts + * import { setupOpenapi } from '@map-colonies/vitest-utils'; + * + * setupOpenapi('/path/to/openapi.yaml'); + * ``` + * ```typescript + * // vitest.config.ts + * export default defineProject({ + * test: { + * setupFiles: ['./tests/setup.ts'], + * }, + * }); + * ``` + * + * Alternatively, call it inside a `beforeAll` when you need per-suite control: + * ```typescript + * beforeAll(function () { + * setupOpenapi('/path/to/openapi.yaml'); + * }); + * + * it('should satisfy the OpenAPI spec', async function () { + * const response = await supertest(app).get('/resource'); + * expect(response).toSatisfyApiSpec(); + * }); + * ``` + * @public + */ +export function setupOpenapi(path: string): void { + //@ts-expect-error - jest-openapi does not have types, but it extends expect, so we need to ignore the error + globalThis.expect = expect; + jestOpenApi.default(path); + //@ts-expect-error - see above, we need to ignore the error to reset global expect + globalThis.expect = undefined; // Reset global expect to avoid conflicts with other test frameworks +} diff --git a/packages/vitest-utils/src/pathAlias.ts b/packages/vitest-utils/src/pathAlias.ts new file mode 100644 index 00000000..74b6b421 --- /dev/null +++ b/packages/vitest-utils/src/pathAlias.ts @@ -0,0 +1,51 @@ +import path from 'node:path'; + +/** + * Converts a TypeScript `compilerOptions.paths` map into a Vitest-compatible alias map. + * + * Each path alias key (e.g. `@app/*`) is stripped of its trailing `/*` and mapped to the + * resolved absolute path of the first entry in its value array. + * + * @param tsconfig - A partial tsconfig object containing `compilerOptions.paths` + * @param rootDir - The root directory used to resolve relative path values + * @returns A record mapping alias names to absolute filesystem paths + * + * @throws Error If an alias entry has an empty path array + * + * @example + * ```typescript + * // vitest.config.ts + * import { defineProject, mergeConfig } from 'vitest/config'; + * import { getPathAlias } from '@map-colonies/vitest-utils'; + * import tsconfigJson from './tsconfig.json'; + * + * export default mergeConfig( + * sharedConfig, + * defineProject({ + * resolve: { + * alias: getPathAlias(tsconfigJson, __dirname), + * }, + * }) + * ); + * ``` + * @public + */ +function getPathAlias(tsconfig: { compilerOptions: { paths: Record } }, rootDir: string): Record { + return Object.fromEntries( + // For Each Path in tsconfig.json + Object.entries(tsconfig.compilerOptions.paths).map(([key, [value]]) => { + if (value === undefined) { + throw new Error(`Invalid path alias for key '${key}' in tsconfig.json, expected an array with at least one path`); + } + + return [ + // Remove the "/*" from the key and resolve the path + key.replace('/*', ''), + // Remove the "/*" from the value Resolve the relative path + path.resolve(rootDir, value.replace('/*', '')), + ]; + }) + ); +} + +export { getPathAlias }; diff --git a/packages/vitest-utils/src/reporters.ts b/packages/vitest-utils/src/reporters.ts new file mode 100644 index 00000000..a7625537 --- /dev/null +++ b/packages/vitest-utils/src/reporters.ts @@ -0,0 +1,28 @@ +import type { ViteUserConfig } from 'vitest/config'; + +/** + * A pre-configured list of Vitest reporters to use in your `vitest.config.ts`. + * + * Includes `"default"` and `"html"` reporters by default. + * When running inside a GitHub Actions environment (`GITHUB_ACTIONS` env var is set), + * the `"github-actions"` reporter is automatically appended for richer CI output. + * + * @example + * ```typescript + * import { defineProject, mergeConfig } from 'vitest/config'; + * import { reporters } from '@map-colonies/vitest-utils'; + * + * export default mergeConfig( + * sharedConfig, + * defineProject({ test: { reporters } }) + * ); + * ``` + * @public + */ +const reporters: Exclude['reporters'] = ['default', 'html']; + +if (process.env.GITHUB_ACTIONS !== undefined) { + reporters.push('github-actions'); +} + +export { reporters }; diff --git a/packages/vitest-utils/src/vitest-extended.ts b/packages/vitest-utils/src/vitest-extended.ts new file mode 100644 index 00000000..1ef1d422 --- /dev/null +++ b/packages/vitest-utils/src/vitest-extended.ts @@ -0,0 +1,18 @@ +import { expect } from 'vitest'; +import type * as matchersType from 'jest-extended'; + +async function importOrThrow(modulePath: string): Promise { + try { + const imported = (await import(modulePath)) as T; + + if ('default' in imported) { + return imported.default as T; + } + return imported; + } catch (error) { + throw new Error(`Failed to import optional module '${modulePath}', make sure its installed and try again`, { cause: error }); + } +} + +const matchers = await importOrThrow('jest-extended'); +expect.extend(matchers); diff --git a/packages/vitest-utils/tests/index.spec.ts b/packages/vitest-utils/tests/index.spec.ts new file mode 100644 index 00000000..94d5fc0a --- /dev/null +++ b/packages/vitest-utils/tests/index.spec.ts @@ -0,0 +1,152 @@ +import path from 'node:path'; +import { describe, vi, it, expect, beforeEach, afterEach } from 'vitest'; +import { getPathAlias } from '../src/pathAlias.js'; +import { setupOpenapi } from '../src/openapi.js'; + +// ─── pathAlias ─────────────────────────────────────────────────────────────── + +describe('getPathAlias', function () { + const rootDir = '/project'; + + it('should map a single alias to a resolved absolute path', function () { + const tsconfig = { + compilerOptions: { + paths: { + '@app/*': ['src/app/*'], + }, + }, + }; + + const result = getPathAlias(tsconfig, rootDir); + + expect(result).toEqual({ + '@app': path.resolve(rootDir, 'src/app'), + }); + }); + + it('should strip "/*" from both the key and the value', function () { + const tsconfig = { + compilerOptions: { + paths: { + '@utils/*': ['src/utils/*'], + }, + }, + }; + + const result = getPathAlias(tsconfig, rootDir); + + expect(result['@utils']).toBe(path.resolve(rootDir, 'src/utils')); + }); + + it('should handle multiple aliases', function () { + const tsconfig = { + compilerOptions: { + paths: { + '@app/*': ['src/app/*'], + '@lib/*': ['src/lib/*'], + '@shared/*': ['src/shared/*'], + }, + }, + }; + + const result = getPathAlias(tsconfig, rootDir); + + expect(result).toEqual({ + '@app': path.resolve(rootDir, 'src/app'), + '@lib': path.resolve(rootDir, 'src/lib'), + '@shared': path.resolve(rootDir, 'src/shared'), + }); + }); + + it('should return an empty object when paths is empty', function () { + const tsconfig = { compilerOptions: { paths: {} } }; + + const result = getPathAlias(tsconfig, rootDir); + + expect(result).toEqual({}); + }); + + it('should throw when an alias has an empty path array', function () { + const tsconfig = { + compilerOptions: { + paths: { '@bad/*': [] as string[] }, + }, + }; + + expect(() => getPathAlias(tsconfig, rootDir)).toThrow("Invalid path alias for key '@bad/*'"); + }); + + it('should resolve paths relative to the provided rootDir', function () { + const customRoot = '/custom/root'; + const tsconfig = { + compilerOptions: { + paths: { '@src/*': ['src/*'] }, + }, + }; + + const result = getPathAlias(tsconfig, customRoot); + + expect(result['@src']).toBe(path.resolve(customRoot, 'src')); + }); +}); + +// ─── reporters ─────────────────────────────────────────────────────────────── + +describe('reporters', function () { + it('should include "default" and "html" reporters outside CI', async function () { + vi.stubEnv('GITHUB_ACTIONS', undefined as unknown as string); + vi.resetModules(); + const { reporters } = await import('../src/reporters.js'); + + expect(reporters).toContain('default'); + expect(reporters).toContain('html'); + expect(reporters).not.toContain('github-actions'); + + vi.unstubAllEnvs(); + }); + + it('should include "github-actions" reporter when GITHUB_ACTIONS is set', async function () { + vi.stubEnv('GITHUB_ACTIONS', 'true'); + vi.resetModules(); + const { reporters } = await import('../src/reporters.js'); + + expect(reporters).toContain('default'); + expect(reporters).toContain('html'); + expect(reporters).toContain('github-actions'); + + vi.unstubAllEnvs(); + }); +}); + +// ─── openapi ───────────────────────────────────────────────────────────────── + +describe('setupOpenapi', function () { + beforeEach(function () { + vi.mock('jest-openapi', () => ({ + default: { + default: vi.fn(), + }, + })); + }); + + afterEach(function () { + vi.restoreAllMocks(); + // @ts-expect-error - reset global expect to avoid conflicts with other test frameworks + globalThis.expect = undefined as unknown as typeof expect; + }); + + it('should call jestOpenApi with the provided path', async function () { + const jestOpenApi = await import('jest-openapi'); + const mockSetup = vi.mocked(jestOpenApi.default.default); + + setupOpenapi('/some/path/openapi.yaml'); + + expect(mockSetup).toHaveBeenCalledWith('/some/path/openapi.yaml'); + }); + + it('should reset globalThis.expect to undefined after setup', function () { + setupOpenapi('/some/path/openapi.yaml'); + + expect((globalThis as Record)['expect']).toBeUndefined(); + }); +}); diff --git a/packages/vitest-utils/tsconfig.build.json b/packages/vitest-utils/tsconfig.build.json new file mode 100644 index 00000000..2fae602b --- /dev/null +++ b/packages/vitest-utils/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["tests/**"], + "compilerOptions": { + "sourceMap": false, + "inlineSourceMap": false, + "declarationMap": false + } +} diff --git a/packages/vitest-utils/tsconfig.json b/packages/vitest-utils/tsconfig.json new file mode 100644 index 00000000..0b9854d9 --- /dev/null +++ b/packages/vitest-utils/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@map-colonies/tsconfig/tsconfig-library", + "include": ["src", "tests"], + "exclude": ["dist", "node_modules"], + "compilerOptions": { + "paths": { + "jest-extended": ["./node_modules/jest-extended/types/index.d.ts"] + } + } +} diff --git a/packages/vitest-utils/typedoc.json b/packages/vitest-utils/typedoc.json new file mode 100644 index 00000000..3ab82e82 --- /dev/null +++ b/packages/vitest-utils/typedoc.json @@ -0,0 +1,3 @@ +{ + "tsconfig": "tsconfig.build.json" +} diff --git a/packages/vitest-utils/vitest.config.ts b/packages/vitest-utils/vitest.config.ts new file mode 100644 index 00000000..1fb90717 --- /dev/null +++ b/packages/vitest-utils/vitest.config.ts @@ -0,0 +1,11 @@ +import { mergeConfig, defineProject } from 'vitest/config'; +import sharedConfig from 'vitest-config'; + +export default mergeConfig( + sharedConfig, + defineProject({ + test: { + root: __dirname, + }, + }) +); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6340b7e4..5f7f710c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -370,6 +370,15 @@ importers: '@map-colonies/read-pkg': specifier: workspace:^ version: link:../read-pkg + '@opentelemetry/resource-detector-container': + specifier: ^0.8.4 + version: 0.8.4(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^2.6.0 + version: 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': + specifier: ^1.40.0 + version: 1.40.0 pino: specifier: ^10.1.0 version: 10.1.0 @@ -704,7 +713,7 @@ importers: version: link:../read-pkg '@opentelemetry/auto-instrumentations-node': specifier: ^0.68.0 - version: 0.68.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0)) + version: 0.68.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)) '@opentelemetry/exporter-trace-otlp-proto': specifier: ^0.210.0 version: 0.210.0(@opentelemetry/api@1.9.0) @@ -833,6 +842,42 @@ importers: specifier: 'catalog:' version: 0.3.16 + packages/vitest-utils: + devDependencies: + '@map-colonies/eslint-config': + specifier: workspace:^ + version: link:../eslint-config + '@map-colonies/tsconfig': + specifier: workspace:^ + version: link:../typescript-config + '@microsoft/api-extractor': + specifier: 'catalog:' + version: 7.55.2(@types/node@24.10.9) + '@types/node': + specifier: 'catalog:' + version: 24.10.9 + eslint: + specifier: 'catalog:' + version: 9.39.1(jiti@2.6.1) + jest-extended: + specifier: ^7.0.0 + version: 7.0.0(typescript@5.9.3) + jest-openapi: + specifier: ^0.14.2 + version: 0.14.2 + rimraf: + specifier: 'catalog:' + version: 6.1.2 + typescript: + specifier: 'catalog:' + version: 5.9.3 + vitest: + specifier: 'catalog:' + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/ui@4.0.18)(jiti@2.6.1)(yaml@2.8.2) + vitest-config: + specifier: workspace:^ + version: link:../../internal/vitest-config + packages: '@andrewbranch/untar.js@1.0.3': @@ -1295,6 +1340,22 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} + '@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} + + '@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} + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@26.6.2': + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1423,6 +1484,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.6.0': + resolution: {integrity: sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/exporter-logs-otlp-grpc@0.206.0': resolution: {integrity: sha512-kJKxKBaGwqWop95d6tcluz260IWwIgOG0BH8oVm6429tg8LxY2PJb7Om8d5s+5vOFM8DkUYCnIpn9d/13/RcKQ==} engines: {node: ^18.19.0 || >=20.6.0} @@ -1829,8 +1896,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resource-detector-container@0.8.1': - resolution: {integrity: sha512-LacHjqQJRqtoeh5RCAa8hEGfQ4rPDNNI1+J1RPrLSFWfFWxR56/iiAmBOwDhYwE1c3keBe3wTITbnWGxlhQDsA==} + '@opentelemetry/resource-detector-container@0.8.4': + resolution: {integrity: sha512-kIvGHkMSacp+kb7btTuXbOAIWLyOCO+P/h/8xxaeLcp5ptmHRZ67uEdLAQo61ApdayFB/uqjJ9gY4x2/i/KsoA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 @@ -1853,14 +1920,14 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.3.0': - resolution: {integrity: sha512-shlr2l5g+87J8wqYlsLyaUsgKVRO7RtX70Ckd5CtDOWtImZgaUDmf4Z2ozuSKQLM2wPDR0TE/3bPVBNJtRm/cQ==} + '@opentelemetry/resources@2.4.0': + resolution: {integrity: sha512-RWvGLj2lMDZd7M/5tjkI/2VHMpXebLgPKvBUd9LRasEWR2xAynDwEYZuLvY9P2NGG73HF07jbbgWX2C9oavcQg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.4.0': - resolution: {integrity: sha512-RWvGLj2lMDZd7M/5tjkI/2VHMpXebLgPKvBUd9LRasEWR2xAynDwEYZuLvY9P2NGG73HF07jbbgWX2C9oavcQg==} + '@opentelemetry/resources@2.6.0': + resolution: {integrity: sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -1917,6 +1984,10 @@ packages: resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.40.0': + resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} + engines: {node: '>=14'} + '@opentelemetry/sql-common@0.41.2': resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} engines: {node: ^18.19.0 || >=20.6.0} @@ -2318,6 +2389,9 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sinclair/typebox@0.34.49': + resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -2340,6 +2414,9 @@ packages: '@types/bunyan@1.8.11': resolution: {integrity: sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==} + '@types/caseless@0.12.5': + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -2370,6 +2447,15 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -2412,6 +2498,9 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/request@2.48.13': + resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} + '@types/send@0.17.6': resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} @@ -2421,6 +2510,9 @@ packages: '@types/serve-static@1.15.10': resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + '@types/superagent@4.1.24': + resolution: {integrity: sha512-mEafCgyKiMFin24SDzWN7yAADt4gt6YawFiNMp0QS5ZPboORfyxFt0s3VzJKhTaKg9py/4FUmrHLTNfJKt9Rbw==} + '@types/superagent@8.1.9': resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} @@ -2433,9 +2525,18 @@ packages: '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@15.0.20': + resolution: {integrity: sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==} + '@typescript-eslint/eslint-plugin@8.49.0': resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2777,6 +2878,14 @@ packages: ajv: optional: true + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -2817,6 +2926,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -2880,6 +2993,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -2888,6 +3005,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3031,6 +3151,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + combos@0.2.0: + resolution: {integrity: sha512-Z6YfvgiTCERWJTj3wQiXamFhssdvz1n4ok447rS330lw3uL72WAx8IvrLU7xiE71uyb5WF8JEP+BWB5KhOoGeg==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -3192,6 +3315,10 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + diff-sequences@26.6.2: + resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} + engines: {node: '>= 10.14.2'} + diff@8.0.2: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} @@ -3522,10 +3649,23 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + form-data@2.5.5: + resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} + engines: {node: '>= 0.12'} + form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -3558,6 +3698,10 @@ packages: resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3951,6 +4095,35 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + jest-diff@26.6.2: + resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} + engines: {node: '>= 10.14.2'} + + jest-diff@30.3.0: + resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-extended@7.0.0: + resolution: {integrity: sha512-96jBsVJDxZKFh+kWY7E18Is2usUsUYtBn97MxCtb4COnbgD4aE1h+P0fdFQNeJaI6KOeduas4Numc9yTuk0+Gw==} + engines: {node: ^20.9.0 || ^22.11.0 || ^24.11.0 || >=25.0.0} + peerDependencies: + jest: '>=27.2.5' + typescript: '>=5.0.0' + peerDependenciesMeta: + jest: + optional: true + + jest-get-type@26.3.0: + resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} + engines: {node: '>= 10.14.2'} + + jest-matcher-utils@26.6.2: + resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} + engines: {node: '>= 10.14.2'} + + jest-openapi@0.14.2: + resolution: {integrity: sha512-7LNIV2FQrxE2ilhyJfIDQUUjeEn3rYmDmwzH4uXbvMj274ipGOKfajFMXVdY5ktw0WdAPBmXWuCGP/XCfr2Wjg==} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -4392,15 +4565,27 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + openapi-response-validator@9.3.1: + resolution: {integrity: sha512-2AOzHAbrwdj5DNL3u+BadhfmL3mlc3mmCv6cSAsEjoMncpOOVd95JyMf0j0XUyJigJ8/ILxnhETfg35vt1pGSQ==} + + openapi-schema-validator@9.3.1: + resolution: {integrity: sha512-5wpFKMoEbUcjiqo16jIen3Cb2+oApSnYZpWn8WQdRO2q/dNQZZl8Pz6ESwCriiyU5AK4i5ZI6+7O3bHQr6+6+g==} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + openapi-types@9.3.1: + resolution: {integrity: sha512-/Yvsd2D7miYB4HLJ3hOOS0+vnowQpaT75FsHzr/y5M9P4q9bwa7RcbW2YdH6KZBn8ceLbKGnHxMZ1CHliGHUFw==} + openapi-typescript@7.10.1: resolution: {integrity: sha512-rBcU8bjKGGZQT4K2ekSTY2Q5veOQbVG/lTKZ49DeCyT9z62hM2Vj/LLHjDHC9W7LJG8YMHcdXpRZDqC1ojB/lw==} hasBin: true peerDependencies: typescript: ^5.x + openapi-validator@0.14.2: + resolution: {integrity: sha512-bgRQLZoxmECTjRxfpyMorad1ll58biUdV+31ALsHW2gRzdtMscI4Qm/wuhG8HsDUMGQkVLQYzUgJijNGKD65Og==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -4484,6 +4669,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parser@6.1.0: + resolution: {integrity: sha512-nAB6J73z2rFcQP+870OHhpkHFj5kO4rPLc2Ol4Y3Ale7F6Hk1/cPKp7cQ8RznKF8FOSvu+YR9Xc6Gafk7DlpYA==} + path-scurry@2.0.1: resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} @@ -4595,6 +4783,14 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + + pretty-format@30.3.0: + resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-quick@4.2.2: resolution: {integrity: sha512-uAh96tBW1SsD34VhhDmWuEmqbpfYc/B3j++5MC/6b3Cb8Ow7NJsvKFhg0eoGu2xXX+o9RkahkTK6sUdd8E7g5w==} engines: {node: '>=14'} @@ -4674,6 +4870,12 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + read-yaml-file@2.1.0: resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} engines: {node: '>=10.13'} @@ -4787,6 +4989,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + search-params@3.0.0: + resolution: {integrity: sha512-8CYNl/bjkEhXWbDTU/K7c2jQtrnqEffIPyOLMqygW/7/b+ym8UtQumcAZjOfMLjZKR6AxK5tOr9fChbQZCzPqg==} + secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} @@ -5125,6 +5330,9 @@ packages: typescript: optional: true + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -5211,6 +5419,9 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + typeof@1.0.0: + resolution: {integrity: sha512-Pze0mIxYXhaJdpw1ayMzOA7rtGr1OmsTY/Z+FWtRKIqXFz6aoDLjqdbWE/tcIBSC8nhnVXiRrEXujodR/xiFAA==} + typescript-eslint@8.49.0: resolution: {integrity: sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5979,6 +6190,22 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 + '@jest/diff-sequences@30.3.0': {} + + '@jest/get-type@30.1.0': {} + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.49 + + '@jest/types@26.6.2': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 25.0.0 + '@types/yargs': 15.0.20 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6098,10 +6325,10 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@opentelemetry/auto-instrumentations-node@0.68.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0))': + '@opentelemetry/auto-instrumentations-node@0.68.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.4.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-amqplib': 0.57.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-aws-lambda': 0.62.0(@opentelemetry/api@1.9.0) @@ -6147,9 +6374,9 @@ snapshots: '@opentelemetry/resource-detector-alibaba-cloud': 0.33.0(@opentelemetry/api@1.9.0) '@opentelemetry/resource-detector-aws': 2.10.0(@opentelemetry/api@1.9.0) '@opentelemetry/resource-detector-azure': 0.18.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resource-detector-container': 0.8.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-container': 0.8.4(@opentelemetry/api@1.9.0) '@opentelemetry/resource-detector-gcp': 0.45.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': 0.210.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - encoding @@ -6168,22 +6395,27 @@ snapshots: '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/core@2.4.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 + + '@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/exporter-logs-otlp-grpc@0.206.0(@opentelemetry/api@1.9.0)': dependencies: @@ -6318,14 +6550,14 @@ snapshots: '@opentelemetry/core': 2.4.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.4.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.4.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/instrumentation-amqplib@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6333,7 +6565,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/aws-lambda': 8.10.159 transitivePeerDependencies: - supports-color @@ -6343,7 +6575,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6360,7 +6592,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6369,7 +6601,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color @@ -6378,7 +6610,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6401,7 +6633,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6410,7 +6642,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6440,7 +6672,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6449,7 +6681,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6458,7 +6690,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.4.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color @@ -6468,7 +6700,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6476,7 +6708,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6484,7 +6716,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6493,7 +6725,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6508,7 +6740,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/memcached': 2.2.10 transitivePeerDependencies: - supports-color @@ -6517,7 +6749,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6526,7 +6758,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6534,7 +6766,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -6543,7 +6775,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/mysql': 2.15.27 transitivePeerDependencies: - supports-color @@ -6552,7 +6784,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6560,7 +6792,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6569,7 +6801,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.210.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6577,7 +6809,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/oracledb': 6.5.2 transitivePeerDependencies: - supports-color @@ -6587,7 +6819,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) '@types/pg': 8.15.6 '@types/pg-pool': 2.0.7 @@ -6608,7 +6840,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6617,7 +6849,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6625,7 +6857,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6647,7 +6879,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@types/tedious': 4.0.14 transitivePeerDependencies: - supports-color @@ -6657,7 +6889,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.210.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6744,33 +6976,33 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/resource-detector-aws@2.10.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/resource-detector-azure@0.18.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resource-detector-container@0.8.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/resource-detector-container@0.8.4(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.4.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/resource-detector-gcp@0.45.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) gcp-metadata: 6.1.1 transitivePeerDependencies: - encoding @@ -6780,25 +7012,25 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resources@2.3.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@2.4.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/core': 2.4.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resources@2.4.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.4.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0)': dependencies: @@ -6852,7 +7084,7 @@ snapshots: '@opentelemetry/sdk-metrics': 2.4.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.4.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 2.4.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: - supports-color @@ -6861,14 +7093,14 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sdk-trace-base@2.4.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.4.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.4.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sdk-trace-node@2.4.0(@opentelemetry/api@1.9.0)': dependencies: @@ -6879,6 +7111,8 @@ snapshots: '@opentelemetry/semantic-conventions@1.38.0': {} + '@opentelemetry/semantic-conventions@1.40.0': {} + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -7233,6 +7467,8 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sinclair/typebox@0.34.49': {} + '@sindresorhus/is@4.6.0': {} '@standard-schema/spec@1.1.0': {} @@ -7253,7 +7489,9 @@ snapshots: '@types/bunyan@1.8.11': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 + + '@types/caseless@0.12.5': {} '@types/chai@5.2.3': dependencies: @@ -7262,7 +7500,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/conventional-commits-parser@5.0.2': dependencies: @@ -7276,7 +7514,7 @@ snapshots: '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -7294,6 +7532,16 @@ snapshots: '@types/http-errors@2.0.5': {} + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/js-yaml@4.0.9': {} '@types/json-schema@7.0.15': {} @@ -7302,7 +7550,7 @@ snapshots: '@types/memcached@2.2.10': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/methods@1.1.4': {} @@ -7310,7 +7558,7 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/node@24.10.9': dependencies: @@ -7322,7 +7570,7 @@ snapshots: '@types/oracledb@6.5.2': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/pg-pool@2.0.7': dependencies: @@ -7330,7 +7578,7 @@ snapshots: '@types/pg@8.15.6': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -7338,26 +7586,38 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/request@2.48.13': + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 25.0.0 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.5 + '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/send@1.2.1': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.10.9 + '@types/node': 25.0.0 '@types/send': 0.17.6 + '@types/superagent@4.1.24': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/node': 25.0.0 + '@types/superagent@8.1.9': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 24.10.9 + '@types/node': 25.0.0 form-data: 4.0.5 '@types/supertest@6.0.3': @@ -7372,10 +7632,18 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 24.10.9 + '@types/node': 25.0.0 + + '@types/tough-cookie@4.0.5': {} '@types/unist@3.0.3': {} + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@15.0.20': + dependencies: + '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -7779,6 +8047,10 @@ snapshots: optionalDependencies: ajv: 8.17.1 + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-formats@3.0.1(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -7829,6 +8101,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + any-promise@1.3.0: {} argparse@1.0.10: @@ -7914,12 +8188,20 @@ snapshots: asynckit@0.4.0: {} + at-least-node@1.0.0: {} + atomic-sleep@1.0.0: {} available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 + axios@0.21.4: + dependencies: + follow-redirects: 1.15.11 + transitivePeerDependencies: + - debug + balanced-match@1.0.2: {} baseline-browser-mapping@2.9.15: {} @@ -8084,6 +8366,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + combos@0.2.0: {} + commander@10.0.1: {} commander@14.0.2: {} @@ -8231,6 +8515,8 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 + diff-sequences@26.6.2: {} + diff@8.0.2: {} doctrine@2.1.0: @@ -8763,10 +9049,21 @@ snapshots: flatted@3.3.3: {} + follow-redirects@1.15.11: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 + form-data@2.5.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -8799,6 +9096,13 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fsevents@2.3.3: optional: true @@ -9181,6 +9485,41 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 + jest-diff@26.6.2: + dependencies: + chalk: 4.1.2 + diff-sequences: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + + jest-diff@30.3.0: + dependencies: + '@jest/diff-sequences': 30.3.0 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.3.0 + + jest-extended@7.0.0(typescript@5.9.3): + dependencies: + jest-diff: 30.3.0 + typescript: 5.9.3 + + jest-get-type@26.3.0: {} + + jest-matcher-utils@26.6.2: + dependencies: + chalk: 4.1.2 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + + jest-openapi@0.14.2: + dependencies: + jest-matcher-utils: 26.6.2 + openapi-validator: 0.14.2 + transitivePeerDependencies: + - debug + jiti@2.6.1: {} jju@1.4.0: {} @@ -9592,8 +9931,22 @@ snapshots: dependencies: mimic-function: 5.0.1 + openapi-response-validator@9.3.1: + dependencies: + ajv: 8.17.1 + openapi-types: 9.3.1 + + openapi-schema-validator@9.3.1: + dependencies: + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + lodash.merge: 4.6.2 + openapi-types: 9.3.1 + openapi-types@12.1.3: {} + openapi-types@9.3.1: {} + openapi-typescript@7.10.1(typescript@5.9.3): dependencies: '@redocly/openapi-core': 1.34.6(supports-color@10.2.2) @@ -9604,6 +9957,21 @@ snapshots: typescript: 5.9.3 yargs-parser: 21.1.1 + openapi-validator@0.14.2: + dependencies: + '@types/request': 2.48.13 + '@types/superagent': 4.1.24 + axios: 0.21.4 + combos: 0.2.0 + fs-extra: 9.1.0 + js-yaml: 4.1.1 + openapi-response-validator: 9.3.1 + openapi-schema-validator: 9.3.1 + path-parser: 6.1.0 + typeof: 1.0.0 + transitivePeerDependencies: + - debug + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -9630,7 +9998,7 @@ snapshots: '@opentelemetry/exporter-logs-otlp-grpc': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-logs-otlp-http': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-logs-otlp-proto': 0.206.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - '@opentelemetry/api' @@ -9721,6 +10089,11 @@ snapshots: path-parse@1.0.7: {} + path-parser@6.1.0: + dependencies: + search-params: 3.0.0 + tslib: 1.14.1 + path-scurry@2.0.1: dependencies: lru-cache: 11.2.4 @@ -9837,6 +10210,19 @@ snapshots: prettier@3.8.1: {} + pretty-format@26.6.2: + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + + pretty-format@30.3.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-quick@4.2.2(prettier@3.8.1): dependencies: '@pkgr/core': 0.2.9 @@ -9875,7 +10261,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.10.9 + '@types/node': 25.0.0 long: 5.3.2 protobufjs@8.0.0: @@ -9890,7 +10276,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.10.9 + '@types/node': 25.0.0 long: 5.3.2 protoc@33.4.0: {} @@ -9942,6 +10328,10 @@ snapshots: react-is@16.13.1: {} + react-is@17.0.2: {} + + react-is@18.3.1: {} + read-yaml-file@2.1.0: dependencies: js-yaml: 4.1.1 @@ -10094,6 +10484,8 @@ snapshots: safer-buffer@2.1.2: {} + search-params@3.0.0: {} + secure-json-parse@4.1.0: {} semver@6.3.1: {} @@ -10494,6 +10886,8 @@ snapshots: optionalDependencies: typescript: 5.9.3 + tslib@1.14.1: {} + tslib@2.8.1: {} turbo-darwin-64@2.7.5: @@ -10591,6 +10985,8 @@ snapshots: typescript: 5.9.3 yaml: 2.8.2 + typeof@1.0.0: {} + typescript-eslint@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) diff --git a/release-please-config.json b/release-please-config.json index 3d210e09..3001cf45 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -121,6 +121,10 @@ "packages/eslint-plugin": { "package-name": "@map-colonies/eslint-plugin", "release-type": "node" + }, + "packages/vitest-utils": { + "package-name": "@map-colonies/vitest-utils", + "release-type": "node" } } }