From f108e064c3ed170bf05da2a794e2706737e0cc6a Mon Sep 17 00:00:00 2001 From: Josh Humphries <2035234+jhump@users.noreply.github.com> Date: Tue, 16 Jun 2026 10:43:08 -0400 Subject: [PATCH 1/5] Migrate tests from jest to Node's built-in test runner Run tests with node:test via the tsx loader (matching protobuf-es), replacing jest + ts-jest. ts-jest ran transpile-only, so type errors in test files went unnoticed; add a tsc --noEmit typecheck step that covers the tests to close that gap. - Replace jest/ts-jest/@jest/globals with tsx. Rewrite test imports to node:test + node:assert/strict and convert every expect() matcher to assert. - Convert the 9 inline snapshots in gateway/service.test.ts to file-based node:test snapshots (committed service.test.ts.snapshot), and convert the toThrowErrorMatchingInlineSnapshot checks to assert.rejects. - Add tsconfig.test.json and a typecheck task wired into turbo and CI, covering src/**/*.ts (including tests). - Rename src/jest to src/testing now that jest is gone. --- .github/workflows/ci.yaml | 2 + package.json | 3 +- packages/eslint-config-custom/index.js | 7 +- packages/knit/eslint.config.mjs | 2 +- packages/knit/jest.config.js | 54 - packages/knit/package.json | 10 +- packages/knit/src/client.test.ts | 27 +- packages/knit/src/gateway/gateway.test.ts | 27 +- packages/knit/src/gateway/headers.test.ts | 21 +- .../knit/src/gateway/json.scalar-zero.test.ts | 9 +- packages/knit/src/gateway/json.test.ts | 8 +- packages/knit/src/gateway/schema.test.ts | 12 +- packages/knit/src/gateway/service.test.ts | 1532 +---------- .../knit/src/gateway/service.test.ts.snapshot | 1450 ++++++++++ packages/knit/src/gateway/stitch.test.ts | 12 +- packages/knit/src/json.test.ts | 60 +- packages/knit/src/oneof.test.ts | 2 +- packages/knit/src/protocol.test.ts | 35 +- packages/knit/src/schema.test.ts | 4 +- packages/knit/src/scope.test.ts | 7 +- packages/knit/src/{jest => testing}/util.ts | 0 packages/knit/tsconfig.test.json | 8 + pnpm-lock.yaml | 2389 +---------------- turbo.json | 6 +- 24 files changed, 1686 insertions(+), 4001 deletions(-) delete mode 100644 packages/knit/jest.config.js create mode 100644 packages/knit/src/gateway/service.test.ts.snapshot rename packages/knit/src/{jest => testing}/util.ts (100%) create mode 100644 packages/knit/tsconfig.test.json diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1426d0c9..51a8cf91 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,6 +14,8 @@ jobs: uses: ./.github/actions/setup - name: lint run: pnpm run lint + - name: typecheck + run: pnpm run typecheck test: runs-on: ubuntu-latest steps: diff --git a/package.json b/package.json index 0af298b3..7117a0df 100644 --- a/package.json +++ b/package.json @@ -12,15 +12,14 @@ "attw": "turbo run attw --no-daemon --cache-dir=.turbo", "test": "turbo run test --no-daemon --cache-dir=.turbo", "test:watch": "turbo run test:watch --no-daemon --cache-dir=.turbo", + "typecheck": "turbo run typecheck --no-daemon --cache-dir=.turbo", "buf:generate": "turbo run buf:generate --no-daemon --cache-dir=.turbo", "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, "devDependencies": { "@types/node": "^25.9.3", "eslint-config-custom": "workspace:*", - "jest": "^30.4.2", "prettier": "^3.8.4", - "ts-jest": "^29.4.11", "turbo": "^2.9.18", "typescript": "^6.0.3", "@arethetypeswrong/cli": "^0.18.3" diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js index f9ecf2e1..e34b9038 100644 --- a/packages/eslint-config-custom/index.js +++ b/packages/eslint-config-custom/index.js @@ -37,12 +37,7 @@ const licenseHeaderTemplate = readFileSync( const config = tseslint.config( // Global ignores (applied to all configs in the array). { - ignores: [ - "dist/**", - "node_modules/**", - "src/**/*.test.ts", - "jest.config.js", - ], + ignores: ["dist/**", "node_modules/**", "src/**/*.test.ts"], }, // Base JS rules — applied to all files. diff --git a/packages/knit/eslint.config.mjs b/packages/knit/eslint.config.mjs index 5218883c..e4c26550 100644 --- a/packages/knit/eslint.config.mjs +++ b/packages/knit/eslint.config.mjs @@ -17,6 +17,6 @@ import config from "eslint-config-custom"; export default [ ...config, { - ignores: ["src/jest/*.ts", "tsup.config.ts", "gateway.js"], + ignores: ["src/testing/*.ts", "tsup.config.ts", "gateway.js"], }, ]; diff --git a/packages/knit/jest.config.js b/packages/knit/jest.config.js deleted file mode 100644 index b1cd9a55..00000000 --- a/packages/knit/jest.config.js +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * For a detailed explanation regarding each configuration property and type check, visit: - * https://jestjs.io/docs/configuration - */ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -const config = { - // Indicates which provider should be used to instrument code for coverage - coverageProvider: "v8", - - // The root directory that Jest should scan for tests and modules within - rootDir: "src", - // Prettier 3 is not supported by jest's inline-snapshot writer; disable it so - // inline snapshots can be written/updated (jest formats them itself). - prettierPath: null, - moduleNameMapper: { - "(.+)\\.js": "$1", // https://connectrpc.com/docs/web/supported-browsers-and-frameworks/#jest - }, - extensionsToTreatAsEsm: [".ts"], - transform: { - "^.+\\.ts$": [ - "ts-jest", - { - useESM: true, - // ts-jest's ESM mode requires an ES/Node16 module kind. The shared - // tsconfig targets CommonJS for the published build, so override it - // here (the package is `type: module`). - tsconfig: { - module: "ESNext", - }, - diagnostics: { - ignoreCodes: [ - 151001, // ts-jest[config] (WARN) message TS151001: If you have issues related to imports, you should consider setting `esModuleInterop` to `true` in your TypeScript configuration file (usually `tsconfig.json`). See https://blogs.msdn.microsoft.com/typescript/2018/01/31/announcing-typescript-2-7/#easier-ecmascript-module-interoperability for more information. - ], - }, - }, - ], - }, -}; - -export default config; diff --git a/packages/knit/package.json b/packages/knit/package.json index a8174e91..5e2c35aa 100644 --- a/packages/knit/package.json +++ b/packages/knit/package.json @@ -14,8 +14,10 @@ "clean": "rm -rf ./dist/* .turbo/*", "lint": "eslint .", "attw": "attw --pack", - "test": "NODE_OPTIONS=--experimental-vm-modules ../../node_modules/.bin/jest", - "test:watch": "pnpm run build:esm+types --watch & pnpm run test --watchAll", + "typecheck": "tsc --noEmit -p tsconfig.test.json", + "test": "tsx --test $(find src -type f -path '*.test.ts')", + "test:watch": "tsx --watch --test $(find src -type f -path '*.test.ts')", + "test:update-snapshots": "tsx --test --test-update-snapshots $(find src -type f -path '*.test.ts')", "build:esm": "tsup --format esm", "build:cjs": "tsup --format cjs && mv ./dist/cjs/index.d.cts ./dist/cjs/index.d.ts && mv ./dist/cjs/gateway/index.d.cts ./dist/cjs/gateway/index.d.ts", "build": "pnpm run build:esm && pnpm run build:cjs" @@ -58,10 +60,10 @@ "devDependencies": { "@buf/bufbuild_knit.bufbuild_es": "2.12.0-20250213130123-9561c696fd69.1", "@bufbuild/knit-test-spec": "workspace:*", - "@jest/globals": "^30.4.1", "eslint-config-custom": "workspace:*", "tsconfig": "workspace:*", - "tsup": "^8.5.1" + "tsup": "^8.5.1", + "tsx": "^4.22.4" }, "files": [ "dist/**" diff --git a/packages/knit/src/client.test.ts b/packages/knit/src/client.test.ts index d024e676..5305d6b0 100644 --- a/packages/knit/src/client.test.ts +++ b/packages/knit/src/client.test.ts @@ -1,4 +1,5 @@ -import { describe, expect, test } from "@jest/globals"; +import { describe, test } from "node:test"; +import assert from "node:assert/strict"; import { createClientWithTransport } from "./client.js"; import { type HandlerContext, @@ -75,9 +76,9 @@ describe("client", () => { { requests }: { requests: KnitRequest[] }, { requestHeader }: HandlerContext, ): MessageInitShape => { - expect(requests).toHaveLength(1); - expect(toJson(ValueSchema, requests[0].body!)).toEqual(request); - expect(requestHeader.get(headerKey)).toEqual(headerValue); + assert.strictEqual(requests.length, 1); + assert.deepStrictEqual(toJson(ValueSchema, requests[0].body!), request); + assert.deepStrictEqual(requestHeader.get(headerKey), headerValue); return { responses: [ { @@ -97,12 +98,13 @@ describe("client", () => { { request: actualRequest }: ListenRequest, { requestHeader }: HandlerContext, ) { - expect(requestHeader.get(headerKey)).toEqual(headerValue); - expect( + assert.deepStrictEqual(requestHeader.get(headerKey), headerValue); + assert.deepStrictEqual( actualRequest?.body !== undefined ? toJson(ValueSchema, actualRequest.body) : undefined, - ).toEqual(request); + request, + ); for (let i = 0; i < 5; i++) { yield { response: { @@ -133,7 +135,7 @@ describe("client", () => { }, }, }); - expect(fetchResponse["spec.AllService"].getAll).toEqual(response); + assert.deepStrictEqual(fetchResponse["spec.AllService"].getAll, response); }); test("do", async () => { const fetchResponse = await client.do({ @@ -144,7 +146,10 @@ describe("client", () => { }, }, }); - expect(fetchResponse["spec.AllService"].createAll).toEqual(response); + assert.deepStrictEqual( + fetchResponse["spec.AllService"].createAll, + response, + ); }); test("listen", async () => { const listenResponse = client.listen({ @@ -157,9 +162,9 @@ describe("client", () => { }); let count = 0; for await (const next of listenResponse) { - expect(next["spec.AllService"].streamAll).toEqual(response); + assert.deepStrictEqual(next["spec.AllService"].streamAll, response); count++; } - expect(count).toBe(5); + assert.strictEqual(count, 5); }); }); diff --git a/packages/knit/src/gateway/gateway.test.ts b/packages/knit/src/gateway/gateway.test.ts index 965b512b..5cf34241 100644 --- a/packages/knit/src/gateway/gateway.test.ts +++ b/packages/knit/src/gateway/gateway.test.ts @@ -12,7 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { describe, test, expect } from "@jest/globals"; +import { describe, test } from "node:test"; +import assert from "node:assert/strict"; +import { isDeepStrictEqual } from "node:util"; import { createGateway } from "./gateway.js"; import { AllService, @@ -27,7 +29,8 @@ describe("service", () => { test("defaults to all supported methods", () => { const gateway = createGateway({ transport: {} as any }); gateway.service(AllService); - expect([...gateway.entryPoints.keys()].sort()).toEqual( + assert.deepStrictEqual( + [...gateway.entryPoints.keys()].sort(), [ "spec.AllService.GetAll", "spec.AllService.CreateAll", @@ -38,16 +41,19 @@ describe("service", () => { test("respects methods option", () => { const gateway = createGateway({ transport: {} as any }); gateway.service(AllService, { methods: ["getAll"] }); - expect([...gateway.entryPoints.keys()]).toEqual(["spec.AllService.GetAll"]); + assert.deepStrictEqual( + [...gateway.entryPoints.keys()], + ["spec.AllService.GetAll"], + ); }); test("respects transport override", () => { const gateway = createGateway({ transport: { kind: "base" } as any }); gateway.service(AllService, { transport: { kind: "override" } as any }); - expect( - [...gateway.entryPoints.values()].map((v) => v.transport), - ).toContainEqual({ - kind: "override", - }); + assert.ok( + [...gateway.entryPoints.values()] + .map((v) => v.transport) + .some((e) => isDeepStrictEqual(e, { kind: "override" })), + ); }); }); @@ -82,8 +88,9 @@ describe("relation", () => { .get(AllSchema.typeName) ?.get("rel_self") ?.resolver([base], undefined, {}); - expect(response).toHaveLength(1); - expect(toJson(AllSchema, response?.[0]! as All)).toEqual( + assert.strictEqual(response?.length, 1); + assert.deepStrictEqual( + toJson(AllSchema, response?.[0]! as All), toJson(AllSchema, base), ); }); diff --git a/packages/knit/src/gateway/headers.test.ts b/packages/knit/src/gateway/headers.test.ts index 2050064c..e1df72a0 100644 --- a/packages/knit/src/gateway/headers.test.ts +++ b/packages/knit/src/gateway/headers.test.ts @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { expect } from "@jest/globals"; -import { test, describe } from "@jest/globals"; +import { test, describe } from "node:test"; +import assert from "node:assert/strict"; import { makeOutboundHeader } from "./headers.js"; describe("well known headers", () => { @@ -34,9 +34,9 @@ describe("well known headers", () => { ]; for (const header of headers) { test(header, () => { - expect( - makeOutboundHeader(new Headers({ [header]: "foo" })).has(header), - ).toBeFalsy(); + assert.ok( + !makeOutboundHeader(new Headers({ [header]: "foo" })).has(header), + ); }); } }); @@ -46,17 +46,18 @@ describe("well known prefix", () => { for (const prefix of prefixes) { test(prefix, () => { const header = prefix + "-FOO"; - expect( - makeOutboundHeader(new Headers({ [header]: "foo" })).has(header), - ).toBeFalsy(); + assert.ok( + !makeOutboundHeader(new Headers({ [header]: "foo" })).has(header), + ); }); } }); test("Allow", () => { - expect( + assert.deepStrictEqual( makeOutboundHeader(new Headers({ Authorization: "foo" })).get( "Authorization", ), - ).toEqual("foo"); + "foo", + ); }); diff --git a/packages/knit/src/gateway/json.scalar-zero.test.ts b/packages/knit/src/gateway/json.scalar-zero.test.ts index d964f0de..52d2d167 100644 --- a/packages/knit/src/gateway/json.scalar-zero.test.ts +++ b/packages/knit/src/gateway/json.scalar-zero.test.ts @@ -19,7 +19,8 @@ import { } from "@bufbuild/knit-test-spec/spec/scalars_pb.js"; import { KeysSchema } from "@bufbuild/knit-test-spec/spec/map_pb.js"; import { create } from "@bufbuild/protobuf"; -import { test, expect } from "@jest/globals"; +import { test } from "node:test"; +import assert from "node:assert/strict"; import { formatMessage } from "./json.js"; import type { GatewaySchema, GatewaySchemaField } from "./schema.js"; @@ -56,7 +57,7 @@ test("repeated int32 emits a zero element", () => { false, undefined, )[0]; - expect(out).toEqual({ i32: [0, 1, 2] }); + assert.deepStrictEqual(out, { i32: [0, 1, 2] }); }); test("map emits an empty-string (zero) value", () => { @@ -89,7 +90,7 @@ test("map emits an empty-string (zero) value", () => { false, undefined, )[0]; - expect(out).toEqual({ str: { a: "", b: "x" } }); + assert.deepStrictEqual(out, { str: { a: "", b: "x" } }); }); test("unset optional int64 singular field is omitted, not a crash", () => { @@ -116,5 +117,5 @@ test("unset optional int64 singular field is omitted, not a crash", () => { false, undefined, )[0]; - expect(out).toEqual({}); + assert.deepStrictEqual(out, {}); }); diff --git a/packages/knit/src/gateway/json.test.ts b/packages/knit/src/gateway/json.test.ts index 52ec832d..cc0cc9ce 100644 --- a/packages/knit/src/gateway/json.test.ts +++ b/packages/knit/src/gateway/json.test.ts @@ -49,7 +49,8 @@ import { } from "@bufbuild/protobuf"; import { anyPack } from "@bufbuild/protobuf/wkt"; import { base64Encode } from "@bufbuild/protobuf/wire"; -import { test, expect, describe } from "@jest/globals"; +import { test, describe } from "node:test"; +import assert from "node:assert/strict"; import { formatMessage } from "./json.js"; import type { @@ -505,7 +506,7 @@ describe("valid", () => { const typeRegistry = createRegistry(BoolValueSchema); for (const testCase of testCases) { test(testCase.name, () => { - expect( + assert.deepStrictEqual( formatMessage( testCase.i, testCase.desc, @@ -514,7 +515,8 @@ describe("valid", () => { false, typeRegistry, )[0], - ).toEqual(testCase.o); + testCase.o, + ); }); } }); diff --git a/packages/knit/src/gateway/schema.test.ts b/packages/knit/src/gateway/schema.test.ts index 0d7d2658..79f45267 100644 --- a/packages/knit/src/gateway/schema.test.ts +++ b/packages/knit/src/gateway/schema.test.ts @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { describe, expect, test } from "@jest/globals"; +import { describe, test } from "node:test"; +import assert from "node:assert/strict"; import { computeSchema } from "./schema.js"; import type { GatewaySchema, @@ -344,7 +345,7 @@ describe("valid mask", () => { ]; for (const testCase of testCases) { test(testCase.name, () => { - expect( + assert.deepStrictEqual( create( SchemaSchema, computeSchema( @@ -356,7 +357,8 @@ describe("valid mask", () => { [], ), ), - ).toEqual(create(SchemaSchema, testCase.schema)); + create(SchemaSchema, testCase.schema), + ); }); } }); @@ -380,7 +382,7 @@ describe("invalid mask", () => { ]; for (const testCase of testCases) { test(testCase.name, () => { - expect(() => + assert.throws(() => computeSchema( testCase.message, testCase.mask.map((m) => create(MaskFieldSchema, m)), @@ -389,7 +391,7 @@ describe("invalid mask", () => { new Map(), [], ), - ).toThrow(); + ); }); } }); diff --git a/packages/knit/src/gateway/service.test.ts b/packages/knit/src/gateway/service.test.ts index 05ff51c2..6fc7add6 100644 --- a/packages/knit/src/gateway/service.test.ts +++ b/packages/knit/src/gateway/service.test.ts @@ -19,7 +19,8 @@ import { createClient, createRouterTransport, } from "@connectrpc/connect"; -import { describe, expect, test } from "@jest/globals"; +import { describe, test } from "node:test"; +import assert from "node:assert/strict"; import { createKnitService } from "./service.js"; import { AllService, AllSchema } from "@bufbuild/knit-test-spec/spec/all_pb.js"; import { AllResolverService } from "@bufbuild/knit-test-spec/spec/relations_pb.js"; @@ -97,7 +98,7 @@ describe("success", () => { }); }), ); - test("fetch", async () => { + test("fetch", async (t) => { const response = await knitClient.fetch({ requests: [ { @@ -106,214 +107,9 @@ describe("success", () => { }, ], }); - expect(response).toMatchInlineSnapshot(` -{ - "$typeName": "buf.knit.gateway.v1alpha1.FetchResponse", - "responses": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "relSelfParam": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "scalars": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "fields": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "str": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "scalars": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "fields": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "str": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.GetAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - ], -} -`); + t.assert.snapshot(response); }); - test("do", async () => { + test("do", async (t) => { const response = await knitClient.do({ requests: [ { @@ -322,214 +118,9 @@ describe("success", () => { }, ], }); - expect(response).toMatchInlineSnapshot(` -{ - "$typeName": "buf.knit.gateway.v1alpha1.DoResponse", - "responses": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "relSelfParam": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "scalars": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "fields": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "str": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "scalars": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "fields": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "str": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.CreateAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - ], -} -`); + t.assert.snapshot(response); }); - test("listen", async () => { + test("listen", async (t) => { const listenResponse = knitClient.listen({ request: { method: `${AllService.typeName}.${AllService.method.streamAll.name}`, @@ -540,215 +131,15 @@ describe("success", () => { let lastResponse: ListenResponse["response"]; for await (const response of listenResponse) { if (count == 0) { - expect(response.response).toMatchInlineSnapshot(` -{ - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "relSelfParam": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "scalars": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "fields": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "str": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "scalars": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "fields": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "str": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.StreamAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, -} -`); + t.assert.snapshot(response.response); delete response.response?.schema; lastResponse = response.response; } else { - expect(response.response).toEqual(lastResponse); + assert.deepStrictEqual(response.response, lastResponse); } count++; } - expect(count).toBe(5); + assert.strictEqual(count, 5); }); }); @@ -776,8 +167,8 @@ describe("errors", () => { }), ); describe("fetch", () => { - test("default", async () => { - await expect( + test("default", async (t) => { + await assert.rejects( knitClient.fetch({ requests: [ { @@ -786,11 +177,10 @@ describe("errors", () => { }, ], }), - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"[failed_precondition] Relation error"`, + { message: "[failed_precondition] Relation error" }, ); }); - test("catch-source", async () => { + test("catch-source", async (t) => { const response = await knitClient.fetch({ requests: [ { @@ -806,101 +196,9 @@ describe("errors", () => { }, ], }); - expect(response.responses).toMatchInlineSnapshot(` -[ - { - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "relSelfParam": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "[@error]": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": {}, - }, - }, - }, - "code": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "FAILED_PRECONDITION", - }, - }, - "details": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "listValue", - "value": { - "$typeName": "google.protobuf.ListValue", - "values": [], - }, - }, - }, - "message": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "[failed_precondition] Relation error", - }, - }, - "path": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.GetAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, -] -`); + t.assert.snapshot(response.responses); }); - test("catch-entrypoint", async () => { + test("catch-entrypoint", async (t) => { const response = await knitClient.fetch({ requests: [ { @@ -910,185 +208,11 @@ describe("errors", () => { }, ], }); - expect(response.responses).toMatchInlineSnapshot(` -[ - { - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "[@error]": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": {}, - }, - }, - }, - "code": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "FAILED_PRECONDITION", - }, - }, - "details": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "listValue", - "value": { - "$typeName": "google.protobuf.ListValue", - "values": [], - }, - }, - }, - "message": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "[failed_precondition] Relation error", - }, - }, - "path": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "", - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.GetAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, -] -`); + t.assert.snapshot(response.responses); }); }); describe("do", () => { - test("default", async () => { + test("default", async (t) => { const response = await knitClient.do({ requests: [ { @@ -1097,223 +221,9 @@ describe("errors", () => { }, ], }); - expect(response.responses).toMatchInlineSnapshot(` -[ - { - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "relSelfParam": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "[@error]": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": {}, - }, - }, - }, - "code": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "FAILED_PRECONDITION", - }, - }, - "details": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "listValue", - "value": { - "$typeName": "google.protobuf.ListValue", - "values": [], - }, - }, - }, - "message": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "[failed_precondition] Relation error", - }, - }, - "path": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "", - }, - }, - }, - }, - }, - }, - "scalars": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "fields": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "str": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "foo", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.CreateAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, -] -`); + t.assert.snapshot(response.responses); }); - test("throw-source", async () => { + test("throw-source", async (t) => { const response = await knitClient.do({ requests: [ { @@ -1329,91 +239,10 @@ describe("errors", () => { }, ], }); - expect(response.responses).toMatchInlineSnapshot(` -[ - { - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "[@error]": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": {}, - }, - }, - }, - "code": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "FAILED_PRECONDITION", - }, - }, - "details": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "listValue", - "value": { - "$typeName": "google.protobuf.ListValue", - "values": [], - }, - }, - }, - "message": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "[failed_precondition] Relation error", - }, - }, - "path": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "", - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.CreateAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, -] -`); + t.assert.snapshot(response.responses); }); - test("throw-all", async () => { - await expect( + test("throw-all", async (t) => { + await assert.rejects( knitClient.do({ requests: [ { @@ -1430,28 +259,28 @@ describe("errors", () => { }, ], }), - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"[failed_precondition] Relation error"`, + { message: "[failed_precondition] Relation error" }, ); }); }); describe("listen", () => { - test("default", async () => { - await expect(async () => { - const response = knitClient.listen({ - request: { - method: `${AllService.typeName}.${AllService.method.streamAll.name}`, - ...sharedRequest, - }, - }); - for await (const next of response) { - expect(next).toBe(true); // This must never be called. - } - }).rejects.toThrowErrorMatchingInlineSnapshot( - `"[failed_precondition] Relation error"`, + test("default", async (t) => { + await assert.rejects( + async () => { + const response = knitClient.listen({ + request: { + method: `${AllService.typeName}.${AllService.method.streamAll.name}`, + ...sharedRequest, + }, + }); + for await (const next of response) { + assert.fail(`listen must not yield a response: ${String(next)}`); + } + }, + { message: "[failed_precondition] Relation error" }, ); }); - test("catch-source", async () => { + test("catch-source", async (t) => { const response = await knitClient.listen({ request: { method: `${AllService.typeName}.${AllService.method.streamAll.name}`, @@ -1469,107 +298,17 @@ describe("errors", () => { let last: ListenResponse["response"]; for await (const next of response) { if (count == 0) { - expect(next.response).toMatchInlineSnapshot(` -{ - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "relSelfParam": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "[@error]": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": {}, - }, - }, - }, - "code": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "FAILED_PRECONDITION", - }, - }, - "details": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "listValue", - "value": { - "$typeName": "google.protobuf.ListValue", - "values": [], - }, - }, - }, - "message": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "[failed_precondition] Relation error", - }, - }, - "path": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.StreamAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, -} -`); + t.assert.snapshot(next.response); delete next.response?.schema; last = next.response; } else { - expect(next.response).toEqual(last); + assert.deepStrictEqual(next.response, last); } count++; } - expect(count).toEqual(5); + assert.strictEqual(count, 5); }); - test("catch-entrypoint", async () => { + test("catch-entrypoint", async (t) => { const response = await knitClient.listen({ request: { method: `${AllService.typeName}.${AllService.method.streamAll.name}`, @@ -1581,187 +320,15 @@ describe("errors", () => { let last: ListenResponse["response"]; for await (const next of response) { if (count == 0) { - expect(next.response).toMatchInlineSnapshot(` -{ - "$typeName": "buf.knit.gateway.v1alpha1.Response", - "body": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": { - "[@error]": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "structValue", - "value": { - "$typeName": "google.protobuf.Struct", - "fields": {}, - }, - }, - }, - "code": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "FAILED_PRECONDITION", - }, - }, - "details": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "listValue", - "value": { - "$typeName": "google.protobuf.ListValue", - "values": [], - }, - }, - }, - "message": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "[failed_precondition] Relation error", - }, - }, - "path": { - "$typeName": "google.protobuf.Value", - "kind": { - "case": "stringValue", - "value": "", - }, - }, - }, - }, - }, - }, - "method": "spec.AllService.StreamAll", - "schema": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "relSelfParam", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "scalars", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "fields", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "message", - "value": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema", - "fields": [ - { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", - "jsonName": "", - "name": "str", - "type": { - "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", - "value": { - "case": "scalar", - "value": 9, - }, - }, - }, - ], - "name": "spec.ScalarFields", - }, - }, - }, - }, - ], - "name": "spec.Scalar", - }, - }, - }, - }, - ], - "name": "spec.All", - }, - }, - }, - }, - ], - "name": "spec.All", - }, -} -`); + t.assert.snapshot(next.response); delete next.response?.schema; last = next.response; } else { - expect(next.response).toEqual(last); + assert.deepStrictEqual(next.response, last); } count++; } - expect(count).toEqual(5); + assert.strictEqual(count, 5); }); }); }); @@ -1799,15 +366,16 @@ function createKnitClient(transport: Transport) { } function expectCustomHeader(headers: Headers) { - expect(headers.get("Custom-Header")).toEqual("Custom-Value"); + assert.strictEqual(headers.get("Custom-Header"), "Custom-Value"); } function expectOperation(headers: Headers, operation: string) { // Multiple headers with same key are combined into one by joining them using `, ` const operations = headers.get("Knit-Operations")?.split(", "); try { - expect(operations?.[operations?.length - 1]).toEqual(operation); - expect(operations?.[0]).toMatch( + assert.strictEqual(operations?.[operations?.length - 1], operation); + assert.match( + operations?.[0] ?? "", /buf\.knit\.gateway\.v1alpha1\.KnitService\.(Fetch)|(Do)|(Listen)/, ); } catch (err) { diff --git a/packages/knit/src/gateway/service.test.ts.snapshot b/packages/knit/src/gateway/service.test.ts.snapshot new file mode 100644 index 00000000..b9717773 --- /dev/null +++ b/packages/knit/src/gateway/service.test.ts.snapshot @@ -0,0 +1,1450 @@ +exports[`errors > do > default 1`] = ` +[ + { + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.CreateAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "scalars": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "fields": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "str": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "foo" + } + } + } + } + } + } + } + } + } + }, + "relSelfParam": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "[@error]": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": {} + } + } + }, + "code": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "FAILED_PRECONDITION" + } + }, + "message": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "[failed_precondition] Relation error" + } + }, + "details": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "listValue", + "value": { + "$typeName": "google.protobuf.ListValue", + "values": [] + } + } + }, + "path": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "" + } + } + } + } + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } +] +`; + +exports[`errors > do > throw-source 1`] = ` +[ + { + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.CreateAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "[@error]": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": {} + } + } + }, + "code": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "FAILED_PRECONDITION" + } + }, + "message": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "[failed_precondition] Relation error" + } + }, + "details": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "listValue", + "value": { + "$typeName": "google.protobuf.ListValue", + "values": [] + } + } + }, + "path": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "" + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [] + } + } + } + } + ] + } + } +] +`; + +exports[`errors > fetch > catch-entrypoint 1`] = ` +[ + { + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.GetAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "[@error]": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": {} + } + } + }, + "code": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "FAILED_PRECONDITION" + } + }, + "message": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "[failed_precondition] Relation error" + } + }, + "details": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "listValue", + "value": { + "$typeName": "google.protobuf.ListValue", + "values": [] + } + } + }, + "path": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "" + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } +] +`; + +exports[`errors > fetch > catch-source 1`] = ` +[ + { + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.GetAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "relSelfParam": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "[@error]": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": {} + } + } + }, + "code": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "FAILED_PRECONDITION" + } + }, + "message": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "[failed_precondition] Relation error" + } + }, + "details": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "listValue", + "value": { + "$typeName": "google.protobuf.ListValue", + "values": [] + } + } + }, + "path": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "" + } + } + } + } + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [] + } + } + } + } + ] + } + } +] +`; + +exports[`errors > listen > catch-entrypoint 1`] = ` +{ + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.StreamAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "[@error]": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": {} + } + } + }, + "code": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "FAILED_PRECONDITION" + } + }, + "message": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "[failed_precondition] Relation error" + } + }, + "details": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "listValue", + "value": { + "$typeName": "google.protobuf.ListValue", + "values": [] + } + } + }, + "path": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "" + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } +} +`; + +exports[`errors > listen > catch-source 1`] = ` +{ + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.StreamAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "relSelfParam": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "[@error]": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": {} + } + } + }, + "code": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "FAILED_PRECONDITION" + } + }, + "message": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "[failed_precondition] Relation error" + } + }, + "details": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "listValue", + "value": { + "$typeName": "google.protobuf.ListValue", + "values": [] + } + } + }, + "path": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "" + } + } + } + } + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [] + } + } + } + } + ] + } +} +`; + +exports[`success > do 1`] = ` +{ + "$typeName": "buf.knit.gateway.v1alpha1.DoResponse", + "responses": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.CreateAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "scalars": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "fields": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "str": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "foo" + } + } + } + } + } + } + } + } + } + }, + "relSelfParam": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "scalars": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "fields": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "str": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "foo" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + ] +} +`; + +exports[`success > fetch 1`] = ` +{ + "$typeName": "buf.knit.gateway.v1alpha1.FetchResponse", + "responses": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.GetAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "scalars": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "fields": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "str": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "foo" + } + } + } + } + } + } + } + } + } + }, + "relSelfParam": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "scalars": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "fields": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "str": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "foo" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + ] +} +`; + +exports[`success > listen 1`] = ` +{ + "$typeName": "buf.knit.gateway.v1alpha1.Response", + "method": "spec.AllService.StreamAll", + "body": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "scalars": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "fields": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "str": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "foo" + } + } + } + } + } + } + } + } + } + }, + "relSelfParam": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "scalars": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "fields": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "structValue", + "value": { + "$typeName": "google.protobuf.Struct", + "fields": { + "str": { + "$typeName": "google.protobuf.Value", + "kind": { + "case": "stringValue", + "value": "foo" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "schema": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "relSelfParam", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.All", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "scalars", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.Scalar", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "fields", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "message", + "value": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema", + "name": "spec.ScalarFields", + "fields": [ + { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field", + "name": "str", + "jsonName": "", + "type": { + "$typeName": "buf.knit.gateway.v1alpha1.Schema.Field.Type", + "value": { + "case": "scalar", + "value": 9 + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } +} +`; diff --git a/packages/knit/src/gateway/stitch.test.ts b/packages/knit/src/gateway/stitch.test.ts index 3f7bd815..0cd4f826 100644 --- a/packages/knit/src/gateway/stitch.test.ts +++ b/packages/knit/src/gateway/stitch.test.ts @@ -1,4 +1,5 @@ -import { expect, test } from "@jest/globals"; +import { test } from "node:test"; +import assert from "node:assert/strict"; import { stitch } from "./stitch.js"; import type { Patch } from "./json.js"; import { AllSchema } from "@bufbuild/knit-test-spec/spec/all_pb.js"; @@ -14,7 +15,7 @@ test("stitch", async () => { GetAllRelSelfParamResponse_AllParamResultSchema.fields.find( (f) => f.number === 1, )!; - expect(relationFieldInfo).toBeDefined(); + assert.ok(relationFieldInfo !== undefined); const target = {}; const params = { scalars: { fields: { str: "param" } } }; const relation = { @@ -22,9 +23,10 @@ test("stitch", async () => { base: AllSchema, method: "", resolver: async (bases, gotParams) => { - expect( + assert.deepStrictEqual( toJson(AllSchema, gotParams as MessageShape), - ).toEqual(params); + params, + ); return Array(bases.length).fill(create(AllSchema, {})); }, } satisfies Relation; @@ -74,7 +76,7 @@ test("stitch", async () => { }, } satisfies Patch; await stitch([patch], false, undefined, {}); - expect(target).toEqual({ + assert.deepStrictEqual(target, { [localName]: { [localName]: {}, }, diff --git a/packages/knit/src/json.test.ts b/packages/knit/src/json.test.ts index 141b965f..58de9a27 100644 --- a/packages/knit/src/json.test.ts +++ b/packages/knit/src/json.test.ts @@ -21,7 +21,8 @@ import { } from "@bufbuild/protobuf"; import { BoolValueSchema, ValueSchema } from "@bufbuild/protobuf/wkt"; import { base64Encode } from "@bufbuild/protobuf/wire"; -import { describe, expect, test } from "@jest/globals"; +import { describe, test } from "node:test"; +import assert from "node:assert/strict"; import { alias } from "./alias.js"; import { Error_Code, @@ -133,10 +134,11 @@ describe("format", () => { ]; const check = (i: unknown, o: unknown) => { const formattedValue = format(i); - expect(JSON.parse(JSON.stringify(formattedValue))).toStrictEqual(o); - expect( + assert.deepStrictEqual(JSON.parse(JSON.stringify(formattedValue)), o); + assert.deepStrictEqual( toJson(ValueSchema, fromJson(ValueSchema, formattedValue)), - ).toStrictEqual(o); + o, + ); }; for (const testCase of testCases) { test(testCase.name, () => { @@ -163,10 +165,10 @@ describe("format", () => { }); describe("function or symbol", () => { test("throws on function", () => { - expect(() => format(() => null)).toThrow(); + assert.throws(() => format(() => null)); }); test("throws on symbol", () => { - expect(() => format(Symbol("some"))).toThrow(); + assert.throws(() => format(Symbol("some"))); }); }); }); @@ -346,15 +348,15 @@ describe("decode", () => { for (const testCase of testCases) { test(testCase.name, () => { const result = decodeMessage({}, testCase.i, testCase.s, ""); - expect(result).toStrictEqual(testCase.o); + assert.deepStrictEqual(result, testCase.o); }); test(testCase.name + "-null", () => { const result = decodeMessage({}, null, testCase.s, ""); - expect(result).toStrictEqual(undefined); + assert.deepStrictEqual(result, undefined); }); test(testCase.name + "-undefined", () => { const result = decodeMessage({}, undefined, testCase.s, ""); - expect(result).toStrictEqual(undefined); + assert.deepStrictEqual(result, undefined); }); test(testCase.name + "-repeated", () => { const result = decodeMessage( @@ -380,7 +382,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ key: [testCase.o] }); + assert.deepStrictEqual(result, { key: [testCase.o] }); }); test(testCase.name + "-map", () => { const result = decodeMessage( @@ -406,7 +408,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ key: { mapKey: testCase.o } }); + assert.deepStrictEqual(result, { key: { mapKey: testCase.o } }); }); test(testCase.name + "-message", () => { const result = decodeMessage( @@ -449,7 +451,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ + assert.deepStrictEqual(result, { key: { key: testCase.o, customJson: testCase.o }, }); }); @@ -484,7 +486,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ + assert.deepStrictEqual(result, { key: { oneofKey: { "@case": "key", value: testCase.o } }, }); }); @@ -649,17 +651,17 @@ describe("decode", () => { }); test(testCase.name, () => { const result = decodeMessage({}, i, s, ""); - expect(result).toStrictEqual(o); + assert.deepStrictEqual(result, o); }); if (testCase.s !== Schema_Field_Type_ScalarType.NULL) { test(testCase.name + "-null", () => { const result = decodeMessage({}, { key: null }, s, ""); - expect(result).toStrictEqual({}); + assert.deepStrictEqual(result, {}); }); } test(testCase.name + "-undefined", () => { const result = decodeMessage({}, {}, s, ""); - expect(result).toStrictEqual({}); + assert.deepStrictEqual(result, {}); }); test(testCase.name + "-repeated", () => { const result = decodeMessage( @@ -685,7 +687,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ key: [testCase.o] }); + assert.deepStrictEqual(result, { key: [testCase.o] }); }); test(testCase.name + "-map", () => { const result = decodeMessage( @@ -711,7 +713,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ key: { mapKey: testCase.o } }); + assert.deepStrictEqual(result, { key: { mapKey: testCase.o } }); }); test(testCase.name + "-message", () => { const result = decodeMessage( @@ -754,7 +756,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ + assert.deepStrictEqual(result, { key: { key: testCase.o, customJson: testCase.o }, }); }); @@ -789,7 +791,7 @@ describe("decode", () => { }), "", ); - expect(result).toStrictEqual({ + assert.deepStrictEqual(result, { key: { oneofKey: { "@case": "key", value: testCase.o } }, }); }); @@ -821,10 +823,10 @@ describe("decode", () => { }), "", ); - expect(result).toBeInstanceOf(KnitError); - expect(result).toHaveProperty("code", Error_Code.INVALID_ARGUMENT); - expect(result).toHaveProperty("message", "invalid"); - expect(result).toHaveProperty("details", [ + assert.ok(result instanceof KnitError); + assert.deepStrictEqual(result.code, Error_Code.INVALID_ARGUMENT); + assert.deepStrictEqual(result.message, "invalid"); + assert.deepStrictEqual(result.details, [ { type: "google.protobuf.BoolValue", value: toBinary( @@ -834,7 +836,7 @@ describe("decode", () => { debug: true, }, ]); - expect(result).toHaveProperty("path", "some.path"); + assert.deepStrictEqual(result.path, "some.path"); }); test("repeated oneof", () => { @@ -945,8 +947,8 @@ describe("decode", () => { "", ) as any; - expect(result.key1[0].key2.item["@case"]).toBe("opt1"); - expect(result.key1[0].key2.item.value).toStrictEqual({ value: 1 }); + assert.strictEqual(result.key1[0].key2.item["@case"], "opt1"); + assert.deepStrictEqual(result.key1[0].key2.item.value, { value: 1 }); }); test("mapped oneof", () => { @@ -1058,8 +1060,8 @@ describe("decode", () => { "", ) as any; - expect(result.key1["someId"].key2.item["@case"]).toBe("opt1"); - expect(result.key1["someId"].key2.item.value).toStrictEqual({ + assert.strictEqual(result.key1["someId"].key2.item["@case"], "opt1"); + assert.deepStrictEqual(result.key1["someId"].key2.item.value, { value: 1, }); }); diff --git a/packages/knit/src/oneof.test.ts b/packages/knit/src/oneof.test.ts index 83ab8ee3..c2bf1344 100644 --- a/packages/knit/src/oneof.test.ts +++ b/packages/knit/src/oneof.test.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { describe, test } from "@jest/globals"; +import { describe, test } from "node:test"; import type { Oneof } from "./oneof.js"; type Cases = { a: string; b: number }; diff --git a/packages/knit/src/protocol.test.ts b/packages/knit/src/protocol.test.ts index e102cea5..e75d5ff7 100644 --- a/packages/knit/src/protocol.test.ts +++ b/packages/knit/src/protocol.test.ts @@ -15,7 +15,8 @@ import { fromJson } from "@bufbuild/protobuf"; import type { MessageInitShape } from "@bufbuild/protobuf"; import { ValueSchema } from "@bufbuild/protobuf/wkt"; -import { describe, expect, test } from "@jest/globals"; +import { describe, test } from "node:test"; +import assert from "node:assert/strict"; import { RequestSchema } from "@buf/bufbuild_knit.bufbuild_es/buf/knit/gateway/v1alpha1/knit_pb.js"; import { makeRequests } from "./protocol.js"; @@ -30,7 +31,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: undefined, @@ -47,7 +48,7 @@ describe("makeRequests", () => { ], }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([{}]); + assert.deepStrictEqual(oneofs, [{}]); }); test("single query with catch", () => { const [requests, oneofs] = makeRequests({ @@ -61,7 +62,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: undefined, @@ -78,7 +79,7 @@ describe("makeRequests", () => { onError: { case: "catch", value: {} }, }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([{}]); + assert.deepStrictEqual(oneofs, [{}]); }); test("single query with throw", () => { const [requests, oneofs] = makeRequests({ @@ -92,7 +93,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: undefined, @@ -109,7 +110,7 @@ describe("makeRequests", () => { onError: { case: "throw", value: {} }, }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([{}]); + assert.deepStrictEqual(oneofs, [{}]); }); test("single query skip params", () => { const [requests, oneofs] = makeRequests({ @@ -122,7 +123,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: fromJson(ValueSchema, {}), @@ -139,7 +140,7 @@ describe("makeRequests", () => { ], }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([{}]); + assert.deepStrictEqual(oneofs, [{}]); }); test("single query with scalar oneof", () => { const [requests, oneofs] = makeRequests({ @@ -156,7 +157,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: undefined, @@ -174,7 +175,7 @@ describe("makeRequests", () => { ], }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([ + assert.deepStrictEqual(oneofs, [ { "foo.v1.FooService.getFoo.foo.a": "oneofField", "foo.v1.FooService.getFoo.foo.b": "oneofField", @@ -198,7 +199,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: undefined, @@ -228,7 +229,7 @@ describe("makeRequests", () => { ], }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([ + assert.deepStrictEqual(oneofs, [ { "foo.v1.FooService.getFoo.foo.a": "oneofField", "foo.v1.FooService.getFoo.foo.b": "oneofField", @@ -257,7 +258,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: undefined, @@ -293,7 +294,7 @@ describe("makeRequests", () => { ], }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([ + assert.deepStrictEqual(oneofs, [ { "foo.v1.FooService.getFoo.foo.a": "oneofField", "foo.v1.FooService.getFoo.foo.a.p": "subOneof", @@ -324,7 +325,7 @@ describe("makeRequests", () => { }, }, }); - expect(requests).toStrictEqual([ + assert.deepStrictEqual(requests, [ { method: "foo.v1.FooService.GetFoo", body: undefined, @@ -358,7 +359,7 @@ describe("makeRequests", () => { ], }, ] satisfies MessageInitShape[]); - expect(oneofs).toStrictEqual([ + assert.deepStrictEqual(oneofs, [ { "foo.v1.FooService.getFoo.foo.a": "fooOneof", "foo.v1.FooService.getFoo.foo.b": "fooOneof", diff --git a/packages/knit/src/schema.test.ts b/packages/knit/src/schema.test.ts index 40fd2f20..421db663 100644 --- a/packages/knit/src/schema.test.ts +++ b/packages/knit/src/schema.test.ts @@ -18,8 +18,8 @@ import type { WktService, } from "@bufbuild/knit-test-spec/spec/wkt_knit.js"; import type { Map, MapEnum } from "@bufbuild/knit-test-spec/spec/map_knit.js"; -import { describe, test } from "@jest/globals"; -import { type DeepDiff, expectType } from "./jest/util.js"; +import { describe, test } from "node:test"; +import { type DeepDiff, expectType } from "./testing/util.js"; import { type Oneof } from "./oneof"; import type { Mask, Parameter, Query } from "./schema.js"; import type { Equal } from "./utils/types.js"; diff --git a/packages/knit/src/scope.test.ts b/packages/knit/src/scope.test.ts index c7c6ca54..7b9924a9 100644 --- a/packages/knit/src/scope.test.ts +++ b/packages/knit/src/scope.test.ts @@ -15,7 +15,8 @@ import type { AllService } from "@bufbuild/knit-test-spec/spec/all_knit.js"; import type { WktService } from "@bufbuild/knit-test-spec/spec/wkt_knit.js"; import type { SubService } from "@bufbuild/knit-test-spec/spec/sub/sub_knit.js"; -import { describe, expect, test } from "@jest/globals"; +import { describe, test } from "node:test"; +import assert from "node:assert/strict"; import type { Client } from "./client.js"; import { makeScopedClient } from "./scope.js"; @@ -44,7 +45,7 @@ describe("scope", () => { }, }, }); - expect(res).toStrictEqual({ + assert.deepStrictEqual(res, { SubService: { subMethod: { $: {}, @@ -66,7 +67,7 @@ describe("scope", () => { }, }, }); - expect(res).toStrictEqual({ + assert.deepStrictEqual(res, { AllService: { createAll: { $: {}, diff --git a/packages/knit/src/jest/util.ts b/packages/knit/src/testing/util.ts similarity index 100% rename from packages/knit/src/jest/util.ts rename to packages/knit/src/testing/util.ts diff --git a/packages/knit/tsconfig.test.json b/packages/knit/tsconfig.test.json new file mode 100644 index 00000000..21132aa1 --- /dev/null +++ b/packages/knit/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c98901f7..f39d5a43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,15 +13,9 @@ importers: eslint-config-custom: specifier: workspace:* version: link:packages/eslint-config-custom - jest: - specifier: ^30.4.2 - version: 30.4.2(@types/node@25.9.3) prettier: specifier: ^3.8.4 version: 3.8.4 - ts-jest: - specifier: ^29.4.11 - version: 29.4.11(@babel/core@7.29.7)(jest@30.4.2)(typescript@6.0.3) turbo: specifier: ^2.9.18 version: 2.9.18 @@ -78,9 +72,6 @@ importers: '@bufbuild/knit-test-spec': specifier: workspace:* version: link:../knit-test-spec - '@jest/globals': - specifier: ^30.4.1 - version: 30.4.1 eslint-config-custom: specifier: workspace:* version: link:../eslint-config-custom @@ -89,7 +80,10 @@ importers: version: link:../tsconfig tsup: specifier: ^8.5.1 - version: 8.5.1(typescript@6.0.3) + version: 8.5.1(tsx@4.22.4)(typescript@6.0.3) + tsx: + specifier: ^4.22.4 + version: 4.22.4 packages/knit-test-spec: devDependencies: @@ -169,325 +163,6 @@ packages: validate-npm-package-name: 5.0.1 dev: true - /@babel/code-frame@7.29.7: - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - dev: true - - /@babel/compat-data@7.29.7: - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.29.7: - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.29.7: - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - dev: true - - /@babel/helper-compilation-targets@7.29.7: - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-globals@7.29.7: - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-module-imports@7.29.7: - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7): - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-plugin-utils@7.29.7: - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-string-parser@7.29.7: - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.29.7: - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.29.7: - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.29.7: - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - dev: true - - /@babel/parser@7.29.7: - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.29.7 - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7): - resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7): - resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7): - resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - dev: true - - /@babel/template@7.29.7: - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - dev: true - - /@babel/traverse@7.29.7: - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.29.7: - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@braidai/lang@1.1.2: resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} dev: true @@ -631,31 +306,6 @@ packages: '@bufbuild/protobuf': 2.12.0 dev: false - /@emnapi/core@1.10.0: - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - requiresBuild: true - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - dev: true - optional: true - - /@emnapi/runtime@1.10.0: - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - requiresBuild: true - dependencies: - tslib: 2.8.1 - dev: true - optional: true - - /@emnapi/wasi-threads@1.2.1: - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - requiresBuild: true - dependencies: - tslib: 2.8.1 - dev: true - optional: true - /@esbuild/aix-ppc64@0.27.2: resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -1233,276 +883,6 @@ packages: engines: {node: '>=18.18'} dev: false - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.2 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.6: - resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} - engines: {node: '>=8'} - dev: true - - /@jest/console@30.4.1: - resolution: {integrity: sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - chalk: 4.1.2 - jest-message-util: 30.4.1 - jest-util: 30.4.1 - slash: 3.0.0 - dev: true - - /@jest/core@30.4.2: - resolution: {integrity: sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 30.4.1 - '@jest/pattern': 30.4.0 - '@jest/reporters': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 4.4.0 - exit-x: 0.2.2 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-changed-files: 30.4.1 - jest-config: 30.4.2(@types/node@25.9.3) - jest-haste-map: 30.4.1 - jest-message-util: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-resolve-dependencies: 30.4.2 - jest-runner: 30.4.2 - jest-runtime: 30.4.2 - jest-snapshot: 30.4.1 - jest-util: 30.4.1 - jest-validate: 30.4.1 - jest-watcher: 30.4.1 - pretty-format: 30.4.1 - slash: 3.0.0 - transitivePeerDependencies: - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - dev: true - - /@jest/diff-sequences@30.4.0: - resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dev: true - - /@jest/environment@30.4.1: - resolution: {integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/fake-timers': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - jest-mock: 30.4.1 - dev: true - - /@jest/expect-utils@30.4.1: - resolution: {integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/get-type': 30.1.0 - dev: true - - /@jest/expect@30.4.1: - resolution: {integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - expect: 30.4.1 - jest-snapshot: 30.4.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@30.4.1: - resolution: {integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/types': 30.4.1 - '@sinonjs/fake-timers': 15.4.0 - '@types/node': 25.9.3 - jest-message-util: 30.4.1 - jest-mock: 30.4.1 - jest-util: 30.4.1 - dev: true - - /@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} - dev: true - - /@jest/globals@30.4.1: - resolution: {integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/environment': 30.4.1 - '@jest/expect': 30.4.1 - '@jest/types': 30.4.1 - jest-mock: 30.4.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/pattern@30.4.0: - resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@types/node': 25.9.3 - jest-regex-util: 30.4.0 - dev: true - - /@jest/reporters@30.4.1: - resolution: {integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 25.9.3 - chalk: 4.1.2 - collect-v8-coverage: 1.0.3 - exit-x: 0.2.2 - glob: 10.5.0 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.5 - jest-message-util: 30.4.1 - jest-util: 30.4.1 - jest-worker: 30.4.1 - slash: 3.0.0 - string-length: 4.0.2 - v8-to-istanbul: 9.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@30.4.1: - resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@sinclair/typebox': 0.34.49 - dev: true - - /@jest/snapshot-utils@30.4.1: - resolution: {integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/types': 30.4.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - natural-compare: 1.4.0 - dev: true - - /@jest/source-map@30.0.1: - resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@30.4.1: - resolution: {integrity: sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/console': 30.4.1 - '@jest/types': 30.4.1 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.3 - dev: true - - /@jest/test-sequencer@30.4.1: - resolution: {integrity: sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/test-result': 30.4.1 - graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 - slash: 3.0.0 - dev: true - - /@jest/transform@30.4.1: - resolution: {integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@babel/core': 7.29.7 - '@jest/types': 30.4.1 - '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 7.0.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 - jest-regex-util: 30.4.0 - jest-util: 30.4.1 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@30.4.1: - resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/pattern': 30.4.0 - '@jest/schemas': 30.4.1 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 25.9.3 - '@types/yargs': 17.0.35 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.13: resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} dependencies: @@ -1510,13 +890,6 @@ packages: '@jridgewell/trace-mapping': 0.3.31 dev: true - /@jridgewell/remapping@2.3.5: - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - dev: true - /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1539,43 +912,18 @@ packages: '@braidai/lang': 1.1.2 dev: true - /@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): - resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} + /@rollup/rollup-android-arm-eabi@4.55.1: + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + cpu: [arm] + os: [android] requiresBuild: true - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 dev: true optional: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - - /@pkgr/core@0.3.6: - resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} - engines: {node: ^14.18.0 || >=16.0.0} - dev: true - - /@rollup/rollup-android-arm-eabi@4.55.1: - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.55.1: - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} - cpu: [arm64] - os: [android] + /@rollup/rollup-android-arm64@4.55.1: + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + cpu: [arm64] + os: [android] requiresBuild: true dev: true optional: true @@ -1764,27 +1112,11 @@ packages: dev: true optional: true - /@sinclair/typebox@0.34.49: - resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} - dev: true - /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} dev: true - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@15.4.0: - resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} - dependencies: - '@sinonjs/commons': 3.0.1 - dev: true - /@turbo/darwin-64@2.9.18: resolution: {integrity: sha512-9f27peFu16ur8c0v9nUFUEyBnbKuuFsUTjHFWfmwGfzySBXbHwzU44QhZon6Mznz0cHsIr3984NQj/bVrnGSRw==} cpu: [x64] @@ -1827,43 +1159,6 @@ packages: requiresBuild: true optional: true - /@tybys/wasm-util@0.10.2: - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} - requiresBuild: true - dependencies: - tslib: 2.8.1 - dev: true - optional: true - - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.3 - dev: true - - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.29.7 - dev: true - - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - dev: true - - /@types/babel__traverse@7.18.3: - resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} - dependencies: - '@babel/types': 7.29.7 - dev: true - /@types/esrecurse@4.3.1: resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} dev: false @@ -1871,22 +1166,6 @@ packages: /@types/estree@1.0.8: resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: false @@ -1897,20 +1176,6 @@ packages: undici-types: 7.24.6 dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: true - - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@17.0.35: - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - /@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0)(eslint@10.5.0)(typescript@6.0.3): resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2061,190 +1326,6 @@ packages: transitivePeerDependencies: - supports-color - /@ungap/structured-clone@1.3.1: - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} - dev: true - - /@unrs/resolver-binding-android-arm-eabi@1.12.2: - resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-android-arm64@1.12.2: - resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-darwin-arm64@1.12.2: - resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-darwin-x64@1.12.2: - resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-freebsd-x64@1.12.2: - resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2: - resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-arm-musleabihf@1.12.2: - resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-arm64-gnu@1.12.2: - resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-arm64-musl@1.12.2: - resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-loong64-gnu@1.12.2: - resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-loong64-musl@1.12.2: - resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-ppc64-gnu@1.12.2: - resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-riscv64-gnu@1.12.2: - resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-riscv64-musl@1.12.2: - resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-s390x-gnu@1.12.2: - resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-x64-gnu@1.12.2: - resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-linux-x64-musl@1.12.2: - resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-openharmony-arm64@1.12.2: - resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} - cpu: [arm64] - os: [openharmony] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-wasm32-wasi@1.12.2: - resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - requiresBuild: true - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - dev: true - optional: true - - /@unrs/resolver-binding-win32-arm64-msvc@1.12.2: - resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-win32-ia32-msvc@1.12.2: - resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@unrs/resolver-binding-win32-x64-msvc@1.12.2: - resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /acorn-jsx@5.3.2(acorn@8.17.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2274,13 +1355,6 @@ packages: uri-js: 4.4.1 dev: false - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - /ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -2305,134 +1379,15 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - dev: true - /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.2 - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /babel-jest@30.4.1(@babel/core@7.29.7): - resolution: {integrity: sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@jest/transform': 30.4.1 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.4.0(@babel/core@7.29.7) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@7.0.1: - resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} - engines: {node: '>=12'} - dependencies: - '@babel/helper-plugin-utils': 7.29.7 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.6 - istanbul-lib-instrument: 6.0.3 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@30.4.0: - resolution: {integrity: sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@types/babel__core': 7.20.5 - dev: true - - /babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} - peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) - dev: true - - /babel-preset-jest@30.4.0(@babel/core@7.29.7): - resolution: {integrity: sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-beta.1 - dependencies: - '@babel/core': 7.29.7 - babel-plugin-jest-hoist: 30.4.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - /balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} dev: false - /baseline-browser-mapping@2.10.37: - resolution: {integrity: sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: true - - /brace-expansion@1.1.15: - resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.1.1: - resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - dependencies: - balanced-match: 1.0.2 - dev: true - /brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} @@ -2440,35 +1395,6 @@ packages: balanced-match: 4.0.4 dev: false - /browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - baseline-browser-mapping: 2.10.37 - caniuse-lite: 1.0.30001799 - electron-to-chromium: 1.5.372 - node-releases: 2.0.47 - update-browserslist-db: 1.2.3(browserslist@4.28.2) - dev: true - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - /bundle-require@5.1.0(esbuild@0.27.2): resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2484,25 +1410,6 @@ packages: engines: {node: '>=8'} dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite@1.0.30001799: - resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} - dev: true - /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2528,19 +1435,10 @@ packages: readdirp: 4.1.2 dev: true - /ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - dev: true - /cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} dev: true - /cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} - dev: true - /cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -2571,24 +1469,6 @@ packages: wrap-ansi: 7.0.0 dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collect-v8-coverage@1.0.3: - resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} - dev: true - /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2610,10 +1490,6 @@ packages: engines: {node: '>= 6'} dev: true - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - /confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} dev: true @@ -2623,23 +1499,6 @@ packages: engines: {node: ^14.18.0 || >=16.10.0} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2647,6 +1506,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: false /debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -2659,55 +1519,19 @@ packages: dependencies: ms: 2.1.3 - /dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: false - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - /dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} dev: false - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /electron-to-chromium@1.5.372: - resolution: {integrity: sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==} - dev: true - - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true - /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - /emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} dev: true @@ -2717,12 +1541,6 @@ packages: engines: {node: '>=18'} dev: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - /esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -2796,11 +1614,6 @@ packages: engines: {node: '>=6'} dev: true - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2921,12 +1734,6 @@ packages: eslint-visitor-keys: 5.0.1 dev: false - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - /esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -2951,55 +1758,18 @@ packages: engines: {node: '>=0.10.0'} dev: false - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exit-x@0.2.2: - resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expect@30.4.1: - resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/expect-utils': 30.4.1 - '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.4.1 - jest-message-util: 30.4.1 - jest-mock: 30.4.1 - jest-util: 30.4.1 - dev: true - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: false /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: false /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: false - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - /fdir@6.5.0(picomatch@4.0.4): resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3026,14 +1796,6 @@ packages: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: false - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -3062,18 +1824,6 @@ packages: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} dev: false - /foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3082,26 +1832,11 @@ packages: dev: true optional: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -3109,53 +1844,11 @@ packages: is-glob: 4.0.3 dev: false - /glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /globals@17.6.0: resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} dev: false - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /handlebars@4.7.9: - resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - dev: true - /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3165,15 +1858,6 @@ packages: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -3184,34 +1868,10 @@ packages: engines: {node: '>= 4'} dev: false - /import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + dev: false /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -3223,11 +1883,6 @@ packages: engines: {node: '>=8'} dev: true - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -3235,512 +1890,19 @@ packages: is-extglob: 2.1.1 dev: false - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - '@istanbuljs/schema': 0.1.6 - istanbul-lib-coverage: 3.2.2 - semver: 7.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - - /jest-changed-files@30.4.1: - resolution: {integrity: sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - execa: 5.1.1 - jest-util: 30.4.1 - p-limit: 3.1.0 - dev: true - - /jest-circus@30.4.2: - resolution: {integrity: sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/environment': 30.4.1 - '@jest/expect': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.7.2 - is-generator-fn: 2.1.0 - jest-each: 30.4.1 - jest-matcher-utils: 30.4.1 - jest-message-util: 30.4.1 - jest-runtime: 30.4.2 - jest-snapshot: 30.4.1 - jest-util: 30.4.1 - p-limit: 3.1.0 - pretty-format: 30.4.1 - pure-rand: 7.0.1 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-cli@30.4.2(@types/node@25.9.3): - resolution: {integrity: sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 30.4.2 - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 - chalk: 4.1.2 - exit-x: 0.2.2 - import-local: 3.2.0 - jest-config: 30.4.2(@types/node@25.9.3) - jest-util: 30.4.1 - jest-validate: 30.4.1 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - dev: true - - /jest-config@30.4.2(@types/node@25.9.3): - resolution: {integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@types/node': '*' - esbuild-register: '>=3.4.0' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - esbuild-register: - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.29.7 - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.4.0 - '@jest/test-sequencer': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - babel-jest: 30.4.1(@babel/core@7.29.7) - chalk: 4.1.2 - ci-info: 4.4.0 - deepmerge: 4.3.1 - glob: 10.5.0 - graceful-fs: 4.2.11 - jest-circus: 30.4.2 - jest-docblock: 30.4.0 - jest-environment-node: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-runner: 30.4.2 - jest-util: 30.4.1 - jest-validate: 30.4.1 - parse-json: 5.2.0 - pretty-format: 30.4.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-diff@30.4.1: - resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/diff-sequences': 30.4.0 - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - pretty-format: 30.4.1 - dev: true - - /jest-docblock@30.4.0: - resolution: {integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@30.4.1: - resolution: {integrity: sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.4.1 - chalk: 4.1.2 - jest-util: 30.4.1 - pretty-format: 30.4.1 - dev: true - - /jest-environment-node@30.4.1: - resolution: {integrity: sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/environment': 30.4.1 - '@jest/fake-timers': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - jest-mock: 30.4.1 - jest-util: 30.4.1 - jest-validate: 30.4.1 - dev: true - - /jest-haste-map@30.4.1: - resolution: {integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 30.4.0 - jest-util: 30.4.1 - jest-worker: 30.4.1 - picomatch: 4.0.4 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /jest-leak-detector@30.4.1: - resolution: {integrity: sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/get-type': 30.1.0 - pretty-format: 30.4.1 - dev: true - - /jest-matcher-utils@30.4.1: - resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - jest-diff: 30.4.1 - pretty-format: 30.4.1 - dev: true - - /jest-message-util@30.4.1: - resolution: {integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@babel/code-frame': 7.29.7 - '@jest/types': 30.4.1 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-util: 30.4.1 - picomatch: 4.0.4 - pretty-format: 30.4.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@30.4.1: - resolution: {integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - jest-util: 30.4.1 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 30.4.1 - dev: true - - /jest-regex-util@30.4.0: - resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dev: true - - /jest-resolve-dependencies@30.4.2: - resolution: {integrity: sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - jest-regex-util: 30.4.0 - jest-snapshot: 30.4.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@30.4.1: - resolution: {integrity: sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 - jest-pnp-resolver: 1.2.3(jest-resolve@30.4.1) - jest-util: 30.4.1 - jest-validate: 30.4.1 - slash: 3.0.0 - unrs-resolver: 1.12.2 - dev: true - - /jest-runner@30.4.2: - resolution: {integrity: sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/console': 30.4.1 - '@jest/environment': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - chalk: 4.1.2 - emittery: 0.13.1 - exit-x: 0.2.2 - graceful-fs: 4.2.11 - jest-docblock: 30.4.0 - jest-environment-node: 30.4.1 - jest-haste-map: 30.4.1 - jest-leak-detector: 30.4.1 - jest-message-util: 30.4.1 - jest-resolve: 30.4.1 - jest-runtime: 30.4.2 - jest-util: 30.4.1 - jest-watcher: 30.4.1 - jest-worker: 30.4.1 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@30.4.2: - resolution: {integrity: sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/environment': 30.4.1 - '@jest/fake-timers': 30.4.1 - '@jest/globals': 30.4.1 - '@jest/source-map': 30.0.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - chalk: 4.1.2 - cjs-module-lexer: 2.2.0 - collect-v8-coverage: 1.0.3 - glob: 10.5.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.4.1 - jest-message-util: 30.4.1 - jest-mock: 30.4.1 - jest-regex-util: 30.4.0 - jest-resolve: 30.4.1 - jest-snapshot: 30.4.1 - jest-util: 30.4.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@30.4.1: - resolution: {integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@babel/core': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/types': 7.29.7 - '@jest/expect-utils': 30.4.1 - '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) - chalk: 4.1.2 - expect: 30.4.1 - graceful-fs: 4.2.11 - jest-diff: 30.4.1 - jest-matcher-utils: 30.4.1 - jest-message-util: 30.4.1 - jest-util: 30.4.1 - pretty-format: 30.4.1 - semver: 7.8.4 - synckit: 0.11.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@30.4.1: - resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - chalk: 4.1.2 - ci-info: 4.4.0 - graceful-fs: 4.2.11 - picomatch: 4.0.4 - dev: true - - /jest-validate@30.4.1: - resolution: {integrity: sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.4.1 - camelcase: 6.3.0 - chalk: 4.1.2 - leven: 3.1.0 - pretty-format: 30.4.1 - dev: true - - /jest-watcher@30.4.1: - resolution: {integrity: sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 25.9.3 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 30.4.1 - string-length: 4.0.2 - dev: true - - /jest-worker@30.4.1: - resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@types/node': 25.9.3 - '@ungap/structured-clone': 1.3.1 - jest-util: 30.4.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@30.4.2(@types/node@25.9.3): - resolution: {integrity: sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 30.4.2 - '@jest/types': 30.4.1 - import-local: 3.2.0 - jest-cli: 30.4.2(@types/node@25.9.3) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - dev: true + dev: false /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - dev: true - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: false - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: false @@ -3749,23 +1911,12 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: false - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 dev: false - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3785,14 +1936,7 @@ packages: /load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /locate-path@6.0.0: @@ -3802,52 +1946,21 @@ packages: p-locate: 5.0.0 dev: false - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: false - /lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - dev: true - /lru-cache@11.5.1: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - /magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} dependencies: '@jridgewell/sourcemap-codec': 1.5.5 dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - /marked-terminal@7.3.0(marked@9.1.6): resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} engines: {node: '>=16.0.0'} @@ -3870,19 +1983,10 @@ packages: hasBin: true dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - /metric-lcs@0.1.2: resolution: {integrity: sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA==} dev: false - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - /minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -3890,28 +1994,6 @@ packages: brace-expansion: 5.0.6 dev: false - /minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - dependencies: - brace-expansion: 1.1.15 - dev: true - - /minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.1.1 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - /mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} dependencies: @@ -3932,18 +2014,9 @@ packages: thenify-all: 1.6.0 dev: true - /napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + dev: false /node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} @@ -3955,45 +2028,11 @@ packages: skin-tone: 2.0.0 dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-releases@2.0.47: - resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} - engines: {node: '>=18'} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -4006,25 +2045,12 @@ packages: type-check: 0.4.0 dev: false - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true + dev: false /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -4033,25 +2059,6 @@ packages: p-limit: 3.1.0 dev: false - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.29.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - /parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} dependencies: @@ -4069,23 +2076,12 @@ packages: /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + dev: false /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - dev: true + dev: false /pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -4095,11 +2091,6 @@ packages: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} dev: true - /picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - dev: true - /picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -4109,13 +2100,6 @@ packages: engines: {node: '>= 6'} dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - /pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} dependencies: @@ -4124,7 +2108,7 @@ packages: pathe: 2.0.3 dev: true - /postcss-load-config@6.0.1: + /postcss-load-config@6.0.1(tsx@4.22.4): resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} peerDependencies: @@ -4143,6 +2127,7 @@ packages: optional: true dependencies: lilconfig: 3.1.3 + tsx: 4.22.4 dev: true /prelude-ls@1.2.1: @@ -4156,33 +2141,11 @@ packages: hasBin: true dev: true - /pretty-format@30.4.1: - resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - dependencies: - '@jest/schemas': 30.4.1 - ansi-styles: 5.2.0 - react-is-18: /react-is@18.3.1 - react-is-19: /react-is@19.2.7 - dev: true - /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: false - /pure-rand@7.0.1: - resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} - dev: true - - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: true - - /react-is@19.2.7: - resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} - dev: true - /readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -4193,13 +2156,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -4240,11 +2196,6 @@ packages: fsevents: 2.3.3 dev: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - /semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} @@ -4255,19 +2206,12 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: false /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + dev: false /skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} @@ -4276,47 +2220,11 @@ packages: unicode-emoji-modifier-base: 1.0.0 dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - /source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4326,15 +2234,6 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4342,28 +2241,6 @@ packages: ansi-regex: 5.0.1 dev: true - /strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.2.2 - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - /sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4385,13 +2262,6 @@ packages: has-flag: 4.0.0 dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - /supports-hyperlinks@3.2.0: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} @@ -4400,22 +2270,6 @@ packages: supports-color: 7.2.0 dev: true - /synckit@0.11.13: - resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/core': 0.3.6 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.6 - glob: 7.2.3 - minimatch: 3.1.5 - dev: true - /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -4440,10 +2294,6 @@ packages: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -4462,54 +2312,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest@29.4.11(@babel/core@7.29.7)(jest@30.4.2)(typescript@6.0.3): - resolution: {integrity: sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 || ^30.0.0 - '@jest/types': ^29.0.0 || ^30.0.0 - babel-jest: ^29.0.0 || ^30.0.0 - esbuild: '*' - jest: ^29.0.0 || ^30.0.0 - jest-util: ^29.0.0 || ^30.0.0 - typescript: '>=4.3 <7' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - jest-util: - optional: true - dependencies: - '@babel/core': 7.29.7 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.9 - jest: 30.4.2(@types/node@25.9.3) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.8.4 - type-fest: 4.41.0 - typescript: 6.0.3 - yargs-parser: 21.1.1 - dev: true - - /tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - requiresBuild: true - dev: true - optional: true - - /tsup@8.5.1(typescript@6.0.3): + /tsup@8.5.1(tsx@4.22.4)(typescript@6.0.3): resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} hasBin: true @@ -4537,7 +2340,7 @@ packages: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1 + postcss-load-config: 6.0.1(tsx@4.22.4) resolve-from: 5.0.0 rollup: 4.55.1 source-map: 0.7.6 @@ -4553,6 +2356,16 @@ packages: - yaml dev: true + /tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /turbo@2.9.18: resolution: {integrity: sha512-bwabv6PupzeavybzEoArBAkwq5fnzwf8OFnRtpHwnviFWuwJPFxtyH+aVp36TmIqK3aYYgtTJ3J0m2ysxxSzQg==} hasBin: true @@ -4571,21 +2384,6 @@ packages: prelude-ls: 1.2.1 dev: false - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - dev: true - /typescript-eslint@8.61.0(eslint@10.5.0)(typescript@6.0.3): resolution: {integrity: sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4623,14 +2421,6 @@ packages: resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} dev: true - /uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - /undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} dev: true @@ -4640,83 +2430,24 @@ packages: engines: {node: '>=4'} dev: true - /unrs-resolver@1.12.2: - resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} - requiresBuild: true - dependencies: - napi-postinstall: 0.3.4 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.12.2 - '@unrs/resolver-binding-android-arm64': 1.12.2 - '@unrs/resolver-binding-darwin-arm64': 1.12.2 - '@unrs/resolver-binding-darwin-x64': 1.12.2 - '@unrs/resolver-binding-freebsd-x64': 1.12.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 - '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-x64-musl': 1.12.2 - '@unrs/resolver-binding-openharmony-arm64': 1.12.2 - '@unrs/resolver-binding-wasm32-wasi': 1.12.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 - dev: true - - /update-browserslist-db@1.2.3(browserslist@4.28.2): - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.28.2 - escalade: 3.2.0 - picocolors: 1.1.1 - dev: true - /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: false - /v8-to-istanbul@9.0.1: - resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 1.9.0 - dev: true - /validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + dev: false /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -4727,46 +2458,16 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - dev: true - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -4780,19 +2481,7 @@ packages: yargs-parser: 20.2.9 dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + dev: false diff --git a/turbo.json b/turbo.json index 4234d442..d9e72efc 100644 --- a/turbo.json +++ b/turbo.json @@ -18,7 +18,9 @@ "outputs": [] }, "test": { - "dependsOn": ["build"], + "outputs": [] + }, + "typecheck": { "outputs": [] }, "lint": { @@ -29,7 +31,7 @@ "outputs": [] }, "test:watch": { - "dependsOn": ["clean", "buf:generate"], + "cache": false, "persistent": true } }, From 6f2d86e123beca8ed34beb3c69c781505b3d8612 Mon Sep 17 00:00:00 2001 From: Josh Humphries <2035234+jhump@users.noreply.github.com> Date: Tue, 16 Jun 2026 10:49:14 -0400 Subject: [PATCH 2/5] Add typecheck guard against loosening the gateway methods option Now that test files are type-checked (tsc --noEmit), add a compile-time assertion that the GatewayServiceOptions `methods` option rejects client-streaming and bidi-streaming method names. The @ts-expect-error directives fail the typecheck if the filter (DescMethodUnary | DescMethodServerStreaming) is ever loosened, closing the gap left when UnaryAndServerStreamMethods was removed. --- packages/knit/src/gateway/gateway.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/knit/src/gateway/gateway.test.ts b/packages/knit/src/gateway/gateway.test.ts index 5cf34241..733ced83 100644 --- a/packages/knit/src/gateway/gateway.test.ts +++ b/packages/knit/src/gateway/gateway.test.ts @@ -46,6 +46,18 @@ describe("service", () => { ["spec.AllService.GetAll"], ); }); + test("methods option rejects unsupported method kinds", () => { + const gateway = createGateway({ transport: {} as any }); + // The methods option only accepts unary and server-streaming method names. + // These @ts-expect-error directives fail the typecheck (tsconfig.test.json) + // if the option type ever loosens to accept client-streaming or + // bidi-streaming method names. (AllService.clientAll is client-streaming and + // AllService.biDiAll is bidi-streaming.) + // @ts-expect-error - clientAll is a client-streaming method + gateway.service(AllService, { methods: ["clientAll"] }); + // @ts-expect-error - biDiAll is a bidi-streaming method + gateway.service(AllService, { methods: ["biDiAll"] }); + }); test("respects transport override", () => { const gateway = createGateway({ transport: { kind: "base" } as any }); gateway.service(AllService, { transport: { kind: "override" } as any }); From a49ae5a6b34fbec2aa575f2a50fc4e5ce3c0ac04 Mon Sep 17 00:00:00 2001 From: Josh Humphries <2035234+jhump@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:39:51 -0400 Subject: [PATCH 3/5] Replace eslint and prettier with Biome Adopt Biome for both linting and formatting, matching bufbuild/protobuf-es and connectrpc/connect-es, and use @bufbuild/license-header for the license header that eslint-plugin-notice previously enforced. - Add @biomejs/biome 2.x with a biome.json mirroring the sibling rule set, plus @bufbuild/license-header. Remove eslint, typescript-eslint, prettier, eslint-plugin-notice, and the eslint-config-custom workspace package. - Root scripts: lint = biome lint --error-on-warnings, format = biome format --write, license-header; wire the license-header --check into CI. - Apply Biome's safe lint fixes (import type, Array.isArray, Number.isNaN, parseInt radix, arrow functions, literal keys) and reformat. Suppress noExplicitAny in the type-machinery files (scope/client/utils) where the any usage is intentional. Biome's linter is not type-aware, so the type-aware eslint rules (strict-boolean-expressions, no-unnecessary-condition, etc.) are no longer enforced; tsc --noEmit (the typecheck task) still catches type errors. --- .github/workflows/ci.yaml | 2 + .prettierignore | 10 - biome.json | 49 + package.json | 14 +- packages/eslint-config-custom/index.js | 116 --- packages/eslint-config-custom/license-header | 13 - packages/eslint-config-custom/package.json | 28 - packages/knit-test-spec/package.json | 2 +- packages/knit/eslint.config.mjs | 22 - packages/knit/package.json | 2 - packages/knit/src/alias.ts | 2 +- packages/knit/src/client.test.ts | 18 +- packages/knit/src/client.ts | 12 +- packages/knit/src/error.ts | 4 +- packages/knit/src/gateway/gateway.ts | 4 +- packages/knit/src/gateway/service.ts | 5 +- packages/knit/src/gateway/stitch.test.ts | 14 + packages/knit/src/json.ts | 16 +- packages/knit/src/protocol.ts | 9 +- packages/knit/src/schema.ts | 148 +-- packages/knit/src/scope.ts | 35 +- packages/knit/src/testing/util.ts | 2 +- packages/knit/src/utils/types.ts | 34 +- packages/knit/tsup.config.ts | 14 + packages/protoc-gen-knit-ts/eslint.config.mjs | 17 - packages/protoc-gen-knit-ts/package.json | 2 - packages/protoc-gen-knit-ts/src/index.ts | 1 - pnpm-lock.yaml | 874 +++--------------- turbo.json | 8 +- 29 files changed, 360 insertions(+), 1117 deletions(-) delete mode 100644 .prettierignore create mode 100644 biome.json delete mode 100644 packages/eslint-config-custom/index.js delete mode 100644 packages/eslint-config-custom/license-header delete mode 100644 packages/eslint-config-custom/package.json delete mode 100644 packages/knit/eslint.config.mjs delete mode 100644 packages/protoc-gen-knit-ts/eslint.config.mjs diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 51a8cf91..b3135954 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,6 +16,8 @@ jobs: run: pnpm run lint - name: typecheck run: pnpm run typecheck + - name: license-header + run: pnpm run license-header -- --check test: runs-on: ubuntu-latest steps: diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 31719949..00000000 --- a/.prettierignore +++ /dev/null @@ -1,10 +0,0 @@ -# Defaults -**/.git -**/.svn -**/.hg -**/node_modules - -**/dist -**/src/gen -packages/knit-test-spec/spec/** -packages/knit-test-spec/buf/** \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..d184f36a --- /dev/null +++ b/biome.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.5.0/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!**/dist", + "!packages/knit-test-spec/spec", + "!packages/knit-test-spec/buf", + "!**/tsconfig*.json" + ] + }, + "formatter": { + "indentStyle": "space" + }, + "linter": { + "rules": { + "preset": "recommended", + "style": { + "useTemplate": "off", + "useConst": "off", + "noParameterAssign": "off", + "useSingleVarDeclarator": "off", + "useNumberNamespace": "off", + "noUnusedTemplateLiteral": "off" + }, + "correctness": { + "noSwitchDeclarations": "off" + }, + "suspicious": { + "noDoubleEquals": "off", + "noFallthroughSwitchClause": "off" + } + } + }, + "overrides": [ + { + "includes": ["**/*.test.ts", "**/src/testing/**", "**/tsup.config.ts"], + "linter": { + "enabled": false + } + } + ] +} diff --git a/package.json b/package.json index 7117a0df..74a0f1f9 100644 --- a/package.json +++ b/package.json @@ -8,18 +8,24 @@ "scripts": { "clean": "turbo run clean --no-daemon --cache-dir=.turbo", "build": "turbo run build --no-daemon --cache-dir=.turbo", - "lint": "turbo run lint --no-daemon --cache-dir=.turbo", "attw": "turbo run attw --no-daemon --cache-dir=.turbo", "test": "turbo run test --no-daemon --cache-dir=.turbo", "test:watch": "turbo run test:watch --no-daemon --cache-dir=.turbo", "typecheck": "turbo run typecheck --no-daemon --cache-dir=.turbo", "buf:generate": "turbo run buf:generate --no-daemon --cache-dir=.turbo", - "format": "prettier --write \"**/*.{ts,tsx,md}\"" + "lint": "biome lint --error-on-warnings", + "format": "biome format --write", + "license-header": "license-header --ignore 'packages/*/dist/**' --ignore 'packages/knit-test-spec/spec/**' --ignore 'packages/knit-test-spec/buf/**' --ignore 'packages/knit-test-spec/proto/**'" + }, + "licenseHeader": { + "licenseType": "apache", + "yearRange": "2023-2024", + "copyrightHolder": "Buf Technologies, Inc." }, "devDependencies": { "@types/node": "^25.9.3", - "eslint-config-custom": "workspace:*", - "prettier": "^3.8.4", + "@biomejs/biome": "^2.5.0", + "@bufbuild/license-header": "^0.0.4", "turbo": "^2.9.18", "typescript": "^6.0.3", "@arethetypeswrong/cli": "^0.18.3" diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js deleted file mode 100644 index e34b9038..00000000 --- a/packages/eslint-config-custom/index.js +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { readFileSync } from "fs"; -import { fileURLToPath } from "url"; -import { dirname, join } from "path"; -import js from "@eslint/js"; -import { fixupPluginRules } from "@eslint/compat"; -import tseslint from "typescript-eslint"; -import turbo from "eslint-config-turbo/flat"; -import prettier from "eslint-config-prettier"; -import noticePlugin from "eslint-plugin-notice"; -import globals from "globals"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -// Read the license header template from this package's own directory so that -// the path is always correct regardless of the CWD when eslint runs. -const licenseHeaderTemplate = readFileSync( - join(__dirname, "license-header"), - "utf-8", -); - -/** @type {import("typescript-eslint").ConfigArray} */ -const config = tseslint.config( - // Global ignores (applied to all configs in the array). - { - ignores: ["dist/**", "node_modules/**", "src/**/*.test.ts"], - }, - - // Base JS rules — applied to all files. - js.configs.recommended, - - // Turbo flat config (enforces TURBO_* env var discipline). - ...turbo, - - // Disable style rules that conflict with Prettier. - prettier, - - // Base language options and plugins for all files. - // Note: projectService is NOT set here — it is scoped to *.ts files below, - // so that ESLint does not attempt to type-check JS config files. - { - languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - ...globals.es2021, - }, - }, - plugins: { - // fixupPluginRules wraps the legacy plugin so context.getFilename() and - // context.getSourceCode() are shimmed to the ESLint 10 equivalents. - notice: fixupPluginRules(noticePlugin), - }, - rules: { - "no-console": "error", - "notice/notice": [ - "error", - { - template: licenseHeaderTemplate, - }, - ], - }, - }, - - // TypeScript-specific config with type-checking. Scoped to *.ts files so - // that the project service is not invoked for JS/MJS config files. - { - files: ["**/*.ts"], - extends: [...tseslint.configs.recommendedTypeChecked], - languageOptions: { - parserOptions: { - projectService: true, - sourceType: "module", - }, - }, - rules: { - "@typescript-eslint/strict-boolean-expressions": "error", - "@typescript-eslint/no-unnecessary-condition": "error", - "@typescript-eslint/array-type": "off", - // Configure to match the v6 recommended-requiring-type-checking behavior - // where a default clause was sufficient to satisfy exhaustiveness. - "@typescript-eslint/switch-exhaustiveness-check": [ - "error", - { considerDefaultExhaustiveForUnions: true }, - ], - "@typescript-eslint/prefer-nullish-coalescing": "error", - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", - "@typescript-eslint/no-invalid-void-type": "error", - "@typescript-eslint/no-base-to-string": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - // KnitError is a structured domain error: it is both thrown and returned - // as an embedded value in results (the `@catch` error strategy), so it is - // intentionally not an Error subclass. Allow throwing it. - "@typescript-eslint/only-throw-error": [ - "error", - { allow: [{ from: "file", name: "KnitError" }] }, - ], - }, - }, -); - -export default config; diff --git a/packages/eslint-config-custom/license-header b/packages/eslint-config-custom/license-header deleted file mode 100644 index a26176f9..00000000 --- a/packages/eslint-config-custom/license-header +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. \ No newline at end of file diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json deleted file mode 100644 index 01125dd1..00000000 --- a/packages/eslint-config-custom/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "eslint-config-custom", - "version": "0.0.0", - "type": "module", - "exports": { - ".": "./index.js" - }, - "license": "MIT", - "dependencies": { - "@eslint/compat": "^2.1.0", - "@eslint/js": "^10.0.1", - "eslint": "^10.5.0", - "eslint-config-prettier": "^10.1.8", - "eslint-config-turbo": "^2.9.18", - "eslint-plugin-notice": "^1.0.0", - "globals": "^17.6.0", - "typescript-eslint": "^8.61.0" - }, - "devDependencies": { - "typescript": "^6.0.3" - }, - "publishConfig": { - "access": "public" - }, - "files": [ - "license-header" - ] -} diff --git a/packages/knit-test-spec/package.json b/packages/knit-test-spec/package.json index 8d1c6ded..4b8ff6be 100644 --- a/packages/knit-test-spec/package.json +++ b/packages/knit-test-spec/package.json @@ -16,4 +16,4 @@ "@bufbuild/protoc-gen-es": "^2.12.0", "@bufbuild/protoc-gen-knit-ts": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/knit/eslint.config.mjs b/packages/knit/eslint.config.mjs deleted file mode 100644 index e4c26550..00000000 --- a/packages/knit/eslint.config.mjs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import config from "eslint-config-custom"; - -export default [ - ...config, - { - ignores: ["src/testing/*.ts", "tsup.config.ts", "gateway.js"], - }, -]; diff --git a/packages/knit/package.json b/packages/knit/package.json index 5e2c35aa..3daf865d 100644 --- a/packages/knit/package.json +++ b/packages/knit/package.json @@ -12,7 +12,6 @@ "type": "module", "scripts": { "clean": "rm -rf ./dist/* .turbo/*", - "lint": "eslint .", "attw": "attw --pack", "typecheck": "tsc --noEmit -p tsconfig.test.json", "test": "tsx --test $(find src -type f -path '*.test.ts')", @@ -60,7 +59,6 @@ "devDependencies": { "@buf/bufbuild_knit.bufbuild_es": "2.12.0-20250213130123-9561c696fd69.1", "@bufbuild/knit-test-spec": "workspace:*", - "eslint-config-custom": "workspace:*", "tsconfig": "workspace:*", "tsup": "^8.5.1", "tsx": "^4.22.4" diff --git a/packages/knit/src/alias.ts b/packages/knit/src/alias.ts index 2ad595e7..025b0afa 100644 --- a/packages/knit/src/alias.ts +++ b/packages/knit/src/alias.ts @@ -81,5 +81,5 @@ export function getAlias( if (!(aliasSymbol in v && "value" in v)) { return undefined; } - return { alias: v[aliasSymbol] as string, value: v["value"] }; + return { alias: v[aliasSymbol] as string, value: v.value }; } diff --git a/packages/knit/src/client.test.ts b/packages/knit/src/client.test.ts index 5305d6b0..aa1e48ca 100644 --- a/packages/knit/src/client.test.ts +++ b/packages/knit/src/client.test.ts @@ -1,3 +1,17 @@ +// Copyright 2023-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import { describe, test } from "node:test"; import assert from "node:assert/strict"; import { createClientWithTransport } from "./client.js"; @@ -92,8 +106,8 @@ describe("client", () => { const client = createClientWithTransport( createRouterTransport(({ service }) => { service(KnitService, { - fetch: unary as any, // eslint-disable-line @typescript-eslint/no-explicit-any - do: unary as any, // eslint-disable-line @typescript-eslint/no-explicit-any + fetch: unary as any, + do: unary as any, async *listen( { request: actualRequest }: ListenRequest, { requestHeader }: HandlerContext, diff --git a/packages/knit/src/client.ts b/packages/knit/src/client.ts index 2ccc5c01..694bfec8 100644 --- a/packages/knit/src/client.ts +++ b/packages/knit/src/client.ts @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +// biome-ignore-all lint/suspicious/noExplicitAny: the decoded result is reconstructed at runtime and cast to the typed Mask result. + import { createConnectTransport } from "@connectrpc/connect-web"; import { createClient as createConnectRpcClient, @@ -224,14 +226,13 @@ function createFetch( client: KnitServiceClient, options: OptionalOptions, ): Client["fetch"] { - return async function >>(query: Q) { + return async >>(query: Q) => { const [requests, oneofs] = makeRequests(query as AnyQuery); try { const { responses } = await client.fetch( { requests }, { headers: options.headers }, ); - // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return return makeResult(oneofs, responses) as any; } catch (reason) { throw knitErrorFromReason(reason); @@ -243,14 +244,13 @@ function createDo( client: KnitServiceClient, options: OptionalOptions, ): Client["do"] { - return async function >>(query: Q) { + return async >>(query: Q) => { const [requests, oneofs] = makeRequests(query as AnyQuery); try { const { responses } = await client.do( { requests }, { headers: options.headers }, ); - // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return return makeResult(oneofs, responses) as any; } catch (reason) { throw knitErrorFromReason(reason); @@ -262,7 +262,7 @@ function createListen( client: KnitServiceClient, options: OptionalOptions, ): Client["listen"] { - return function >>(query: Q) { + return >>(query: Q) => { const [requests, oneofs] = makeRequests(query as AnyQuery); if (requests.length !== 1) { throw new Error( @@ -277,7 +277,7 @@ function createListen( return makeResultIterable( oneofs[0], responseIterable, - ) as AsyncIterable; // eslint-disable-line @typescript-eslint/no-explicit-any + ) as AsyncIterable; } catch (reason) { throw knitErrorFromReason(reason); } diff --git a/packages/knit/src/error.ts b/packages/knit/src/error.ts index a3828a0c..307499b2 100644 --- a/packages/knit/src/error.ts +++ b/packages/knit/src/error.ts @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Code, ConnectError } from "@connectrpc/connect"; -import type { Client } from "./client.js"; // eslint-disable-line @typescript-eslint/no-unused-vars +import { type Code, ConnectError } from "@connectrpc/connect"; +import type { Client } from "./client.js"; import { create, toBinary, toJson } from "@bufbuild/protobuf"; import type { JsonValue } from "@bufbuild/protobuf"; diff --git a/packages/knit/src/gateway/gateway.ts b/packages/knit/src/gateway/gateway.ts index 0d5b9f69..7d5b9530 100644 --- a/packages/knit/src/gateway/gateway.ts +++ b/packages/knit/src/gateway/gateway.ts @@ -316,9 +316,7 @@ export function createGateway({ }, ); return ( - (response.message as Record)[ - "values" - ] as Message[] + (response.message as Record).values as Message[] ).map((v) => (v as Record)[field.localName]); }, }); diff --git a/packages/knit/src/gateway/service.ts b/packages/knit/src/gateway/service.ts index abb54fbd..a1066e20 100644 --- a/packages/knit/src/gateway/service.ts +++ b/packages/knit/src/gateway/service.ts @@ -25,7 +25,7 @@ import { FetchResponseSchema, KnitService, ListenResponseSchema, - ResponseSchema, + type ResponseSchema, } from "@buf/bufbuild_knit.bufbuild_es/buf/knit/gateway/v1alpha1/knit_pb.js"; import type { Request } from "@buf/bufbuild_knit.bufbuild_es/buf/knit/gateway/v1alpha1/knit_pb.js"; import { @@ -309,7 +309,6 @@ async function handleStream( context.signal, min(context.timeoutMs(), entryPoint.timeoutMs), headers, - // eslint-disable-next-line @typescript-eslint/require-await (async function* () { yield fromJson( method.input, @@ -350,7 +349,7 @@ async function makeResponse( context: ResolverContext, ): Promise { const target: { body?: JsonValue } = {}; - let errorPatch: ErrorPatch | undefined = undefined; + let errorPatch: ErrorPatch | undefined; if (shouldCatch(request.onError, fallbackCatch)) { errorPatch = { target: target, diff --git a/packages/knit/src/gateway/stitch.test.ts b/packages/knit/src/gateway/stitch.test.ts index 0cd4f826..ac65ca71 100644 --- a/packages/knit/src/gateway/stitch.test.ts +++ b/packages/knit/src/gateway/stitch.test.ts @@ -1,3 +1,17 @@ +// Copyright 2023-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import { test } from "node:test"; import assert from "node:assert/strict"; import { stitch } from "./stitch.js"; diff --git a/packages/knit/src/json.ts b/packages/knit/src/json.ts index 8cff84d7..8b27c428 100644 --- a/packages/knit/src/json.ts +++ b/packages/knit/src/json.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-case-declarations */ // Copyright 2023-2024 Buf Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,7 +36,7 @@ import { TimestampSchema, ValueSchema, } from "@bufbuild/protobuf/wkt"; -import { Code } from "@connectrpc/connect"; +import type { Code } from "@connectrpc/connect"; import { KnitError } from "./error.js"; /** @@ -53,7 +52,7 @@ export function format(data: unknown): JsonValue { case "string": return data; case "number": - if (isNaN(data)) { + if (Number.isNaN(data)) { return "NaN"; } if (data === Number.POSITIVE_INFINITY) { @@ -90,20 +89,18 @@ export function format(data: unknown): JsonValue { if (data instanceof Uint8Array) { return base64Encode(data); } - if (data instanceof Array) { + if (Array.isArray(data)) { return data.map((element) => format(element)); } const entries = Object.entries(data); const fields: JsonObject = {}; for (let [key, value] of entries) { if (typeof value === "object" && value !== null) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument const alias = getAlias(value); if (alias !== undefined) { key = alias.alias; value = alias.value; } else { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument const oneof = getOneof(value); if (oneof !== undefined) { key = oneof["@case"]; @@ -162,7 +159,6 @@ export function decodeMessage( } const oneOfField = oneofTable[fieldPath]; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (oneOfField !== undefined) { result[oneOfField] = { "@case": field.name, @@ -355,7 +351,7 @@ function decodeInt(data: JsonValue, path: string) { case "number": return data; case "string": - return parseInt(data); + return parseInt(data, 10); default: throw parseError("string | number", typeof data, "int", path); } @@ -445,7 +441,7 @@ function assertJsonObject( default: break; } - if (data instanceof Array) { + if (Array.isArray(data)) { throw parseError("object", "Array", "message", path); } } @@ -454,7 +450,7 @@ function assertJsonArray( data: JsonValue, path: string, ): asserts data is JsonValue[] { - if (!(data instanceof Array)) { + if (!Array.isArray(data)) { throw parseError("Array", typeof data, "ListValue", path); } } diff --git a/packages/knit/src/protocol.ts b/packages/knit/src/protocol.ts index 9ba9fd3a..9d1ec4bb 100644 --- a/packages/knit/src/protocol.ts +++ b/packages/knit/src/protocol.ts @@ -16,7 +16,7 @@ import { fromJson, toJson } from "@bufbuild/protobuf"; import type { MessageInitShape } from "@bufbuild/protobuf"; import { ValueSchema } from "@bufbuild/protobuf/wkt"; import type { Value } from "@bufbuild/protobuf/wkt"; -import { +import type { MaskFieldSchema, RequestSchema, } from "@buf/bufbuild_knit.bufbuild_es/buf/knit/gateway/v1alpha1/knit_pb.js"; @@ -71,8 +71,8 @@ function makeMaskField( value: AnyQuery, path: string, ): [MaskFieldInit, Record] { - let params: Value | undefined = undefined; - let onError: MaskFieldInit["onError"] = undefined; + let params: Value | undefined; + let onError: MaskFieldInit["onError"]; const mask: MaskFieldInit[] = []; let oneofTable: Record = {}; for (const [k, v] of Object.entries(value)) { @@ -126,7 +126,6 @@ export function makeResult( const method = uncapitalize(serviceParts.pop() as string); const service = serviceParts.join("."); let serviceResult = result[service]; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (serviceResult === undefined) { result[service] = serviceResult = {}; } @@ -150,7 +149,7 @@ export async function* makeResultIterable( oneofs: Record, response: AsyncIterable, ) { - let schema: Schema | undefined = undefined; + let schema: Schema | undefined; try { for await (const next of response) { if (next.response === undefined) { diff --git a/packages/knit/src/schema.ts b/packages/knit/src/schema.ts index b95cc111..c4053018 100644 --- a/packages/knit/src/schema.ts +++ b/packages/knit/src/schema.ts @@ -74,30 +74,29 @@ export type ErrorStrategyCatch = { "@catch": Record }; //prettier-ignore export type Query = T extends OneofMarker - ? OneofQuery> - : T extends (infer E)[] - ? Query - : T extends MapMarker // eslint-disable-line @typescript-eslint/no-unused-vars - ? Query - : T extends EnumMarker - ? ScalarQuery - : T extends AliasMarker - ? Query - : T extends keyof WktTypeTable - ? ScalarQuery - : T extends Uint8Array - ? ScalarQuery - : T extends RelationMarker - ? ( - P extends undefined - ? Query - : { $: Parameter

} & Query - ) & ErrorStrategy - : T extends AnyRecord - ? { [P in keyof T]?: Query } - : T extends undefined - ? never - : ScalarQuery; + ? OneofQuery> + : T extends (infer E)[] + ? Query + : T extends MapMarker + ? Query + : T extends EnumMarker + ? ScalarQuery + : T extends AliasMarker + ? Query + : T extends keyof WktTypeTable + ? ScalarQuery + : T extends Uint8Array + ? ScalarQuery + : T extends RelationMarker + ? (P extends undefined + ? Query + : { $: Parameter

} & Query) & + ErrorStrategy + : T extends AnyRecord + ? { [P in keyof T]?: Query } + : T extends undefined + ? never + : ScalarQuery; /** * Parameter converts the generated schemas into their parameter variants that @@ -119,25 +118,29 @@ export type Query = //prettier-ignore export type Parameter = T extends OneofMarker - ? Oneof> - : T extends (infer E)[] - ? Array> - : T extends MapMarker - ? { [P in keyof M]: Parameter } - : T extends EnumMarker - ? E - : T extends AliasMarker - ? Alias> - : T extends keyof WktTypeTable - ? WktTypeTable[T] - : T extends Uint8Array - ? Uint8Array - : T extends AnyRecord - ? { - // Exclude the Knit relation fields - [K in keyof T as T[K] extends RelationMarker | undefined ? never : K]?: Parameter; - } - : T; + ? Oneof> + : T extends (infer E)[] + ? Array> + : T extends MapMarker + ? { [P in keyof M]: Parameter } + : T extends EnumMarker + ? E + : T extends AliasMarker + ? Alias> + : T extends keyof WktTypeTable + ? WktTypeTable[T] + : T extends Uint8Array + ? Uint8Array + : T extends AnyRecord + ? { + // Exclude the Knit relation fields + [K in keyof T as T[K] extends + | RelationMarker + | undefined + ? never + : K]?: Parameter; + } + : T; /** * Mask returns the masked result based on a {@link Query}. Useful for getting the results based on @@ -166,28 +169,32 @@ export type Parameter = //prettier-ignore export type Mask = R extends OneofMarker - ? Q extends OneofQuery ? Oneof> : never - : R extends (infer E)[] - ? Array> - : R extends MapMarker - ? { [K in keyof M]: Mask } - : R extends EnumMarker - ? E - : R extends AliasMarker - ? Mask - : R extends keyof WktTypeTable - ? WktTypeTable[R] - : R extends Uint8Array - ? R - : R extends RelationMarker - ? Mask | ErrorMask - : R extends AnyRecord - ? { - [K in keyof R as K extends keyof Q ? K : never]: K extends keyof Q - ? Mask - : never; - } - : R; + ? Q extends OneofQuery + ? Oneof> + : never + : R extends (infer E)[] + ? Array> + : R extends MapMarker + ? { [K in keyof M]: Mask } + : R extends EnumMarker + ? E + : R extends AliasMarker + ? Mask + : R extends keyof WktTypeTable + ? WktTypeTable[R] + : R extends Uint8Array + ? R + : R extends RelationMarker + ? Mask | ErrorMask + : R extends AnyRecord + ? { + [K in keyof R as K extends keyof Q + ? K + : never]: K extends keyof Q + ? Mask + : never; + } + : R; /** * Markers used to identify type that needs special handling. @@ -223,14 +230,13 @@ type WktTypeTable = { }; //prettier-ignore -type ErrorMask = - Q extends ErrorStrategyCatch +type ErrorMask = Q extends ErrorStrategyCatch ? KnitError : Q extends ErrorStrategyThrow - ? never - : ES extends ErrorStrategyCatch - ? KnitError - : never; + ? never + : ES extends ErrorStrategyCatch + ? KnitError + : never; /** * The base type for all Knit schemas. diff --git a/packages/knit/src/scope.ts b/packages/knit/src/scope.ts index 86c6535a..b650cd93 100644 --- a/packages/knit/src/scope.ts +++ b/packages/knit/src/scope.ts @@ -12,7 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -/* eslint-disable @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-explicit-any */ +// biome-ignore-all lint/suspicious/noExplicitAny: the scoped-client plumbing relies on `any` to remap the dynamic service-name prefixes. + import type { Schema } from "./schema.js"; import type { Client } from "./client.js"; import type { AnyQuery } from "./protocol.js"; @@ -110,11 +111,7 @@ function scopeResult(result: { [k: string]: unknown }, scope: string) { * result is "com" | "com.example" | "com.example.foo" | "com.example.foo.v1" */ // prettier-ignore -type Split< - S extends string, - C extends string, - P extends string = "" -> = +type Split = // Check to see if S has at least one `C` somewhere. // This always matches the first `C`. // @@ -122,19 +119,19 @@ type Split< // L -> com // R -> example.foo.v1.FooService S extends `${infer L}${C}${infer R}` - // Prefix `L` with `P`, for the first run P is always ''. - // - // For com.example.foo.v1.FooService - // - // First iteration: - // "com" | Split<"example.foo.v1.FooService", ".", "com."> - // - // Second iteration: - // "com.example" | Split<"foo.v1.FooService", ".", "com.example."> - ? `${P}${L}` | Split - // Last iteration: - // `never`. `|` with never is a noop. - : never; + ? // Prefix `L` with `P`, for the first run P is always ''. + // + // For com.example.foo.v1.FooService + // + // First iteration: + // "com" | Split<"example.foo.v1.FooService", ".", "com."> + // + // Second iteration: + // "com.example" | Split<"foo.v1.FooService", ".", "com.example."> + `${P}${L}` | Split + : // Last iteration: + // `never`. `|` with never is a noop. + never; /** * Scope a Schema to only include services that have the prefix `P` and diff --git a/packages/knit/src/testing/util.ts b/packages/knit/src/testing/util.ts index ff510f30..f4c44a9f 100644 --- a/packages/knit/src/testing/util.ts +++ b/packages/knit/src/testing/util.ts @@ -18,7 +18,7 @@ import type { Equal } from "../utils/types.js"; * Useful to test types: `expectType>(true)` * @param _ */ -export function expectType(_expectedValue: T) {} // eslint-disable-line @typescript-eslint/no-unused-vars,@typescript-eslint/no-empty-function +export function expectType(_expectedValue: T) {} /** * The equality check is accurate, the diff may not cover all cases, only used for debugging type tests. diff --git a/packages/knit/src/utils/types.ts b/packages/knit/src/utils/types.ts index 84775af0..44620cc7 100644 --- a/packages/knit/src/utils/types.ts +++ b/packages/knit/src/utils/types.ts @@ -12,11 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. +// biome-ignore-all lint/suspicious/noExplicitAny: these structural type helpers intentionally use `any`. + /** * A type that requires exactly one of the properties of an object to be set. */ export type ExactlyOne = { - [K in keyof T]-?: Required> & Partial, never>>; //prettier-ignore + [K in keyof T]-?: Required> & + Partial, never>>; //prettier-ignore }[keyof T]; /** @@ -24,7 +27,8 @@ export type ExactlyOne = { * */ export type OneOrMore = { - [K in keyof T]-?: Required> & Partial>>; //prettier-ignore + [K in keyof T]-?: Required> & + Partial>>; //prettier-ignore }[keyof T]; /** @@ -37,7 +41,7 @@ export type ZeroOrOne = /** * Allows anything object type ({}). */ -export type AnyRecord = { [K in string]: any }; // eslint-disable-line @typescript-eslint/no-explicit-any +export type AnyRecord = { [K in string]: any }; /** * @@ -47,9 +51,9 @@ export type AnyRecord = { [K in string]: any }; // eslint-disable-line @typescri */ //prettier-ignore export type Equal = - (() => T extends L ? 1 : 2) extends (() => T extends R ? 1 : 2) - ? true - : false; + (() => T extends L ? 1 : 2) extends () => T extends R ? 1 : 2 + ? true + : false; /** * @link https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types @@ -62,16 +66,16 @@ export type DistributiveKeyOf = T extends T ? keyof T : never; //prettier-ignore export type Subset = Equal extends true - ? T - : T extends any[] // eslint-disable-line @typescript-eslint/no-explicit-any - ? Array, Element>> - : T extends AnyRecord - ? SubsetRecord - : T; + ? T + : T extends any[] + ? Array, Element>> + : T extends AnyRecord + ? SubsetRecord + : T; //prettier-ignore -type SubsetRecord = - & { [P in keyof T]: Subset

