From aed4607a94be359151e221d513e01f5c0bc97f3d Mon Sep 17 00:00:00 2001 From: Marco Falkenberg Date: Tue, 8 Sep 2026 15:09:39 +0200 Subject: [PATCH] test: run the type-level tests via tsc --noEmit instead of tsd `packages/commons` and `packages/models` both declared a `tsd` dependency and carried `*.test-types.ts` files, but nothing ever executed them: tsd discovers `*.test-d.ts`, no package had a script invoking it, and `packages/commons` had no `test:compile` target at all. Drop tsd rather than wire it up. It pins its own TypeScript (`@tsd/typescript` 5.4.5 vs. the repo's 5.7.2), force-sets `skipLibCheck: false` over the root tsconfig, ignores `tsd.typingsFile`/`tsd.testFiles` in package.json so it needs CLI flags plus a built `dist/types/index.d.ts`, and would need its own nx target. `test:compile` already exists on three packages and `nx.json` already wires it into `test`, so adding that target to commons is all it takes. No assertion library replaces it; everything is expressed in plain TypeScript. The tsd helpers do not survive a naive port -- under plain tsc, `expectType(e: T)` weakens from identity to assignability and `expectNotAssignable(e: any)` is a no-op -- so: - Assignability is asserted with native `satisfies`, which keeps the excess-property checks and literal inference a real call site gets. A type-level `extends` check is not equivalent: excess properties are invisible to it, which would silently drop five of the assertions here (three in `RequestType.test-types.ts`, two in `Response.test-types.ts`). Passing the literal to a helper function instead also reintroduces widening -- `status: 400` becomes `number` -- which is exactly what made the old assertions vacuous. - Exact type identity uses a local `ExpectExact>` pair. `typeof` respects control-flow narrowing, including nested guards, so this works for the narrowed assertions in `Response.test-types.ts`. The four `expectNotAssignable` calls in `Response.test-types.ts` were vacuous: with a parameter typed `any` there is no contextual type, so `status: 200` widened to `number` and failed the `200` literal no matter what the assertion was meant to check. They are now `@ts-expect-error` checks on the specific offending property. Also fixes two packaging defects this touches: - `tsd` sat in `@mittwald/api-models`' runtime `dependencies`, so every consumer installed it. - Both packages compiled their unit tests and type tests into `dist`, and the emitted `*.test-types.js` imported `"tsd"` -- a devDependency, i.e. a broken import in the published output. A new build-only `tsconfig.build.json` excludes them; `test:compile` keeps using the plain `tsconfig.json`, so they are still type-checked. Verified that nothing but test files left the build output (16 files in commons, 6 in models, none added). The stale `exclude: ["test-d/**/*", "*.test.ts"]` is gone from both tsconfigs: no `test-d` directories exist, and the bare glob only matched package-root files. Co-Authored-By: Claude Opus 5 --- packages/commons/package.json | 7 +- .../src/types/RequestType.test-types.ts | 124 ++++--- .../commons/src/types/Response.test-types.ts | 83 +++-- .../src/types/assertStatus.test-types.ts | 7 +- packages/commons/tsconfig.build.json | 5 + packages/commons/tsconfig.json | 1 - packages/models/package.json | 3 +- .../src/react/provideReact.test-types.ts | 32 +- packages/models/tsconfig.build.json | 5 + packages/models/tsconfig.json | 1 - yarn.lock | 333 +----------------- 11 files changed, 185 insertions(+), 416 deletions(-) create mode 100644 packages/commons/tsconfig.build.json create mode 100644 packages/models/tsconfig.build.json diff --git a/packages/commons/package.json b/packages/commons/package.json index 6451f9799..a8d6805c7 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -33,11 +33,13 @@ "dist" ], "scripts": { - "build": "run build:clean && run tsc", + "build": "run build:clean && run tsc --project tsconfig.build.json", "build:clean": "run rimraf dist", "format": "run prettier --write '**/*.{ts,tsx,yaml,yml,json,md,mdx,js}'", "lint": "run eslint .", - "test": "node --experimental-vm-modules $(yarn bin jest)" + "test": "", + "test:compile": "run tsc --noEmit", + "test:unit": "node --experimental-vm-modules $(yarn bin jest)" }, "dependencies": { "@types/parse-path": "^7.0.3", @@ -65,7 +67,6 @@ "react": "^18.3.1", "rimraf": "^5.0.10", "ts-jest": "^29.2.5", - "tsd": "^0.31.2", "typescript": "^5.7.2" }, "peerDependencies": { diff --git a/packages/commons/src/types/RequestType.test-types.ts b/packages/commons/src/types/RequestType.test-types.ts index 0febb04d6..c6bb947a5 100644 --- a/packages/commons/src/types/RequestType.test-types.ts +++ b/packages/commons/src/types/RequestType.test-types.ts @@ -1,102 +1,110 @@ -import { expectAssignable } from "tsd"; import { RequestType } from "./index.js"; +/* + * Type-level tests. They are checked by `tsc --noEmit` (the `test:compile` + * target), not by a test runner. Assignability is asserted with `satisfies` + * rather than a type-level `extends`, so that excess-property and weak-type + * checks apply -- those are what a real call site passing an object literal + * gets, and they are what most of the assertions below are about. Expected + * rejections are marked with `@ts-expect-error`. + */ + type Data = { foo: string }; type Path = { bar: string }; type Header = { baz: string }; type Query = { whut: string }; function ignoredTestEmptyRequestTypes() { - expectAssignable({}); + void ({} satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable({ extra: true }); + void ({ extra: true } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable({ data: {} }); + void ({ data: {} } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable({ data: null }); + void ({ data: null } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable({ pathParameters: {} }); + void ({ pathParameters: {} } satisfies RequestType); } function ignoredTestRequestTypesWithDataType() { - expectAssignable>({ data: { foo: "" } }); + void ({ data: { foo: "" } } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable>({}); - expectAssignable>({ + void ({} satisfies RequestType); + void ({ // @ts-expect-error Not assignable data: { foo: "", extra: "" }, - }); + } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable>({ data: { noFoo: "" } }); + void ({ data: { noFoo: "" } } satisfies RequestType); } function ignoredTestRequestTypesWithPathParameters() { - expectAssignable>({ + void ({ data: { foo: "" }, pathParameters: { bar: "" }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ pathParameters: { bar: "" }, - }); + } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable>({}); - expectAssignable>({ + void ({} satisfies RequestType); + void ({ // @ts-expect-error Not assignable pathParameters: {}, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ // @ts-expect-error Not assignable pathParameters: { foo: "", extra: "" }, - }); + } satisfies RequestType); } function ignoredTestRequestTypesWithHeader() { - expectAssignable>({ + void ({ data: { foo: "", }, pathParameters: { bar: "" }, headers: { baz: "" }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ pathParameters: { bar: "" }, headers: { baz: "" }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ headers: { baz: "" }, - }); + } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable>({}); - expectAssignable>({ + void ({} satisfies RequestType); + void ({ headers: { // @ts-expect-error Not assignable baz: 42, }, - }); + } satisfies RequestType); - expectAssignable>({ + void ({ // @ts-expect-error Not assignable headers: {}, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ // @ts-expect-error Not assignable data: {}, headers: { baz: "", }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ // @ts-expect-error Not assignable pathParameters: {}, headers: { baz: "", }, - }); + } satisfies RequestType); } function ignoredTestRequestTypesWithQuery() { - expectAssignable>({ + void ({ data: { foo: "", }, @@ -105,58 +113,58 @@ function ignoredTestRequestTypesWithQuery() { queryParameters: { whut: "", }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ pathParameters: { bar: "" }, headers: { baz: "" }, queryParameters: { whut: "", }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ queryParameters: { whut: "", }, - }); + } satisfies RequestType); // @ts-expect-error Not assignable - expectAssignable>({}); - expectAssignable>({ + void ({} satisfies RequestType); + void ({ queryParameters: { // @ts-expect-error Not assignable whut: 42, }, - }); + } satisfies RequestType); - expectAssignable>({ + void ({ // @ts-expect-error Not assignable queryParameters: {}, - }); + } satisfies RequestType); } function ignoredTestAdditionalHeadersCanAlwaysBeSet() { - expectAssignable>({ + void ({ headers: { extra: true }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ headers: { extra: true }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ headers: { extra: true }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ data: { foo: "", }, headers: { extra: true }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ pathParameters: { bar: "", }, headers: { extra: true }, - }); - expectAssignable>({ + } satisfies RequestType); + void ({ headers: { extra: true, baz: "" }, - }); + } satisfies RequestType); } diff --git a/packages/commons/src/types/Response.test-types.ts b/packages/commons/src/types/Response.test-types.ts index e03a9a421..ea8632e6d 100644 --- a/packages/commons/src/types/Response.test-types.ts +++ b/packages/commons/src/types/Response.test-types.ts @@ -1,7 +1,33 @@ -import { expectAssignable, expectNotAssignable, expectType } from "tsd"; import { InternalAxiosRequestConfig } from "axios"; import { Response } from "./Response.js"; +/* + * Type-level tests, checked by `tsc --noEmit` (the `test:compile` target). + * + * `satisfies` asserts assignability the way a real call site sees it, i.e. + * including the excess-property checks that only apply to object literals + * passed into a typed position. `ExpectExact>` asserts exact type + * identity, which `satisfies` cannot express -- it would also accept a type + * that is merely assignable. Expected rejections are marked + * with `@ts-expect-error`. + */ + +/** + * Resolves to `true` only if both types are identical, not merely mutually + * assignable. The two deferred signatures are only related to each other when + * `TActual` and `TExpected` resolve identically, which is the one way plain + * TypeScript can express exactness. + */ +type Equals = + (() => T extends TActual ? 1 : 2) extends () => T extends TExpected + ? 1 + : 2 + ? true + : false; + +/** Fails to compile unless the `Equals<...>` handed to it resolved to `true`. */ +type ExpectExact = void; + type Response200 = Response<{ a: string }, 200, "application/json">; type Response200Text = Response<{ text: string }, 200, "text/plain">; @@ -12,54 +38,63 @@ const additionalAxiosResponseData = { mediaType: "application/json", } as const; -expectAssignable({ +void ({ data: { a: "" }, status: 200, ...additionalAxiosResponseData, -}); -expectNotAssignable({ - data: { a: "", extra: "!" }, +} satisfies Response200); +void ({ + data: { + a: "", + // @ts-expect-error Not assignable, `extra` is not part of the response data + extra: "!", + }, status: 200, ...additionalAxiosResponseData, -}); +} satisfies Response200); type Response201 = Response<{ b: string }, 201>; -expectAssignable({ +void ({ data: { b: "", }, status: 201, ...additionalAxiosResponseData, -}); +} satisfies Response201); type Response400 = Response; -expectAssignable({ +void ({ data: null, status: 400, ...additionalAxiosResponseData, -}); -expectNotAssignable({ +} satisfies Response400); +void ({ data: null, + // @ts-expect-error Not assignable, 42 is not the response status status: 42, ...additionalAxiosResponseData, -}); -expectNotAssignable({ +} satisfies Response400); +void ({ data: null, - status: 42, + status: 400, + // @ts-expect-error Not assignable, `extra` is not part of the response extra: "!", ...additionalAxiosResponseData, -}); -expectNotAssignable({ +} satisfies Response400); +void ({ + // @ts-expect-error Not assignable, the response carries no data data: { extraContent: "" }, status: 400, ...additionalAxiosResponseData, -}); +} satisfies Response400); function ignoredTestRequestTypesWithDataPathParameters() { type SomeResponse = Response200 | Response200Text | Response201 | Response400; const someResponse = {} as SomeResponse; - expectType<200 | 201 | 400>(someResponse.status); + type ignoredStatusIsExactlyTheDeclaredOnes = ExpectExact< + Equals + >; if (someResponse.status === 200) { // @ts-expect-error > a is not in data @@ -70,14 +105,20 @@ function ignoredTestRequestTypesWithDataPathParameters() { if (someResponse.mediaType === "text/plain") { // @ts-expect-error > a is not in data someResponse.data.a; - expectType(someResponse.data.text); + type ignoredTextIsString = ExpectExact< + Equals + >; } else { // @ts-expect-error > text is not in data someResponse.data.text; - expectType(someResponse.data.a); + type ignoredAIsString = ExpectExact< + Equals + >; } } else if (someResponse.status === 201) { - expectType(someResponse.data.b); + type ignoredBIsString = ExpectExact< + Equals + >; // @ts-expect-error > a is not in data someResponse.data.a; } diff --git a/packages/commons/src/types/assertStatus.test-types.ts b/packages/commons/src/types/assertStatus.test-types.ts index a9bcbaedb..e8eb35d35 100644 --- a/packages/commons/src/types/assertStatus.test-types.ts +++ b/packages/commons/src/types/assertStatus.test-types.ts @@ -1,7 +1,8 @@ -import { expectAssignable } from "tsd"; import { Response } from "./Response.js"; import assertStatus from "./assertStatus.js"; +/* Type-level tests, checked by `tsc --noEmit` (the `test:compile` target). */ + type Response200 = Response<{ a: string }, 200, "application/json">; type Response201 = Response<{ b: string }, 201>; @@ -10,7 +11,7 @@ declare const someResponse: SomeResponse; function ignoredTestAssertStatusAssertsAlsoTheCorrectResponseType() { assertStatus(someResponse, 200); - expectAssignable(someResponse); + void (someResponse satisfies Response200); // @ts-expect-error Not assignable - expectAssignable(someResponse); + void (someResponse satisfies Response201); } diff --git a/packages/commons/tsconfig.build.json b/packages/commons/tsconfig.build.json new file mode 100644 index 000000000..ec098e9e8 --- /dev/null +++ b/packages/commons/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "$comment": "Build-only config: keeps unit tests and type-level tests -- and the devDependencies they import -- out of the published output. Type checking of those files happens via the `test:compile` target, which uses ./tsconfig.json.", + "exclude": ["**/*.test.ts", "**/*.test-types.ts"], + "extends": "./tsconfig.json" +} diff --git a/packages/commons/tsconfig.json b/packages/commons/tsconfig.json index 3ebbf20c5..d9d3d2a84 100644 --- a/packages/commons/tsconfig.json +++ b/packages/commons/tsconfig.json @@ -4,7 +4,6 @@ "outDir": "./dist/esm", "rootDir": "./src" }, - "exclude": ["test-d/**/*", "*.test.ts"], "extends": "../../tsconfig.json", "include": ["src/**/*.ts"] } diff --git a/packages/models/package.json b/packages/models/package.json index 6b82c60aa..d60dbc844 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -31,7 +31,7 @@ "dist" ], "scripts": { - "build": "run build:clean && run tsc", + "build": "run build:clean && run tsc --project tsconfig.build.json", "build:clean": "rimraf dist", "lint": "run eslint .", "test": "", @@ -45,7 +45,6 @@ "dinero.js": "^1.9.1", "object-code": "^1.3.4", "polytype": "^0.17.0", - "tsd": "^0.31.2", "type-fest": "^4.30.0" }, "devDependencies": { diff --git a/packages/models/src/react/provideReact.test-types.ts b/packages/models/src/react/provideReact.test-types.ts index c300d01b0..b1fad42c6 100644 --- a/packages/models/src/react/provideReact.test-types.ts +++ b/packages/models/src/react/provideReact.test-types.ts @@ -1,5 +1,27 @@ import { provideReact } from "./provideReact.js"; -import { expectType } from "tsd"; + +/* + * Type-level tests, checked by `tsc --noEmit` (the `test:compile` target). + * `ExpectExact>` asserts exact type identity; a plain assignability + * check would also accept a wider or narrower type. Expected rejections are + * marked with `@ts-expect-error`. + */ + +/** + * Resolves to `true` only if both types are identical, not merely mutually + * assignable. The two deferred signatures are only related to each other when + * `TActual` and `TExpected` resolve identically, which is the one way plain + * TypeScript can express exactness. + */ +type Equals = + (() => T extends TActual ? 1 : 2) extends () => T extends TExpected + ? 1 + : 2 + ? true + : false; + +/** Fails to compile unless the `Equals<...>` handed to it resolved to `true`. */ +type ExpectExact = void; const reactProvided = provideReact( async (ignoredP1: string, ignoredP2?: boolean) => Promise.resolve("foo"), @@ -7,9 +29,11 @@ const reactProvided = provideReact( function ignoredTestReturnTypesOfProvideReact() { const usedValue = reactProvided.use("foo"); - const asAsyncResource = reactProvided.asResource("foo"); - expectType(usedValue); - expectType(asAsyncResource.use()); + const resourceValue = reactProvided.asResource("foo").use(); + type ignoredUsedValueIsString = ExpectExact>; + type ignoredResourceValueIsString = ExpectExact< + Equals + >; } function ignoredTestParameterTypesOfProvideReact() { diff --git a/packages/models/tsconfig.build.json b/packages/models/tsconfig.build.json new file mode 100644 index 000000000..ec098e9e8 --- /dev/null +++ b/packages/models/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "$comment": "Build-only config: keeps unit tests and type-level tests -- and the devDependencies they import -- out of the published output. Type checking of those files happens via the `test:compile` target, which uses ./tsconfig.json.", + "exclude": ["**/*.test.ts", "**/*.test-types.ts"], + "extends": "./tsconfig.json" +} diff --git a/packages/models/tsconfig.json b/packages/models/tsconfig.json index 3ebbf20c5..d9d3d2a84 100644 --- a/packages/models/tsconfig.json +++ b/packages/models/tsconfig.json @@ -4,7 +4,6 @@ "outDir": "./dist/esm", "rootDir": "./src" }, - "exclude": ["test-d/**/*", "*.test.ts"], "extends": "../../tsconfig.json", "include": ["src/**/*.ts"] } diff --git a/yarn.lock b/yarn.lock index 586f482dc..182035afc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1685,7 +1685,6 @@ __metadata: react: "npm:^18.3.1" rimraf: "npm:^5.0.10" ts-jest: "npm:^29.2.5" - tsd: "npm:^0.31.2" type-fest: "npm:^4.30.0" typescript: "npm:^5.7.2" peerDependencies: @@ -1820,7 +1819,6 @@ __metadata: react-dom: "npm:^18.3.1" rimraf: "npm:^5.0.10" ts-jest: "npm:^29.2.5" - tsd: "npm:^0.31.2" type-fest: "npm:^4.30.0" typescript: "npm:^5.7.2" peerDependencies: @@ -3039,13 +3037,6 @@ __metadata: languageName: node linkType: hard -"@tsd/typescript@npm:~5.4.3": - version: 5.4.5 - resolution: "@tsd/typescript@npm:5.4.5" - checksum: 10/d53a377d489c51737796ae0d65e8a5e118c6b9e2f860e017c68abec4f9bc8214652d4b51e345c230df0d2e40770f938ffa02c6342fd104566f9941c47cce4a9b - languageName: node - linkType: hard - "@tufjs/canonical-json@npm:2.0.0": version: 2.0.0 resolution: "@tufjs/canonical-json@npm:2.0.0" @@ -3181,23 +3172,6 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:^7.2.13": - version: 7.29.0 - resolution: "@types/eslint@npm:7.29.0" - dependencies: - "@types/estree": "npm:*" - "@types/json-schema": "npm:*" - checksum: 10/43e2de0ed1f0290ef9143cc379ffacc1053f415a46ed2b781c1f22c0d6e94c0ece8a9a23339b0903e519637d3d0ea6a006e16ef8dfa72f2758c7ba5025bca960 - languageName: node - linkType: hard - -"@types/estree@npm:*": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 - languageName: node - linkType: hard - "@types/graceful-fs@npm:^4.1.3": version: 4.1.6 resolution: "@types/graceful-fs@npm:4.1.6" @@ -3274,7 +3248,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15": +"@types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -3313,13 +3287,6 @@ __metadata: languageName: node linkType: hard -"@types/minimist@npm:^1.2.0": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: 10/b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d - languageName: node - linkType: hard - "@types/ms@npm:*": version: 0.7.34 resolution: "@types/ms@npm:0.7.34" @@ -3352,13 +3319,6 @@ __metadata: languageName: node linkType: hard -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: 10/e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 - languageName: node - linkType: hard - "@types/normalize-package-data@npm:^2.4.3, @types/normalize-package-data@npm:^2.4.4": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -4091,13 +4051,6 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 10/745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - "assert-plus@npm:^1.0.0": version: 1.0.0 resolution: "assert-plus@npm:1.0.0" @@ -4492,17 +4445,6 @@ __metadata: languageName: node linkType: hard -"camelcase-keys@npm:^6.2.2": - version: 6.2.2 - resolution: "camelcase-keys@npm:6.2.2" - dependencies: - camelcase: "npm:^5.3.1" - map-obj: "npm:^4.0.0" - quick-lru: "npm:^4.0.1" - checksum: 10/c1999f5b6d03bee7be9a36e48eef3da9e93e51b000677348ec8d15d51fc4418375890fb6c7155e387322d2ebb2a2cdebf9cd96607a6753d1d6c170d9b1e2eed5 - languageName: node - linkType: hard - "camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -5210,23 +5152,6 @@ __metadata: languageName: node linkType: hard -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" - dependencies: - decamelize: "npm:^1.1.0" - map-obj: "npm:^1.0.0" - checksum: 10/71d5898174f17a8d2303cecc98ba0236e842948c4d042a8180d5e749be8442220bca2d16dd93bebd7b49e86c807814273212e4da0fae67be7c58c282ff76057a - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10/ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - "decimal.js@npm:^10.4.2": version: 10.4.3 resolution: "decimal.js@npm:10.4.3" @@ -5781,22 +5706,6 @@ __metadata: languageName: node linkType: hard -"eslint-formatter-pretty@npm:^4.1.0": - version: 4.1.0 - resolution: "eslint-formatter-pretty@npm:4.1.0" - dependencies: - "@types/eslint": "npm:^7.2.13" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.1.0" - eslint-rule-docs: "npm:^1.1.5" - log-symbols: "npm:^4.0.0" - plur: "npm:^4.0.0" - string-width: "npm:^4.2.0" - supports-hyperlinks: "npm:^2.0.0" - checksum: 10/e8e0cd3843513fff32a70b036dd349fdab81d73b5e522f23685181c907a1faf2b2ebcae1688dc71d0fc026184011792f7e39b833d349df18fe2baea00d017901 - languageName: node - linkType: hard - "eslint-plugin-json@npm:^3.1.0": version: 3.1.0 resolution: "eslint-plugin-json@npm:3.1.0" @@ -5827,13 +5736,6 @@ __metadata: languageName: node linkType: hard -"eslint-rule-docs@npm:^1.1.5": - version: 1.1.235 - resolution: "eslint-rule-docs@npm:1.1.235" - checksum: 10/38af5ab724eb8108c7918826bc19f5e9902e39fc7fb018e9c6fe70f8a010fa3c3ea589a1527c53a68f2d41c4406db9195e042580a618a6d3027021abe5f4b014 - languageName: node - linkType: hard - "eslint-scope@npm:^7.2.2": version: 7.2.2 resolution: "eslint-scope@npm:7.2.2" @@ -6623,7 +6525,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.1, globby@npm:^11.1.0": +"globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -6709,13 +6611,6 @@ __metadata: languageName: node linkType: hard -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 10/7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -6769,22 +6664,6 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10/96da7d412303704af41c3819207a09ea2cab2de97951db4cf336bb8bce8d8e36b9a6821036ad2e55e67d3be0af8f967a7b57981203fbfb88bc05cd803407b8c3 - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: "npm:^6.0.0" - checksum: 10/4dc67022b7ecb12829966bd731fb9a5f14d351547aafc6520ef3c8e7211f4f0e69452d24e29eae3d9b17df924d660052e53d8ca321cf3008418fb7e6c7c47d6f - languageName: node - linkType: hard - "hosted-git-info@npm:^6.0.0": version: 6.1.1 resolution: "hosted-git-info@npm:6.1.1" @@ -7100,13 +6979,6 @@ __metadata: languageName: node linkType: hard -"irregular-plurals@npm:^3.2.0": - version: 3.5.0 - resolution: "irregular-plurals@npm:3.5.0" - checksum: 10/27f04e66402264b78251c03973dd4866aba58b851579b2f1870f3610494a163c20c5161a3eae8fdd49a61a5379ee611460a1781aadc891ce0203bcd7a52e4850 - languageName: node - linkType: hard - "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -7130,7 +7002,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1": version: 2.15.0 resolution: "is-core-module@npm:2.15.0" dependencies: @@ -7220,13 +7092,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 10/0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 - languageName: node - linkType: hard - "is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -7521,7 +7386,7 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^29.0.3, jest-diff@npm:^29.7.0": +"jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" dependencies: @@ -8123,7 +7988,7 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": +"kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 10/5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 @@ -8467,15 +8332,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10/fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 - languageName: node - linkType: hard - "lru-cache@npm:^7.5.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" @@ -8582,20 +8438,6 @@ __metadata: languageName: node linkType: hard -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 10/f8e6fc7f6137329c376c4524f6d25b3c243c17019bc8f621d15a2dcb855919e482a9298a78ae58b00dbd0e76b640bf6533aa343a9e993cfc16e0346a2507e7f8 - languageName: node - linkType: hard - -"map-obj@npm:^4.0.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: 10/fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e - languageName: node - linkType: hard - "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -8639,26 +8481,6 @@ __metadata: languageName: node linkType: hard -"meow@npm:^9.0.0": - version: 9.0.0 - resolution: "meow@npm:9.0.0" - dependencies: - "@types/minimist": "npm:^1.2.0" - camelcase-keys: "npm:^6.2.2" - decamelize: "npm:^1.2.0" - decamelize-keys: "npm:^1.1.0" - hard-rejection: "npm:^2.1.0" - minimist-options: "npm:4.1.0" - normalize-package-data: "npm:^3.0.0" - read-pkg-up: "npm:^7.0.1" - redent: "npm:^3.0.0" - trim-newlines: "npm:^3.0.0" - type-fest: "npm:^0.18.0" - yargs-parser: "npm:^20.2.3" - checksum: 10/3d0f199b9ccd81856a112f651290676f6816833626df53cee72b8e2c9acbd95beea4fa1f9fa729a553b5a0e74b18954f9fbc74c3ab837b3fc44e57de98f6c18f - languageName: node - linkType: hard - "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -9008,17 +8830,6 @@ __metadata: languageName: node linkType: hard -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" - dependencies: - arrify: "npm:^1.0.1" - is-plain-obj: "npm:^1.1.0" - kind-of: "npm:^6.0.3" - checksum: 10/8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e - languageName: node - linkType: hard - "minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -9351,30 +9162,6 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10/644f830a8bb9b7cc9bf2f6150618727659ee27cdd0840d1c1f97e8e6cab0803a098a2c19f31c6247ad9d3a0792e61521a13a6e8cd87cc6bb676e3150612c03d4 - languageName: node - linkType: hard - -"normalize-package-data@npm:^3.0.0": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: "npm:^4.0.1" - is-core-module: "npm:^2.5.0" - semver: "npm:^7.3.4" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10/3cd3b438c9c7b15d72ed2d1bbf0f8cc2d07bfe27702fc9e95d039f0af4e069dc75c0646e75068f9f9255a8aae64b59aa4fe2177e65787145fb996c3d38d48acb - languageName: node - linkType: hard - "normalize-package-data@npm:^5.0.0": version: 5.0.0 resolution: "normalize-package-data@npm:5.0.0" @@ -10419,15 +10206,6 @@ __metadata: languageName: node linkType: hard -"plur@npm:^4.0.0": - version: 4.0.0 - resolution: "plur@npm:4.0.0" - dependencies: - irregular-plurals: "npm:^3.2.0" - checksum: 10/fea2e903efca67cc5c7a8952fca3db46ae8d9e9353373b406714977e601a5d3b628bcb043c3ad2126c6ff0e73d8020bf43af30a72dd087eff1ec240eb13b90e1 - languageName: node - linkType: hard - "polytype@npm:^0.17.0": version: 0.17.0 resolution: "polytype@npm:0.17.0" @@ -10759,13 +10537,6 @@ __metadata: languageName: node linkType: hard -"quick-lru@npm:^4.0.1": - version: 4.0.1 - resolution: "quick-lru@npm:4.0.1" - checksum: 10/5c7c75f1c696750f619b165cc9957382f919e4207dabf04597a64f0298861391cdc5ee91a1dde1a5d460ecf7ee1af7fc36fef6d155bef2be66f05d43fd63d4f0 - languageName: node - linkType: hard - "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" @@ -10873,29 +10644,6 @@ __metadata: languageName: node linkType: hard -"read-pkg-up@npm:^7.0.0, read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: "npm:^4.1.0" - read-pkg: "npm:^5.2.0" - type-fest: "npm:^0.8.1" - checksum: 10/e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": "npm:^2.4.0" - normalize-package-data: "npm:^2.5.0" - parse-json: "npm:^5.0.0" - type-fest: "npm:^0.6.0" - checksum: 10/eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 - languageName: node - linkType: hard - "read-pkg@npm:^9.0.1": version: 9.0.1 resolution: "read-pkg@npm:9.0.1" @@ -11052,7 +10800,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.20.0": +"resolve@npm:^1.1.6, resolve@npm:^1.20.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -11065,7 +10813,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -11208,16 +10956,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10/fca14418a174d4b4ef1fecb32c5941e3412d52a4d3d85165924ce3a47fbc7073372c26faf7484ceb4bbc2bde25880c6b97e492473dc7e9708fdfb1c6a02d546e - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5 || 6 || 7, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": +"semver@npm:2 || 3 || 4 || 5 || 6 || 7, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -11805,7 +11544,7 @@ __metadata: languageName: node linkType: hard -"supports-hyperlinks@npm:^2.0.0, supports-hyperlinks@npm:^2.2.0": +"supports-hyperlinks@npm:^2.2.0": version: 2.3.0 resolution: "supports-hyperlinks@npm:2.3.0" dependencies: @@ -12041,13 +11780,6 @@ __metadata: languageName: node linkType: hard -"trim-newlines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-newlines@npm:3.0.1" - checksum: 10/b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 - languageName: node - linkType: hard - "ts-api-utils@npm:^1.3.0": version: 1.3.0 resolution: "ts-api-utils@npm:1.3.0" @@ -12105,23 +11837,6 @@ __metadata: languageName: node linkType: hard -"tsd@npm:^0.31.2": - version: 0.31.2 - resolution: "tsd@npm:0.31.2" - dependencies: - "@tsd/typescript": "npm:~5.4.3" - eslint-formatter-pretty: "npm:^4.1.0" - globby: "npm:^11.0.1" - jest-diff: "npm:^29.0.3" - meow: "npm:^9.0.0" - path-exists: "npm:^4.0.0" - read-pkg-up: "npm:^7.0.0" - bin: - tsd: dist/cli.js - checksum: 10/544995fc4c9a9d558da354420a4fb9b23bc0f3220a5f8011ca2e7a68086489e3edb738e59027100a5f6a983dc6da53fd9e03d97fd2a63d44af39c063537b626d - languageName: node - linkType: hard - "tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0": version: 2.6.3 resolution: "tslib@npm:2.6.3" @@ -12190,13 +11905,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.18.0": - version: 0.18.1 - resolution: "type-fest@npm:0.18.1" - checksum: 10/08844377058435c2b0e633ba01bab6102dba0ed63d85417d8e18feff265eed6f5c9f8f9a25d405ea9db88a41a569be73a3c4c0d4e29150bf89fb145bb23114a2 - languageName: node - linkType: hard - "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -12211,20 +11919,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: 10/9ecbf4ba279402b14c1a0614b6761bbe95626fab11377291fecd7e32b196109551e0350dcec6af74d97ced1b000ba8060a23eca33157091e642b409c2054ba82 - languageName: node - linkType: hard - -"type-fest@npm:^0.8.1": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: 10/fd4a91bfb706aeeb0d326ebd2e9a8ea5263979e5dec8d16c3e469a5bd3a946e014a062ef76c02e3086d3d1c7209a56a20a4caafd0e9f9a5c2ab975084ea3d388 - languageName: node - linkType: hard - "type-fest@npm:^2.5.1": version: 2.19.0 resolution: "type-fest@npm:2.19.0" @@ -12443,7 +12137,7 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4": +"validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" dependencies: @@ -12889,13 +12583,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.3": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 10/0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc - languageName: node - linkType: hard - "yargs-parser@npm:^22.0.0": version: 22.0.0 resolution: "yargs-parser@npm:22.0.0"