; } - & Record>, never>; +type SubsetRecord = { + [P in keyof T]: Subset

; +} & Record>, never>; type Element = T extends (infer E)[] ? E : never; diff --git a/packages/knit/tsup.config.ts b/packages/knit/tsup.config.ts index 0cad12ca..8b385305 100644 --- a/packages/knit/tsup.config.ts +++ b/packages/knit/tsup.config.ts @@ -1,3 +1,17 @@ +// Copyright 2023-2024 Buf Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import { defineConfig, type Options } from "tsup"; import { writeFileSync } from "fs"; diff --git a/packages/protoc-gen-knit-ts/eslint.config.mjs b/packages/protoc-gen-knit-ts/eslint.config.mjs deleted file mode 100644 index b4cfe875..00000000 --- a/packages/protoc-gen-knit-ts/eslint.config.mjs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2023-2024 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import config from "eslint-config-custom"; - -export default config; diff --git a/packages/protoc-gen-knit-ts/package.json b/packages/protoc-gen-knit-ts/package.json index 4d5a979a..373fe465 100644 --- a/packages/protoc-gen-knit-ts/package.json +++ b/packages/protoc-gen-knit-ts/package.json @@ -15,7 +15,6 @@ "node": ">=18" }, "scripts": { - "lint": "eslint .", "clean": "rm -rf ./dist/cjs/*", "build": "esbuild src/index.ts --bundle --platform=node --target=node18 --outdir=./dist/cjs --external:@bufbuild/protoplugin --external:@bufbuild/protobuf --external:@bufbuild/protobuf/* && echo >./dist/cjs/package.json '{\"type\":\"commonjs\"}'" }, @@ -35,7 +34,6 @@ "@buf/bufbuild_knit.bufbuild_es": "2.12.0-20250213130123-9561c696fd69.1", "@bufbuild/protobuf": "^2.12.0", "esbuild": "^0.28.1", - "eslint-config-custom": "workspace:*", "tsconfig": "workspace:*" } } diff --git a/packages/protoc-gen-knit-ts/src/index.ts b/packages/protoc-gen-knit-ts/src/index.ts index f9416a3a..b2be1a5a 100644 --- a/packages/protoc-gen-knit-ts/src/index.ts +++ b/packages/protoc-gen-knit-ts/src/index.ts @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -/* eslint-disable no-case-declarations,@typescript-eslint/unbound-method */ import { createEcmaScriptPlugin, type Schema, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f39d5a43..6c6552c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,15 +7,15 @@ importers: '@arethetypeswrong/cli': specifier: ^0.18.3 version: 0.18.3 + '@biomejs/biome': + specifier: ^2.5.0 + version: 2.5.0 + '@bufbuild/license-header': + specifier: ^0.0.4 + version: 0.0.4 '@types/node': specifier: ^25.9.3 version: 25.9.3 - eslint-config-custom: - specifier: workspace:* - version: link:packages/eslint-config-custom - prettier: - specifier: ^3.8.4 - version: 3.8.4 turbo: specifier: ^2.9.18 version: 2.9.18 @@ -23,37 +23,6 @@ importers: specifier: ^6.0.3 version: 6.0.3 - packages/eslint-config-custom: - dependencies: - '@eslint/compat': - specifier: ^2.1.0 - version: 2.1.0(eslint@10.5.0) - '@eslint/js': - specifier: ^10.0.1 - version: 10.0.1(eslint@10.5.0) - eslint: - specifier: ^10.5.0 - version: 10.5.0 - eslint-config-prettier: - specifier: ^10.1.8 - version: 10.1.8(eslint@10.5.0) - eslint-config-turbo: - specifier: ^2.9.18 - version: 2.9.18(eslint@10.5.0)(turbo@2.9.18) - eslint-plugin-notice: - specifier: ^1.0.0 - version: 1.0.0(eslint@10.5.0) - globals: - specifier: ^17.6.0 - version: 17.6.0 - typescript-eslint: - specifier: ^8.61.0 - version: 8.61.0(eslint@10.5.0)(typescript@6.0.3) - devDependencies: - typescript: - specifier: ^6.0.3 - version: 6.0.3 - packages/knit: dependencies: '@bufbuild/protobuf': @@ -72,9 +41,6 @@ importers: '@bufbuild/knit-test-spec': specifier: workspace:* version: link:../knit-test-spec - eslint-config-custom: - specifier: workspace:* - version: link:../eslint-config-custom tsconfig: specifier: workspace:* version: link:../tsconfig @@ -115,9 +81,6 @@ importers: esbuild: specifier: ^0.28.1 version: 0.28.1 - eslint-config-custom: - specifier: workspace:* - version: link:../eslint-config-custom tsconfig: specifier: workspace:* version: link:../tsconfig @@ -126,11 +89,6 @@ importers: packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: false - /@andrewbranch/untar.js@1.0.3: resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} dev: true @@ -163,6 +121,93 @@ packages: validate-npm-package-name: 5.0.1 dev: true + /@biomejs/biome@2.5.0: + resolution: {integrity: sha512-4kURkd9hAPrdDM3C9n82ycYgx8hvQcW6MjKTEejruj8rK0N8P3OPpdy8BvI8kt3KWY4ycF5XtDOrktetEfhfuw==} + engines: {node: '>=14.21.3'} + hasBin: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.5.0 + '@biomejs/cli-darwin-x64': 2.5.0 + '@biomejs/cli-linux-arm64': 2.5.0 + '@biomejs/cli-linux-arm64-musl': 2.5.0 + '@biomejs/cli-linux-x64': 2.5.0 + '@biomejs/cli-linux-x64-musl': 2.5.0 + '@biomejs/cli-win32-arm64': 2.5.0 + '@biomejs/cli-win32-x64': 2.5.0 + dev: true + + /@biomejs/cli-darwin-arm64@2.5.0: + resolution: {integrity: sha512-Mn3Fwi3SA5fgmfCPqmzpWF2DLZnms3BVAhM088nTnGrTZmHS3wwIjcoZPqpXeNgd3DrrLH6xp8vTLIBuJoZiXw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-darwin-x64@2.5.0: + resolution: {integrity: sha512-rg3VPL5P8mYro6pqlXYXuJWph21slVp3SZtAqWSrkZs40d2gTzYmHF8E/X1iTID25btmNKltNDJ926sqVBp7DQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64-musl@2.5.0: + resolution: {integrity: sha512-vQdM4oSGaf7ZNeGO9w5+Y8SBtyser9M6znxYbm7Ec8wInxJu1WiKxFYZW5Auj2d80bcVvefuGGRxoFOE0eee8g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64@2.5.0: + resolution: {integrity: sha512-tl+LW8fdD96/xdeWtWwc82LIOc5CoY7N2AsogLTp5R4ECErYt+8Jl/N68ezN9vzSiqPTxw6vjcihoLPYKZHrlw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64-musl@2.5.0: + resolution: {integrity: sha512-+9hIcMngJ+yGUahXqZuZ8CoWKJE9SAZsFsM3QDvXpNsLbXZ9lqVzgBhOk/jTSYkOA0GLP9eu3teukqpLUojHMg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64@2.5.0: + resolution: {integrity: sha512-zpEGf4RQbFEh8Vt7OmavLyyOzRbtcE9osCqrS1kfvt8jDvxwhKXLSf7n0ebr/ov0RJ9ssP+lhs6C8a9WwFvrQA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-arm64@2.5.0: + resolution: {integrity: sha512-jB0wAvTLI4itx5VidqVUejPQFhRUxiZ9l9FvZ26D5fl6t3qme+ZB4PD3bTSeL1vZ8NI2Rx/zj6H9zcESuGHKGw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-x64@2.5.0: + resolution: {integrity: sha512-VT/lF+GId+67j8aDfLkxdxNoVApsPSTbyAtB3jJq0IWTrY77WXfbPfpngxq0bA6JCEv/7k8C9qWjDRKRznDlyw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@braidai/lang@1.1.2: resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} dev: true @@ -253,6 +298,13 @@ packages: '@bufbuild/buf-win32-x64': 1.70.0 dev: true + /@bufbuild/license-header@0.0.4: + resolution: {integrity: sha512-wOOrMjfLdDAO/BAKzCs/bvMPz61X3+qYC9nUbYxJYLVPFAlXus8aw2jNktyHEvLToCjOhn5EcpyaCpMzPHyHIQ==} + hasBin: true + dependencies: + picomatch: 2.3.2 + dev: true + /@bufbuild/protobuf@2.12.0: resolution: {integrity: sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==} @@ -774,115 +826,6 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.9.1(eslint@10.5.0): - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 10.5.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@eslint-community/regexpp@4.12.2: - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: false - - /@eslint/compat@2.1.0(eslint@10.5.0): - resolution: {integrity: sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^8.40 || 9 || 10 - peerDependenciesMeta: - eslint: - optional: true - dependencies: - '@eslint/core': 1.2.1 - eslint: 10.5.0 - dev: false - - /@eslint/config-array@0.23.5: - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dependencies: - '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@eslint/config-helpers@0.6.0: - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dependencies: - '@eslint/core': 1.2.1 - dev: false - - /@eslint/core@1.2.1: - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dependencies: - '@types/json-schema': 7.0.15 - dev: false - - /@eslint/js@10.0.1(eslint@10.5.0): - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^10.0.0 - peerDependenciesMeta: - eslint: - optional: true - dependencies: - eslint: 10.5.0 - dev: false - - /@eslint/object-schema@3.0.5: - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dev: false - - /@eslint/plugin-kit@0.7.2: - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dependencies: - '@eslint/core': 1.2.1 - levn: 0.4.1 - dev: false - - /@humanfs/core@0.19.2: - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} - dependencies: - '@humanfs/types': 0.15.0 - dev: false - - /@humanfs/node@0.16.8: - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} - dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 - dev: false - - /@humanfs/types@0.15.0: - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} - dev: false - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: false - - /@humanwhocodes/retry@0.4.3: - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - dev: false - /@jridgewell/gen-mapping@0.3.13: resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} dependencies: @@ -1122,6 +1065,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true /@turbo/darwin-arm64@2.9.18: @@ -1129,6 +1073,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true /@turbo/linux-64@2.9.18: @@ -1136,6 +1081,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true /@turbo/linux-arm64@2.9.18: @@ -1143,6 +1089,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true /@turbo/windows-64@2.9.18: @@ -1150,6 +1097,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true /@turbo/windows-arm64@2.9.18: @@ -1157,18 +1105,12 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true - /@types/esrecurse@4.3.1: - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - dev: false - /@types/estree@1.0.8: resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false + dev: true /@types/node@25.9.3: resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} @@ -1176,146 +1118,6 @@ packages: undici-types: 7.24.6 dev: true - /@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0)(eslint@10.5.0)(typescript@6.0.3): - resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.61.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.61.0(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/type-utils': 8.61.0(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.0 - eslint: 10.5.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@8.61.0(eslint@10.5.0)(typescript@6.0.3): - resolution: {integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - dependencies: - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.0 - debug: 4.4.3 - eslint: 10.5.0 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/project-service@8.61.0(typescript@6.0.3): - resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - dependencies: - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) - '@typescript-eslint/types': 8.61.0 - debug: 4.4.3 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@8.61.0: - resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 - dev: false - - /@typescript-eslint/tsconfig-utils@8.61.0(typescript@6.0.3): - resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - dependencies: - typescript: 6.0.3 - dev: false - - /@typescript-eslint/type-utils@8.61.0(eslint@10.5.0)(typescript@6.0.3): - resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.5.0)(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.5.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@8.61.0: - resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: false - - /@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3): - resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - dependencies: - '@typescript-eslint/project-service': 8.61.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.8.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@8.61.0(eslint@10.5.0)(typescript@6.0.3): - resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - eslint: 10.5.0 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/visitor-keys@8.61.0: - resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@typescript-eslint/types': 8.61.0 - eslint-visitor-keys: 5.0.1 - dev: false - /@typescript/vfs@1.6.2(typescript@5.4.5): resolution: {integrity: sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==} peerDependencies: @@ -1326,35 +1128,12 @@ packages: transitivePeerDependencies: - supports-color - /acorn-jsx@5.3.2(acorn@8.17.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.17.0 - dev: false - /acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: false - /ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -1383,18 +1162,6 @@ packages: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - dev: false - - /brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} - engines: {node: 18 || 20 || >=22} - dependencies: - balanced-match: 4.0.4 - dev: false - /bundle-require@5.1.0(esbuild@0.27.2): resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1499,15 +1266,6 @@ packages: engines: {node: ^14.18.0 || >=16.10.0} dev: true - /cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: false - /debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1519,15 +1277,6 @@ packages: dependencies: ms: 2.1.3 - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: false - - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false - /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -1614,162 +1363,6 @@ packages: engines: {node: '>=6'} dev: true - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: false - - /eslint-config-prettier@10.1.8(eslint@10.5.0): - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 10.5.0 - dev: false - - /eslint-config-turbo@2.9.18(eslint@10.5.0)(turbo@2.9.18): - resolution: {integrity: sha512-zgbFkvM7+qoWxL/JJ7ytEEE5DHg/xsAv1qzzIAyQEYkROIMKk/0mBb3sjxF/qjHjOuwVF8ZYX2P014qLG/Ng9g==} - peerDependencies: - eslint: '>6.6.0' - turbo: '>2.0.0' - dependencies: - eslint: 10.5.0 - eslint-plugin-turbo: 2.9.18(eslint@10.5.0)(turbo@2.9.18) - turbo: 2.9.18 - dev: false - - /eslint-plugin-notice@1.0.0(eslint@10.5.0): - resolution: {integrity: sha512-M3VLQMZzZpvfTZ/vy9FmClIKq5rLBbQpM0KgfLZPJPrVXpmJYeobmmb+lfJzHWdNm8PWwvw8KlafQWo2N9xx1Q==} - peerDependencies: - eslint: '>=3.0.0' - dependencies: - eslint: 10.5.0 - find-root: 1.1.0 - lodash: 4.17.21 - metric-lcs: 0.1.2 - dev: false - - /eslint-plugin-turbo@2.9.18(eslint@10.5.0)(turbo@2.9.18): - resolution: {integrity: sha512-WbvNDtwxyNQnX6ODtWs39EutD8a2Eoh25EgGkSqbqRpw8llHG/waCgBUwUUG7i1yh73d6p4HNBWEk+C+mvx9Xw==} - peerDependencies: - eslint: '>6.6.0' - turbo: '>2.0.0' - dependencies: - dotenv: 16.0.3 - eslint: 10.5.0 - turbo: 2.9.18 - dev: false - - /eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: false - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dev: false - - /eslint@10.5.0: - resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.15.0 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 - natural-compare: 1.4.0 - optionator: 0.9.3 - transitivePeerDependencies: - - supports-color - dev: false - - /espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) - eslint-visitor-keys: 5.0.1 - dev: false - - /esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: false - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: false - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: false - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: false - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: false - /fdir@6.5.0(picomatch@4.0.4): resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1780,30 +1373,12 @@ packages: optional: true dependencies: picomatch: 4.0.4 + dev: true /fflate@0.8.3: resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} dev: true - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - dependencies: - flat-cache: 4.0.1 - dev: false - - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: false - /fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} dependencies: @@ -1812,18 +1387,6 @@ packages: rollup: 4.55.1 dev: true - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - dependencies: - flatted: 3.4.2 - keyv: 4.5.4 - dev: false - - /flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - dev: false - /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1837,18 +1400,6 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: false - - /globals@17.6.0: - resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} - engines: {node: '>=18'} - dev: false - /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1858,73 +1409,16 @@ packages: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: false - - /ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - dev: false - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: false - /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: false - /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: false - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: false - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: false - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: false - /lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1939,17 +1433,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - /lru-cache@11.5.1: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} @@ -1983,17 +1466,6 @@ packages: hasBin: true dev: true - /metric-lcs@0.1.2: - resolution: {integrity: sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA==} - dev: false - - /minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} - dependencies: - brace-expansion: 5.0.6 - dev: false - /mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} dependencies: @@ -2014,10 +1486,6 @@ packages: thenify-all: 1.6.0 dev: true - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: false - /node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} @@ -2033,32 +1501,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: false - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: false - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: false - /parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} dependencies: @@ -2073,16 +1515,6 @@ packages: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: false - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: false - /pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} dev: true @@ -2091,9 +1523,15 @@ packages: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} dev: true + /picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + dev: true + /picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + dev: true /pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} @@ -2130,22 +1568,6 @@ packages: tsx: 4.22.4 dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: false - - /prettier@3.8.4: - resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: false - /readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -2200,18 +1622,7 @@ packages: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: false - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: false + dev: true /skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} @@ -2293,21 +1704,13 @@ packages: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + dev: true /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true - /ts-api-utils@2.5.0(typescript@6.0.3): - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - dependencies: - typescript: 6.0.3 - dev: false - /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true @@ -2376,30 +1779,7 @@ packages: '@turbo/linux-arm64': 2.9.18 '@turbo/windows-64': 2.9.18 '@turbo/windows-arm64': 2.9.18 - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: false - - /typescript-eslint@8.61.0(eslint@10.5.0)(typescript@6.0.3): - resolution: {integrity: sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - dependencies: - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0)(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.61.0(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.5.0)(typescript@6.0.3) - eslint: 10.5.0 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - dev: false + dev: true /typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} @@ -2416,6 +1796,7 @@ packages: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true + dev: true /ufo@1.6.2: resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} @@ -2430,25 +1811,11 @@ packages: engines: {node: '>=4'} dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: false - /validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2480,8 +1847,3 @@ packages: y18n: 5.0.8 yargs-parser: 20.2.9 dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: false diff --git a/turbo.json b/turbo.json index d9e72efc..1cef7bb0 100644 --- a/turbo.json +++ b/turbo.json @@ -23,9 +23,6 @@ "typecheck": { "outputs": [] }, - "lint": { - "outputs": [] - }, "clean": { "cache": false, "outputs": [] @@ -35,8 +32,5 @@ "persistent": true } }, - "globalDependencies": [ - "packages/eslint-config-custom/index.js", - "packages/tsconfig/*.json" - ] + "globalDependencies": ["packages/tsconfig/*.json"] } From 750dd0cef0b674b2451e9a7f8b7562f9c97faa64 Mon Sep 17 00:00:00 2001 From: Timo Stamm Date: Wed, 17 Jun 2026 14:33:17 +0200 Subject: [PATCH 4/5] Replace prettier-ignore --- packages/knit/src/schema.ts | 144 +++++++++++++++---------------- packages/knit/src/scope.ts | 34 ++++---- packages/knit/src/utils/types.ts | 9 +- 3 files changed, 89 insertions(+), 98 deletions(-) diff --git a/packages/knit/src/schema.ts b/packages/knit/src/schema.ts index c4053018..74f0ed04 100644 --- a/packages/knit/src/schema.ts +++ b/packages/knit/src/schema.ts @@ -71,32 +71,33 @@ export type ErrorStrategyCatch = { "@catch": Record }; * This can be used to create reusable sub-queries that can be expanded in other queries. * */ -//prettier-ignore +// biome-ignore format: hand-formatted conditional type for readability export type Query = T extends OneofMarker - ? OneofQuery> - : T extends (infer E)[] - ? Query - : T extends MapMarker - ? Query - : T extends EnumMarker - ? ScalarQuery - : T extends AliasMarker - ? Query - : T extends keyof WktTypeTable - ? ScalarQuery - : T extends Uint8Array - ? ScalarQuery - : T extends RelationMarker - ? (P extends undefined - ? Query - : { $: Parameter

} & Query) & - ErrorStrategy - : T extends AnyRecord - ? { [P in keyof T]?: Query } - : T extends undefined - ? never - : ScalarQuery; + ? OneofQuery> + : T extends (infer E)[] + ? Query + : T extends MapMarker + ? Query + : T extends EnumMarker + ? ScalarQuery + : T extends AliasMarker + ? Query + : T extends keyof WktTypeTable + ? ScalarQuery + : T extends Uint8Array + ? ScalarQuery + : T extends RelationMarker + ? ( + P extends undefined + ? Query + : { $: Parameter

} & Query + ) & ErrorStrategy + : T extends AnyRecord + ? { [P in keyof T]?: Query } + : T extends undefined + ? never + : ScalarQuery; /** * Parameter converts the generated schemas into their parameter variants that @@ -115,32 +116,28 @@ export type Query = * } * ``` */ -//prettier-ignore +// biome-ignore format: hand-formatted conditional type for readability export type Parameter = T extends OneofMarker - ? Oneof> - : T extends (infer E)[] - ? Array> - : T extends MapMarker - ? { [P in keyof M]: Parameter } - : T extends EnumMarker - ? E - : T extends AliasMarker - ? Alias> - : T extends keyof WktTypeTable - ? WktTypeTable[T] - : T extends Uint8Array - ? Uint8Array - : T extends AnyRecord - ? { - // Exclude the Knit relation fields - [K in keyof T as T[K] extends - | RelationMarker - | undefined - ? never - : K]?: Parameter; - } - : T; + ? Oneof> + : T extends (infer E)[] + ? Array> + : T extends MapMarker + ? { [P in keyof M]: Parameter } + : T extends EnumMarker + ? E + : T extends AliasMarker + ? Alias> + : T extends keyof WktTypeTable + ? WktTypeTable[T] + : T extends Uint8Array + ? Uint8Array + : T extends AnyRecord + ? { + // Exclude the Knit relation fields + [K in keyof T as T[K] extends RelationMarker | undefined ? never : K]?: Parameter; + } + : T; /** * Mask returns the masked result based on a {@link Query}. Useful for getting the results based on @@ -166,35 +163,31 @@ export type Parameter = * // Since the query only has name field, the result also only has the name field. * ``` */ -//prettier-ignore +// biome-ignore format: hand-formatted conditional type for readability export type Mask = R extends OneofMarker - ? Q extends OneofQuery - ? Oneof> - : never - : R extends (infer E)[] - ? Array> - : R extends MapMarker - ? { [K in keyof M]: Mask } - : R extends EnumMarker - ? E - : R extends AliasMarker - ? Mask - : R extends keyof WktTypeTable - ? WktTypeTable[R] - : R extends Uint8Array - ? R - : R extends RelationMarker - ? Mask | ErrorMask - : R extends AnyRecord - ? { - [K in keyof R as K extends keyof Q - ? K - : never]: K extends keyof Q - ? Mask - : never; - } - : R; + ? Q extends OneofQuery ? Oneof> : never + : R extends (infer E)[] + ? Array> + : R extends MapMarker + ? { [K in keyof M]: Mask } + : R extends EnumMarker + ? E + : R extends AliasMarker + ? Mask + : R extends keyof WktTypeTable + ? WktTypeTable[R] + : R extends Uint8Array + ? R + : R extends RelationMarker + ? Mask | ErrorMask + : R extends AnyRecord + ? { + [K in keyof R as K extends keyof Q ? K : never]: K extends keyof Q + ? Mask + : never; + } + : R; /** * Markers used to identify type that needs special handling. @@ -229,7 +222,6 @@ type WktTypeTable = { "@wkt/BytesValue": Uint8Array; }; -//prettier-ignore type ErrorMask = Q extends ErrorStrategyCatch ? KnitError : Q extends ErrorStrategyThrow diff --git a/packages/knit/src/scope.ts b/packages/knit/src/scope.ts index b650cd93..6fc94563 100644 --- a/packages/knit/src/scope.ts +++ b/packages/knit/src/scope.ts @@ -110,8 +110,12 @@ function scopeResult(result: { [k: string]: unknown }, scope: string) { * For the string `com.example.foo.v1.FooService` as S and `.` as C, the expected * result is "com" | "com.example" | "com.example.foo" | "com.example.foo.v1" */ -// prettier-ignore -type Split = +// biome-ignore format: hand-formatted recursive type for readability +type Split< + S extends string, + C extends string, + P extends string = "" +> = // Check to see if S has at least one `C` somewhere. // This always matches the first `C`. // @@ -119,19 +123,19 @@ type Split = // L -> com // R -> example.foo.v1.FooService S extends `${infer L}${C}${infer R}` - ? // Prefix `L` with `P`, for the first run P is always ''. - // - // For com.example.foo.v1.FooService - // - // First iteration: - // "com" | Split<"example.foo.v1.FooService", ".", "com."> - // - // Second iteration: - // "com.example" | Split<"foo.v1.FooService", ".", "com.example."> - `${P}${L}` | Split - : // Last iteration: - // `never`. `|` with never is a noop. - never; + // Prefix `L` with `P`, for the first run P is always ''. + // + // For com.example.foo.v1.FooService + // + // First iteration: + // "com" | Split<"example.foo.v1.FooService", ".", "com."> + // + // Second iteration: + // "com.example" | Split<"foo.v1.FooService", ".", "com.example."> + ? `${P}${L}` | Split + // Last iteration: + // `never`. `|` with never is a noop. + : never; /** * Scope a Schema to only include services that have the prefix `P` and diff --git a/packages/knit/src/utils/types.ts b/packages/knit/src/utils/types.ts index 44620cc7..035c1046 100644 --- a/packages/knit/src/utils/types.ts +++ b/packages/knit/src/utils/types.ts @@ -18,8 +18,7 @@ * A type that requires exactly one of the properties of an object to be set. */ export type ExactlyOne = { - [K in keyof T]-?: Required> & - Partial, never>>; //prettier-ignore + [K in keyof T]-?: Required> & Partial, never>>; // biome-ignore format: keep mapped type on a single line }[keyof T]; /** @@ -27,8 +26,7 @@ export type ExactlyOne = { * */ export type OneOrMore = { - [K in keyof T]-?: Required> & - Partial>>; //prettier-ignore + [K in keyof T]-?: Required> & Partial>>; // biome-ignore format: keep mapped type on a single line }[keyof T]; /** @@ -49,7 +47,6 @@ export type AnyRecord = { [K in string]: any }; * * @link https://github.com/microsoft/TypeScript/issues/27024#issuecomment-421529650 */ -//prettier-ignore export type Equal = (() => T extends L ? 1 : 2) extends () => T extends R ? 1 : 2 ? true @@ -63,7 +60,6 @@ export type DistributiveKeyOf = T extends T ? keyof T : never; /** * Seals `I` to only contain field of `T`. */ -//prettier-ignore export type Subset = Equal extends true ? T @@ -73,7 +69,6 @@ export type Subset = ? SubsetRecord : T; -//prettier-ignore type SubsetRecord = { [P in keyof T]: Subset

; } & Record>, never>; From 63e39edbf2e3ea7558ab07e822d865643026d7d7 Mon Sep 17 00:00:00 2001 From: Timo Stamm Date: Wed, 17 Jun 2026 14:41:37 +0200 Subject: [PATCH 5/5] Add "typecheck" script to protoc-gen-knit --- packages/protoc-gen-knit-ts/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/protoc-gen-knit-ts/package.json b/packages/protoc-gen-knit-ts/package.json index 373fe465..c2f44e3b 100644 --- a/packages/protoc-gen-knit-ts/package.json +++ b/packages/protoc-gen-knit-ts/package.json @@ -16,6 +16,7 @@ }, "scripts": { "clean": "rm -rf ./dist/cjs/*", + "typecheck": "tsc --noEmit", "build": "esbuild src/index.ts --bundle --platform=node --target=node18 --outdir=./dist/cjs --external:@bufbuild/protoplugin --external:@bufbuild/protobuf --external:@bufbuild/protobuf/* && echo >./dist/cjs/package.json '{\"type\":\"commonjs\"}'" }, "preferUnplugged": true,