From 68702cde95046759eb9e1cbcc4d5ccb0647b320e Mon Sep 17 00:00:00 2001 From: Vasek - Tom C Date: Wed, 12 Aug 2026 19:56:17 +0200 Subject: [PATCH] test(library): vendor the introspector's own test suite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vendoring the library left its tests behind, so library/src had nothing verifying it. The introspector's suite is the part that matters here: it scans the fixture modules under testdata and compares against a recorded expectation, which is the contract entrypoint generation rests on. Our own golden pins the renderer given a typedef; nothing pinned the typedef given a module. 46 tests, run in the same bun container that builds the bundle. The specs needing a live session (invoke, registry, api, connect) are left out: they would need an engine inside the test container, and they cover the library's runtime rather than anything this SDK generates. Adding the test dependencies exposed that the build was not as reproducible as claimed. A rebuild from an unchanged tree quietly gained transitive modules — yarn.lock is a yarn v1 file that does not pin everything bun resolves. Both lockfiles now sit in the tree and neither is redundant: dropping yarn.lock pulls newer transitives and grows core.js by a quarter, while bun.lock pins what bun actually installs. The install is frozen against it, so drift fails the install instead of silently changing the bundle. Signed-off-by: Tom Chauveau --- .dagger/modules/packager/main.dang | 37 +- library/.mocharc.json | 6 + library/bun.lock | 582 ++++++++++++++++++ library/bundle/core.js | 125 +++- library/bundle/introspector.js | 125 +++- library/package.json | 11 +- .../introspector/test/case_convertor.spec.ts | 70 +++ .../module/introspector/test/files.spec.ts | 21 + .../test/introspection_json.spec.ts | 107 ++++ .../src/module/introspector/test/scan.spec.ts | 208 +++++++ .../test/testdata/alias/expected.json | 200 ++++++ .../introspector/test/testdata/alias/index.ts | 61 ++ .../test/testdata/constructor/expected.json | 58 ++ .../test/testdata/constructor/index.ts | 21 + .../test/testdata/context/expected.json | 59 ++ .../test/testdata/context/index.ts | 21 + .../testdata/coreEnumDefault/expected.json | 36 ++ .../test/testdata/coreEnumDefault/index.ts | 12 + .../test/testdata/coreEnums/expected.json | 54 ++ .../test/testdata/coreEnums/index.ts | 15 + .../test/testdata/decorators/expected.json | 291 +++++++++ .../test/testdata/decorators/index.ts | 158 +++++ .../testdata/deprecatedArgument/expected.json | 63 ++ .../test/testdata/deprecatedArgument/index.ts | 18 + .../testdata/deprecatedEnum/expected.json | 58 ++ .../test/testdata/deprecatedEnum/index.ts | 17 + .../testdata/deprecatedField/expected.json | 65 ++ .../test/testdata/deprecatedField/index.ts | 26 + .../testdata/deprecatedFunction/expected.json | 40 ++ .../test/testdata/deprecatedFunction/index.ts | 24 + .../testdata/deprecatedObject/expected.json | 40 ++ .../test/testdata/deprecatedObject/index.ts | 24 + .../test/testdata/enums/expected.json | 71 +++ .../introspector/test/testdata/enums/index.ts | 34 + .../test/testdata/generate_expected_scan.ts | 55 ++ .../test/testdata/helloWorld/expected.json | 33 + .../test/testdata/helloWorld/helloWorld.ts | 12 + .../test/testdata/helloWorld/toIgnore.md | 0 .../test/testdata/interface/expected.json | 134 ++++ .../test/testdata/interface/index.ts | 42 ++ .../test/testdata/invalid/expected.json | 6 + .../test/testdata/invalid/index.ts | 1 + .../legacyEnumDecorator/expected.json | 71 +++ .../testdata/legacyEnumDecorator/index.ts | 35 ++ .../test/testdata/list/expected.json | 103 ++++ .../introspector/test/testdata/list/index.ts | 31 + .../test/testdata/minimal/expected.json | 221 +++++++ .../test/testdata/minimal/index.ts | 73 +++ .../test/testdata/multiArgs/expected.json | 53 ++ .../test/testdata/multiArgs/index.ts | 11 + .../test/testdata/multipleObjects/bar.ts | 20 + .../testdata/multipleObjects/expected.json | 53 ++ .../test/testdata/multipleObjects/foo.ts | 21 + .../multipleObjectsAsFields/expected.json | 65 ++ .../testdata/multipleObjectsAsFields/index.ts | 14 + .../testdata/multipleObjectsAsFields/lint.ts | 9 + .../testdata/multipleObjectsAsFields/test.ts | 9 + .../test/testdata/noDecorators/expected.json | 6 + .../testdata/noDecorators/noDecorators.ts | 12 + .../test/testdata/objectParam/expected.json | 111 ++++ .../test/testdata/objectParam/index.ts | 33 + .../testdata/optionalParameter/expected.json | 229 +++++++ .../test/testdata/optionalParameter/index.ts | 48 ++ .../test/testdata/primitives/index.ts | 19 + .../test/testdata/privateMethod/expected.json | 53 ++ .../test/testdata/privateMethod/index.ts | 24 + .../test/testdata/references/expected.json | 186 ++++++ .../test/testdata/references/index.ts | 57 ++ .../test/testdata/references/types.ts | 29 + .../test/testdata/scalar/expected.json | 60 ++ .../test/testdata/scalar/index.ts | 15 + .../test/testdata/state/expected.json | 117 ++++ .../introspector/test/testdata/state/state.ts | 56 ++ .../test/testdata/variadic/expected.json | 122 ++++ .../test/testdata/variadic/index.ts | 24 + .../test/testdata/voidReturn/expected.json | 52 ++ .../test/testdata/voidReturn/index.ts | 17 + 77 files changed, 5089 insertions(+), 11 deletions(-) create mode 100644 library/.mocharc.json create mode 100644 library/bun.lock create mode 100644 library/src/module/introspector/test/case_convertor.spec.ts create mode 100644 library/src/module/introspector/test/files.spec.ts create mode 100644 library/src/module/introspector/test/introspection_json.spec.ts create mode 100644 library/src/module/introspector/test/scan.spec.ts create mode 100644 library/src/module/introspector/test/testdata/alias/expected.json create mode 100644 library/src/module/introspector/test/testdata/alias/index.ts create mode 100644 library/src/module/introspector/test/testdata/constructor/expected.json create mode 100644 library/src/module/introspector/test/testdata/constructor/index.ts create mode 100644 library/src/module/introspector/test/testdata/context/expected.json create mode 100644 library/src/module/introspector/test/testdata/context/index.ts create mode 100644 library/src/module/introspector/test/testdata/coreEnumDefault/expected.json create mode 100644 library/src/module/introspector/test/testdata/coreEnumDefault/index.ts create mode 100644 library/src/module/introspector/test/testdata/coreEnums/expected.json create mode 100644 library/src/module/introspector/test/testdata/coreEnums/index.ts create mode 100644 library/src/module/introspector/test/testdata/decorators/expected.json create mode 100644 library/src/module/introspector/test/testdata/decorators/index.ts create mode 100644 library/src/module/introspector/test/testdata/deprecatedArgument/expected.json create mode 100644 library/src/module/introspector/test/testdata/deprecatedArgument/index.ts create mode 100644 library/src/module/introspector/test/testdata/deprecatedEnum/expected.json create mode 100644 library/src/module/introspector/test/testdata/deprecatedEnum/index.ts create mode 100644 library/src/module/introspector/test/testdata/deprecatedField/expected.json create mode 100644 library/src/module/introspector/test/testdata/deprecatedField/index.ts create mode 100644 library/src/module/introspector/test/testdata/deprecatedFunction/expected.json create mode 100644 library/src/module/introspector/test/testdata/deprecatedFunction/index.ts create mode 100644 library/src/module/introspector/test/testdata/deprecatedObject/expected.json create mode 100644 library/src/module/introspector/test/testdata/deprecatedObject/index.ts create mode 100644 library/src/module/introspector/test/testdata/enums/expected.json create mode 100644 library/src/module/introspector/test/testdata/enums/index.ts create mode 100644 library/src/module/introspector/test/testdata/generate_expected_scan.ts create mode 100644 library/src/module/introspector/test/testdata/helloWorld/expected.json create mode 100644 library/src/module/introspector/test/testdata/helloWorld/helloWorld.ts create mode 100644 library/src/module/introspector/test/testdata/helloWorld/toIgnore.md create mode 100644 library/src/module/introspector/test/testdata/interface/expected.json create mode 100644 library/src/module/introspector/test/testdata/interface/index.ts create mode 100644 library/src/module/introspector/test/testdata/invalid/expected.json create mode 100644 library/src/module/introspector/test/testdata/invalid/index.ts create mode 100644 library/src/module/introspector/test/testdata/legacyEnumDecorator/expected.json create mode 100644 library/src/module/introspector/test/testdata/legacyEnumDecorator/index.ts create mode 100644 library/src/module/introspector/test/testdata/list/expected.json create mode 100644 library/src/module/introspector/test/testdata/list/index.ts create mode 100644 library/src/module/introspector/test/testdata/minimal/expected.json create mode 100644 library/src/module/introspector/test/testdata/minimal/index.ts create mode 100644 library/src/module/introspector/test/testdata/multiArgs/expected.json create mode 100644 library/src/module/introspector/test/testdata/multiArgs/index.ts create mode 100644 library/src/module/introspector/test/testdata/multipleObjects/bar.ts create mode 100644 library/src/module/introspector/test/testdata/multipleObjects/expected.json create mode 100644 library/src/module/introspector/test/testdata/multipleObjects/foo.ts create mode 100644 library/src/module/introspector/test/testdata/multipleObjectsAsFields/expected.json create mode 100644 library/src/module/introspector/test/testdata/multipleObjectsAsFields/index.ts create mode 100644 library/src/module/introspector/test/testdata/multipleObjectsAsFields/lint.ts create mode 100644 library/src/module/introspector/test/testdata/multipleObjectsAsFields/test.ts create mode 100644 library/src/module/introspector/test/testdata/noDecorators/expected.json create mode 100644 library/src/module/introspector/test/testdata/noDecorators/noDecorators.ts create mode 100644 library/src/module/introspector/test/testdata/objectParam/expected.json create mode 100644 library/src/module/introspector/test/testdata/objectParam/index.ts create mode 100644 library/src/module/introspector/test/testdata/optionalParameter/expected.json create mode 100644 library/src/module/introspector/test/testdata/optionalParameter/index.ts create mode 100644 library/src/module/introspector/test/testdata/primitives/index.ts create mode 100644 library/src/module/introspector/test/testdata/privateMethod/expected.json create mode 100644 library/src/module/introspector/test/testdata/privateMethod/index.ts create mode 100644 library/src/module/introspector/test/testdata/references/expected.json create mode 100644 library/src/module/introspector/test/testdata/references/index.ts create mode 100644 library/src/module/introspector/test/testdata/references/types.ts create mode 100644 library/src/module/introspector/test/testdata/scalar/expected.json create mode 100644 library/src/module/introspector/test/testdata/scalar/index.ts create mode 100644 library/src/module/introspector/test/testdata/state/expected.json create mode 100644 library/src/module/introspector/test/testdata/state/state.ts create mode 100644 library/src/module/introspector/test/testdata/variadic/expected.json create mode 100644 library/src/module/introspector/test/testdata/variadic/index.ts create mode 100644 library/src/module/introspector/test/testdata/voidReturn/expected.json create mode 100644 library/src/module/introspector/test/testdata/voidReturn/index.ts diff --git a/.dagger/modules/packager/main.dang b/.dagger/modules/packager/main.dang index abf61d2..b92325c 100644 --- a/.dagger/modules/packager/main.dang +++ b/.dagger/modules/packager/main.dang @@ -48,15 +48,19 @@ type Packager { with the TypeScript compiler left external, plus the rolled-up type declarations for it. - The install resolves through the vendored yarn.lock, which is load-bearing: - letting it resolve freely instead pulls newer transitive versions and grows - core.js by roughly a quarter (4.3 MB -> 5.4 MB). + The install is frozen against the committed bun.lock. Both lockfiles matter and + neither is redundant: yarn.lock is what the vendored sources came with, and + dropping it lets resolution pull newer transitives that grow core.js by roughly + a quarter (4.3 MB -> 5.4 MB); but it is a yarn v1 file that does not pin + everything bun resolves, so without bun.lock a rebuild days later can still + drift — observed as a bundle quietly gaining transitive modules on an unchanged + tree. Freezing makes that drift a failed install instead of a silent diff. """ libraryBundle(ws: Workspace!): Changeset! @generate { let built = bun .withDirectory("/src", ws.directory("/" + libraryPath)) .withWorkdir("/src") - .withExec(["bun", "install"]) + .withExec(["bun", "install", "--frozen-lockfile"]) .withExec(["bun", "build", "./src/index.ts", "--external=typescript", "--target=node", "--outfile", "/out/core.js"]) .withExec(["tsc", "--emitDeclarationOnly"]) .withExec(["bun", "x", "rollup", "-c", "rollup.dts.config.mjs", "-o", "/out/core.d.ts"]) @@ -104,6 +108,31 @@ type Packager { .withExec(["bun", "install", "-g", "typescript"]) } + """ + Run the vendored library's own test suite. + + Mostly the introspector's: it scans the fixture modules under testdata and + compares the result against a recorded expectation. That is the contract + entrypoint generation is built on — the scanner's output is what the + dispatcher is rendered from — and nothing else here would notice it drifting, + since our own golden pins the renderer given a typedef, not the typedef given + a module. + + The specs that need a live session (invoke, registry, api, connect) are not + vendored: they would need an engine inside this container, and what they cover + is the library's runtime rather than anything this SDK generates. + """ + libraryTests(ws: Workspace!): Void @check { + bun + .withDirectory("/src", ws.directory("/" + libraryPath)) + .withWorkdir("/src") + .withExec(["bun", "install"]) + .withExec(["bun", "run", "--bun", "mocha"]) + .sync + + null + } + """ Container with the codegen helper compiled and on PATH at /usr/local/bin/codegen. Read from the workspace rather than this module's own diff --git a/library/.mocharc.json b/library/.mocharc.json new file mode 100644 index 0000000..f2fbd9f --- /dev/null +++ b/library/.mocharc.json @@ -0,0 +1,6 @@ +{ + "extension": ["ts"], + "spec": "**/*.spec.ts", + "loader": "ts-node/esm", + "timeout": 60000 +} diff --git a/library/bun.lock b/library/bun.lock new file mode 100644 index 0000000..8ab4ee4 --- /dev/null +++ b/library/bun.lock @@ -0,0 +1,582 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "@dagger.io/dagger", + "dependencies": { + "@grpc/grpc-js": "^1.14.4", + "@lifeomic/axios-fetch": "^3.1.0", + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/core": "^2.8.0", + "@opentelemetry/exporter-jaeger": "^2.8.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.219.0", + "@opentelemetry/sdk-metrics": "^2.8.0", + "@opentelemetry/sdk-node": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.41.1", + "adm-zip": "^0.5.18", + "env-paths": "^4.0.0", + "execa": "^9.6.1", + "graphql": "^17.0.1", + "graphql-request": "^7.4.0", + "graphql-tag": "^2.12.7", + "node-color-log": "^14.0.0", + "node-fetch": "^3.3.2", + "reflect-metadata": "^0.2.2", + "tar": "^7.5.19", + "typescript": "^6.0.3", + }, + "devDependencies": { + "@types/adm-zip": "^0.5.8", + "@types/mocha": "^10.0.10", + "@types/node": "~26.0.1", + "@types/tar": "^7.0.87", + "mocha": "^11.7.6", + "rollup": "^4.62.2", + "rollup-plugin-dts": "^6.4.1", + "ts-node": "^10.9.2", + }, + }, + }, + "overrides": { + "@grpc/grpc-js": "1.14.4", + "form-data": "4.0.6", + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", {}, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.14.4", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], + + "@isaacs/cliui": ["@isaacs/cliui@https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@lifeomic/axios-fetch": ["@lifeomic/axios-fetch@https://registry.npmjs.org/@lifeomic/axios-fetch/-/axios-fetch-3.1.0.tgz", { "dependencies": { "@types/node-fetch": "^2.5.10" } }, "sha512-C6ceAnh8W19KuekFsCiK1A+AMBirQFTnoEqMZQ7HE6VXJ18zjGofdXxLU8RTo2gZp/yZK5ufmPwIvRtejj1gxg=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], + + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.219.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg=="], + + "@opentelemetry/configuration": ["@opentelemetry/configuration@0.219.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "yaml": "^2.0.0" } }, "sha512-wXZUYv4ngu43nA4WEhuXNacm46LW+17LRM8nKyIhBzroRA24PBYjMnakwzR/w777nFUB5xlgsYTTeuXxumZM1Q=="], + + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.8.0", "", {}, "sha512-/3FIraneMcng67SUJCxvyInk/oxzwsxyadufk0wwfOBLf5wqtAGX4MoQASwSbndBPeARzBryUM9Azr5kHIdWLw=="], + + "@opentelemetry/core": ["@opentelemetry/core@2.8.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" } }, "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww=="], + + "@opentelemetry/exporter-jaeger": ["@opentelemetry/exporter-jaeger@2.8.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0", "@opentelemetry/semantic-conventions": "^1.29.0", "jaeger-client": "^3.15.0" } }, "sha512-fPXK9zj/gKCOFM30MMmVhiVBrF831dSCoja7gX24FBcBl8h2H+mwgr+RYqcGlBXNihhmxI6iS1RMchYZjqTzkg=="], + + "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.219.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/sdk-logs": "0.219.0" } }, "sha512-7SvzDCIclHWAcCwZ1MTOLcwn4BVNPGI3QxS/DJraPNe1TTL+4TvUBq5zeQV8tsnYvtDN7wKW2qocVmaCP2l7sQ=="], + + "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.219.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.219.0", "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/sdk-logs": "0.219.0" } }, "sha512-mhl2HL6GmZI8b8PwPfqMws/5ovJfbRTxwc9Y5agVVHiQ+e5SL1btsFr/kJDgt7YCexDtsUn5HAreHQO9szFS0A=="], + + "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.219.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.219.0", "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-logs": "0.219.0", "@opentelemetry/sdk-trace-base": "2.8.0" } }, "sha512-Ayw4Gf71PS9jhBVaYywa4WsajnqfDehMkTdVH3TSAVHqPcsAv/AhH/wTNRYNt99szeYr6Gbd/D6RjZD77wAxHg=="], + + "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.219.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.8.0", "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-metrics": "2.8.0" } }, "sha512-6LaaSrPxK5L55bXevWajvOMxGOpNm0n12tG53TeZaUeNzXwLPg6d2KCC1zAlGsojan+xRG71mA4Qqs9K2VVrKQ=="], + + "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.219.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-metrics": "2.8.0" } }, "sha512-6CaDRbMVHZSDWzNXwrR8y/H4B/Z1eMNnkHiPQlTx3Ojz2OHY4X/aff/UC4P/3pHUQSuTfi3oh2UsPPZppw+Vrg=="], + + "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.219.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-metrics": "2.8.0" } }, "sha512-DUS7XyIiEnoeccQUvuKy0G2/YqeKhpN8FVIrGbrLNIVMj10yeIFLRzRv0tibCI2kXXvlTTABVexGAk78wHk2ug=="], + + "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.219.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-metrics": "2.8.0", "@opentelemetry/semantic-conventions": "^1.29.0" } }, "sha512-TxOnJ85eWJY5JyOJsNMXiRTYlkDcOv0u3KbXEzWCc+tUS9sjL/BC6BcdxZ0B9r2OFVqsrZFXUzSD2sZUy42Ucw=="], + + "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.219.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0" } }, "sha512-BkDNv1UD6BscW19MxbAxVmSYSSFuyeqR6buV2/HTYqA7GrR0EbTFzqG6h86T3PtXmpdbsWjMGLDdjG2rikG27Q=="], + + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.219.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0" } }, "sha512-9t6SvBXXBEjOBcIzgozvBbd3jWrv3Gt3ngGhl1fhdZ/zRc7oZDVOFEqbi2zlBpW9BXhgDMKv422J0DL/3iQWfw=="], + + "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.219.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0" } }, "sha512-lF/LUBfhOFmxJa+SQsLN7ziV4MHa2pyKgOM6JNehSOfU+npjM4gwm9oIKEJrzrWcexMcqydiyoFy0XCb1Ql3wQ=="], + + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@2.8.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0", "@opentelemetry/semantic-conventions": "^1.29.0" } }, "sha512-Mj84UkEa17BK2o903VTXW3wM8CrSZexGs4tRGVZVIMM9ni1T6TuGx5IrRfoWKAbshx42D5/kc7YV+axypLPYyA=="], + + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.219.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.219.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" } }, "sha512-X5t7I8GyIO9rmGHwoedZLREpQqrF1WW2nxzNNym6HOKpFiE+rvqV3ngC0xcZVO2YwIGf3KKmRdWrYwdwz3H9RQ=="], + + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.219.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-transformer": "0.219.0" } }, "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA=="], + + "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.219.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.8.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-transformer": "0.219.0" } }, "sha512-iIk/s8QQu39zpTrRRmsW/Eg3SE2+Hg8tLWepr2FLRgmwUpNd0IpCTLJEHJ77hpt4hgIS8MAh44UYI4xQPZwWlw=="], + + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.219.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.219.0", "@opentelemetry/core": "2.8.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-logs": "0.219.0", "@opentelemetry/sdk-metrics": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0" } }, "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ=="], + + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@2.8.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0" } }, "sha512-SazlvuSKi5533rPHTW2TwBwdMakhjZST4SYs0YauuvfGDkT13KbG1gJS75hV0uWVeevhtVP9sAIlaZLTHdSbMg=="], + + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@2.8.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0" } }, "sha512-Xnz9zZvvQzUw+9DrOn0MomR7BxFCkA2pcfXBQuHC28ndJpSbjLs7knzYb05kw5SyCjSsEWombkZMgGcJSk8JVg=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@2.8.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/semantic-conventions": "^1.29.0" } }, "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.219.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.219.0", "@opentelemetry/core": "2.8.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/semantic-conventions": "^1.29.0" } }, "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.8.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/resources": "2.8.0" } }, "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg=="], + + "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.219.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.219.0", "@opentelemetry/configuration": "0.219.0", "@opentelemetry/context-async-hooks": "2.8.0", "@opentelemetry/core": "2.8.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.219.0", "@opentelemetry/exporter-logs-otlp-http": "0.219.0", "@opentelemetry/exporter-logs-otlp-proto": "0.219.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.219.0", "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.219.0", "@opentelemetry/exporter-prometheus": "0.219.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.219.0", "@opentelemetry/exporter-trace-otlp-http": "0.219.0", "@opentelemetry/exporter-trace-otlp-proto": "0.219.0", "@opentelemetry/exporter-zipkin": "2.8.0", "@opentelemetry/instrumentation": "0.219.0", "@opentelemetry/otlp-exporter-base": "0.219.0", "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", "@opentelemetry/propagator-b3": "2.8.0", "@opentelemetry/propagator-jaeger": "2.8.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/sdk-logs": "0.219.0", "@opentelemetry/sdk-metrics": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0", "@opentelemetry/sdk-trace-node": "2.8.0", "@opentelemetry/semantic-conventions": "^1.29.0" } }, "sha512-NWLpWLEb8gV3+JBHYoIrktbM385wyHpRJoh3J/4Q52d4PR+AlPMNGJT3DzBUrDSUEVbKAXoHR+EDAPxtiNcj8g=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.8.0", "", { "dependencies": { "@opentelemetry/core": "2.8.0", "@opentelemetry/resources": "2.8.0", "@opentelemetry/semantic-conventions": "^1.29.0" } }, "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ=="], + + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.8.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.8.0", "@opentelemetry/core": "2.8.0", "@opentelemetry/sdk-trace-base": "2.8.0" } }, "sha512-nZt9OGufioAc3AfoLTqA9bsAeaMJAictYDdI2VcNQ+PmT+3rfKjAZDZvgPfd8VPX0O5Bw1hdQF6kDK8VSpZiWg=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.1", "", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.1", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="], + + "@protobufjs/float": ["@protobufjs/float@https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.2", "", {}, "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw=="], + + "@protobufjs/path": ["@protobufjs/path@https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.2", "", { "os": "android", "cpu": "arm" }, "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.2", "", { "os": "none", "cpu": "arm64" }, "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA=="], + + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + + "@tsconfig/node10": ["@tsconfig/node10@https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", {}, "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="], + + "@tsconfig/node12": ["@tsconfig/node12@https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], + + "@tsconfig/node14": ["@tsconfig/node14@https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], + + "@tsconfig/node16": ["@tsconfig/node16@https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], + + "@types/adm-zip": ["@types/adm-zip@0.5.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@types/mocha": ["@types/mocha@https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", {}, "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q=="], + + "@types/node": ["@types/node@26.0.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw=="], + + "@types/node-fetch": ["@types/node-fetch@https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g=="], + + "@types/tar": ["@types/tar@7.0.87", "", { "dependencies": { "tar": "*" } }, "sha512-3IxNBV8LeY5oi2ZFpvAhOtW1+mHswkzM7BuisVrwJgPv67GBO2rkLPQlEKtzfHuLdhDDczhkCZeT+RuizMay4A=="], + + "acorn": ["acorn@https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", {}, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-import-attributes": ["acorn-import-attributes@https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", {}, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + + "acorn-walk": ["acorn-walk@https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw=="], + + "adm-zip": ["adm-zip@0.5.18", "", {}, "sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng=="], + + "ansi-color": ["ansi-color@https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", {}, "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ=="], + + "ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "arg": ["arg@https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], + + "argparse": ["argparse@https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "asynckit": ["asynckit@https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "balanced-match": ["balanced-match@https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + + "browser-stdout": ["browser-stdout@https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", {}, "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="], + + "bufrw": ["bufrw@https://registry.npmjs.org/bufrw/-/bufrw-1.4.0.tgz", { "dependencies": { "ansi-color": "^0.2.1", "error": "^7.0.0", "hexer": "^1.5.0", "xtend": "^4.0.0" } }, "sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "camelcase": ["camelcase@https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "chalk": ["chalk@https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chokidar": ["chokidar@https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "cjs-module-lexer": ["cjs-module-lexer@2.2.0", "", {}, "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ=="], + + "cliui": ["cliui@https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "color-convert": ["color-convert@https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "create-require": ["create-require@https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], + + "cross-spawn": ["cross-spawn@https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", {}, "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="], + + "delayed-stream": ["delayed-stream@https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "diff": ["diff@https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], + + "dunder-proto": ["dunder-proto@https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eastasianwidth": ["eastasianwidth@https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "env-paths": ["env-paths@4.0.0", "", { "dependencies": { "is-safe-filename": "^0.1.0" } }, "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw=="], + + "error": ["error@https://registry.npmjs.org/error/-/error-7.0.2.tgz", { "dependencies": { "string-template": "~0.2.1", "xtend": "~4.0.0" } }, "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw=="], + + "es-define-property": ["es-define-property@https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "escalade": ["escalade@https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", {}, "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="], + + "escape-string-regexp": ["escape-string-regexp@https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], + + "fetch-blob": ["fetch-blob@https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "figures": ["figures@https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + + "find-up": ["find-up@https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat": ["flat@https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", {}, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + + "foreground-child": ["foreground-child@https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA=="], + + "form-data": ["form-data@4.0.6", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.4", "mime-types": "^2.1.35" } }, "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ=="], + + "formdata-polyfill": ["formdata-polyfill@https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "fsevents": ["fsevents@https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", {}, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-caller-file": ["get-caller-file@https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + + "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "gopd": ["gopd@https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graphql": ["graphql@17.0.1", "", {}, "sha512-8eWbg5Zcv/8o20nzEjHUGPTj20MLFJjc5kagbIPxbaeGxvFwpitJhemEC/k17n5+UD4M/9ea5rTuce78mELujQ=="], + + "graphql-request": ["graphql-request@7.4.0", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0" } }, "sha512-xfr+zFb/QYbs4l4ty0dltqiXIp07U6sl+tOKAb0t50/EnQek6CVVBLjETXi+FghElytvgaAWtIOt3EV7zLzIAQ=="], + + "graphql-tag": ["graphql-tag@2.12.7", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-xnE/NFzy+0eIesvAsREJZ284zTl/wYuBAvpsFSDhRGRdRHdnE90M21Q3xAWyYInb0J756c6x0pIQ62+vtvOs1Q=="], + + "has-flag": ["has-flag@https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], + + "he": ["he@https://registry.npmjs.org/he/-/he-1.2.0.tgz", {}, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], + + "hexer": ["hexer@https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", { "dependencies": { "ansi-color": "^0.2.1", "minimist": "^1.1.0", "process": "^0.10.0", "xtend": "^4.0.0" } }, "sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg=="], + + "human-signals": ["human-signals@https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + + "import-in-the-middle": ["import-in-the-middle@3.0.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^2.2.0", "module-details-from-path": "^1.0.4" } }, "sha512-OnGy+eYT7wVejH2XWgLRgbmzujhhVIATQH0ztIeRilwHBjTeG3pD+XnH3PKX0r9gJ0BuJmJ68q/oh9qgXnNDQg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-plain-obj": ["is-plain-obj@https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-safe-filename": ["is-safe-filename@0.1.1", "", {}, "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g=="], + + "is-stream": ["is-stream@https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + + "is-unicode-supported": ["is-unicode-supported@https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], + + "isexe": ["isexe@https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jaeger-client": ["jaeger-client@https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz", { "dependencies": { "node-int64": "^0.4.0", "opentracing": "^0.14.4", "thriftrw": "^3.5.0", "uuid": "^8.3.2", "xorshift": "^1.1.1" } }, "sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw=="], + + "js-tokens": ["js-tokens@https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", { "dependencies": { "argparse": "^2.0.1" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "locate-path": ["locate-path@https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.camelcase": ["lodash.camelcase@https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "log-symbols": ["log-symbols@https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + + "long": ["long@https://registry.npmjs.org/long/-/long-5.2.3.tgz", {}, "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="], + + "lru-cache": ["lru-cache@https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "make-error": ["make-error@https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + + "math-intrinsics": ["math-intrinsics@https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mime-db": ["mime-db@https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "minimist": ["minimist@https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "mocha": ["mocha@11.7.6", "", { "dependencies": { "browser-stdout": "^1.3.1", "chokidar": "^4.0.1", "debug": "^4.3.5", "diff": "^7.0.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", "glob": "^10.4.5", "he": "^1.2.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", "minimatch": "^9.0.5", "ms": "^2.1.3", "picocolors": "^1.1.1", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", "workerpool": "^9.2.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" }, "bin": { "mocha": "bin/mocha.js", "_mocha": "bin/_mocha" } }, "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA=="], + + "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], + + "ms": ["ms@https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "node-color-log": ["node-color-log@14.0.0", "", {}, "sha512-vGZzpRBVzXsQO9o0CZvIrbqDu/X8IpC2W9eEkb5Q+o4TI4IpGS25QAKC4m2116A26UpX1AJ7rGZv+A9VgjkCrA=="], + + "node-domexception": ["node-domexception@https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "node-int64": ["node-int64@https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "npm-run-path": ["npm-run-path@https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + + "opentracing": ["opentracing@https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", {}, "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q=="], + + "p-limit": ["p-limit@https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "package-json-from-dist": ["package-json-from-dist@https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", {}, "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="], + + "parse-ms": ["parse-ms@https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + + "path-exists": ["path-exists@https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "picocolors": ["picocolors@https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "pretty-ms": ["pretty-ms@https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg=="], + + "process": ["process@https://registry.npmjs.org/process/-/process-0.10.1.tgz", {}, "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA=="], + + "protobufjs": ["protobufjs@7.6.1", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg=="], + + "readdirp": ["readdirp@https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "reflect-metadata": ["reflect-metadata@https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], + + "require-directory": ["require-directory@https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="], + + "rollup": ["rollup@4.62.2", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.2", "@rollup/rollup-android-arm64": "4.62.2", "@rollup/rollup-darwin-arm64": "4.62.2", "@rollup/rollup-darwin-x64": "4.62.2", "@rollup/rollup-freebsd-arm64": "4.62.2", "@rollup/rollup-freebsd-x64": "4.62.2", "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", "@rollup/rollup-linux-arm-musleabihf": "4.62.2", "@rollup/rollup-linux-arm64-gnu": "4.62.2", "@rollup/rollup-linux-arm64-musl": "4.62.2", "@rollup/rollup-linux-loong64-gnu": "4.62.2", "@rollup/rollup-linux-loong64-musl": "4.62.2", "@rollup/rollup-linux-ppc64-gnu": "4.62.2", "@rollup/rollup-linux-ppc64-musl": "4.62.2", "@rollup/rollup-linux-riscv64-gnu": "4.62.2", "@rollup/rollup-linux-riscv64-musl": "4.62.2", "@rollup/rollup-linux-s390x-gnu": "4.62.2", "@rollup/rollup-linux-x64-gnu": "4.62.2", "@rollup/rollup-linux-x64-musl": "4.62.2", "@rollup/rollup-openbsd-x64": "4.62.2", "@rollup/rollup-openharmony-arm64": "4.62.2", "@rollup/rollup-win32-arm64-msvc": "4.62.2", "@rollup/rollup-win32-ia32-msvc": "4.62.2", "@rollup/rollup-win32-x64-gnu": "4.62.2", "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA=="], + + "rollup-plugin-dts": ["rollup-plugin-dts@6.4.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@jridgewell/sourcemap-codec": "^1.5.5", "convert-source-map": "^2.0.0", "magic-string": "^0.30.21" }, "optionalDependencies": { "@babel/code-frame": "^7.29.0" } }, "sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg=="], + + "serialize-javascript": ["serialize-javascript@7.0.3", "", {}, "sha512-h+cZ/XXarqDgCjo+YSyQU/ulDEESGGf8AMK9pPNmhNSl/FzPl6L8pMp1leca5z6NuG6tvV/auC8/43tmovowww=="], + + "shebang-command": ["shebang-command@https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "string-template": ["string-template@https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", {}, "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw=="], + + "string-width": ["string-width@https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-final-newline": ["strip-final-newline@https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + + "strip-json-comments": ["strip-json-comments@https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "tar": ["tar@7.5.19", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw=="], + + "thriftrw": ["thriftrw@https://registry.npmjs.org/thriftrw/-/thriftrw-3.11.4.tgz", { "dependencies": { "bufrw": "^1.2.1", "error": "7.0.2", "long": "^2.4.0" } }, "sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA=="], + + "ts-node": ["ts-node@https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], + + "tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], + + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + + "unicorn-magic": ["unicorn-magic@https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "uuid": ["uuid@https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", {}, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "v8-compile-cache-lib": ["v8-compile-cache-lib@https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], + + "web-streams-polyfill": ["web-streams-polyfill@https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + + "which": ["which@https://registry.npmjs.org/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "workerpool": ["workerpool@https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", {}, "sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A=="], + + "wrap-ansi": ["wrap-ansi@https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "xorshift": ["xorshift@https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz", {}, "sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g=="], + + "xtend": ["xtend@https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + + "yargs": ["yargs@https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yargs-unparser": ["yargs-unparser@https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", { "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" } }, "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA=="], + + "yn": ["yn@https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], + + "yocto-queue": ["yocto-queue@https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "yoctocolors": ["yoctocolors@https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="], + + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@isaacs/cliui/string-width": ["string-width@https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "chalk/supports-color": ["supports-color@https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "es-set-tostringtag/hasown": ["hasown@https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "figures/is-unicode-supported": ["is-unicode-supported@https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", {}, "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q=="], + + "get-intrinsic/hasown": ["hasown@https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "npm-run-path/path-key": ["path-key@https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "protobufjs/long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "require-in-the-middle/module-details-from-path": ["module-details-from-path@https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", {}, "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="], + + "thriftrw/long": ["long@https://registry.npmjs.org/long/-/long-2.4.0.tgz", {}, "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ=="], + + "ts-node/diff": ["diff@https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], + + "yargs-unparser/is-plain-obj": ["is-plain-obj@https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + } +} diff --git a/library/bundle/core.js b/library/bundle/core.js index 308ea72..c1e2ed9 100644 --- a/library/bundle/core.js +++ b/library/bundle/core.js @@ -32936,6 +32936,127 @@ var require_browser = __commonJS((exports, module) => { }; }); +// node_modules/has-flag/index.js +var require_has_flag = __commonJS((exports, module) => { + module.exports = (flag, argv = process.argv) => { + const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--"; + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf("--"); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); + }; +}); + +// node_modules/supports-color/index.js +var require_supports_color = __commonJS((exports, module) => { + var os = __require("os"); + var tty = __require("tty"); + var hasFlag = require_has_flag(); + var { env } = process; + var flagForceColor; + if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) { + flagForceColor = 0; + } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) { + flagForceColor = 1; + } + function envForceColor() { + if ("FORCE_COLOR" in env) { + if (env.FORCE_COLOR === "true") { + return 1; + } + if (env.FORCE_COLOR === "false") { + return 0; + } + return env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3); + } + } + function translateLevel(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + } + function supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) { + const noFlagForceColor = envForceColor(); + if (noFlagForceColor !== undefined) { + flagForceColor = noFlagForceColor; + } + const forceColor = sniffFlags ? flagForceColor : noFlagForceColor; + if (forceColor === 0) { + return 0; + } + if (sniffFlags) { + if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) { + return 3; + } + if (hasFlag("color=256")) { + return 2; + } + } + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } + const min = forceColor || 0; + if (env.TERM === "dumb") { + return min; + } + if (process.platform === "win32") { + const osRelease = os.release().split("."); + if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + return 1; + } + if ("CI" in env) { + if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE", "DRONE"].some((sign) => (sign in env)) || env.CI_NAME === "codeship") { + return 1; + } + return min; + } + if ("TEAMCITY_VERSION" in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + if (env.COLORTERM === "truecolor") { + return 3; + } + if ("TERM_PROGRAM" in env) { + const version = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + switch (env.TERM_PROGRAM) { + case "iTerm.app": + return version >= 3 ? 3 : 2; + case "Apple_Terminal": + return 2; + } + } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ("COLORTERM" in env) { + return 1; + } + return min; + } + function getSupportLevel(stream, options = {}) { + const level = supportsColor(stream, { + streamIsTTY: stream && stream.isTTY, + ...options + }); + return translateLevel(level); + } + module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel({ isTTY: tty.isatty(1) }), + stderr: getSupportLevel({ isTTY: tty.isatty(2) }) + }; +}); + // node_modules/debug/src/node.js var require_node6 = __commonJS((exports, module) => { var tty = __require("tty"); @@ -32949,7 +33070,7 @@ var require_node6 = __commonJS((exports, module) => { exports.destroy = util.deprecate(() => {}, "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); exports.colors = [6, 2, 3, 4, 5, 1]; try { - const supportsColor = (()=>{throw new Error("Cannot require module "+"supports-color");})(); + const supportsColor = require_supports_color(); if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { exports.colors = [ 20, @@ -87896,7 +88017,7 @@ var init_escape = __esm(() => { NO_ESCAPE_REGEXP = /^[\w./-]+$/; }); -// node_modules/is-unicode-supported/index.js +// node_modules/figures/node_modules/is-unicode-supported/index.js import process4 from "node:process"; function isUnicodeSupported() { if (process4.platform !== "win32") { diff --git a/library/bundle/introspector.js b/library/bundle/introspector.js index 563831a..e71c2e2 100644 --- a/library/bundle/introspector.js +++ b/library/bundle/introspector.js @@ -28540,7 +28540,7 @@ var init_escape = __esm(() => { NO_ESCAPE_REGEXP = /^[\w./-]+$/; }); -// node_modules/is-unicode-supported/index.js +// node_modules/figures/node_modules/is-unicode-supported/index.js import process4 from "node:process"; function isUnicodeSupported() { if (process4.platform !== "win32") { @@ -52780,6 +52780,127 @@ var require_browser = __commonJS((exports, module) => { }; }); +// node_modules/has-flag/index.js +var require_has_flag = __commonJS((exports, module) => { + module.exports = (flag, argv = process.argv) => { + const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--"; + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf("--"); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); + }; +}); + +// node_modules/supports-color/index.js +var require_supports_color = __commonJS((exports, module) => { + var os4 = __require("os"); + var tty3 = __require("tty"); + var hasFlag = require_has_flag(); + var { env: env3 } = process; + var flagForceColor; + if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) { + flagForceColor = 0; + } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) { + flagForceColor = 1; + } + function envForceColor() { + if ("FORCE_COLOR" in env3) { + if (env3.FORCE_COLOR === "true") { + return 1; + } + if (env3.FORCE_COLOR === "false") { + return 0; + } + return env3.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env3.FORCE_COLOR, 10), 3); + } + } + function translateLevel(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + } + function supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) { + const noFlagForceColor = envForceColor(); + if (noFlagForceColor !== undefined) { + flagForceColor = noFlagForceColor; + } + const forceColor = sniffFlags ? flagForceColor : noFlagForceColor; + if (forceColor === 0) { + return 0; + } + if (sniffFlags) { + if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) { + return 3; + } + if (hasFlag("color=256")) { + return 2; + } + } + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } + const min = forceColor || 0; + if (env3.TERM === "dumb") { + return min; + } + if (process.platform === "win32") { + const osRelease = os4.release().split("."); + if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + return 1; + } + if ("CI" in env3) { + if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE", "DRONE"].some((sign) => (sign in env3)) || env3.CI_NAME === "codeship") { + return 1; + } + return min; + } + if ("TEAMCITY_VERSION" in env3) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env3.TEAMCITY_VERSION) ? 1 : 0; + } + if (env3.COLORTERM === "truecolor") { + return 3; + } + if ("TERM_PROGRAM" in env3) { + const version = Number.parseInt((env3.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + switch (env3.TERM_PROGRAM) { + case "iTerm.app": + return version >= 3 ? 3 : 2; + case "Apple_Terminal": + return 2; + } + } + if (/-256(color)?$/i.test(env3.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env3.TERM)) { + return 1; + } + if ("COLORTERM" in env3) { + return 1; + } + return min; + } + function getSupportLevel(stream, options = {}) { + const level = supportsColor(stream, { + streamIsTTY: stream && stream.isTTY, + ...options + }); + return translateLevel(level); + } + module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel({ isTTY: tty3.isatty(1) }), + stderr: getSupportLevel({ isTTY: tty3.isatty(2) }) + }; +}); + // node_modules/debug/src/node.js var require_node6 = __commonJS((exports, module) => { var tty3 = __require("tty"); @@ -52793,7 +52914,7 @@ var require_node6 = __commonJS((exports, module) => { exports.destroy = util.deprecate(() => {}, "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); exports.colors = [6, 2, 3, 4, 5, 1]; try { - const supportsColor = (()=>{throw new Error("Cannot require module "+"supports-color");})(); + const supportsColor = require_supports_color(); if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { exports.colors = [ 20, diff --git a/library/package.json b/library/package.json index 23bfbc1..212597a 100644 --- a/library/package.json +++ b/library/package.json @@ -39,17 +39,22 @@ "typescript": "^6.0.3" }, "resolutions": { - "@grpc/grpc-js": "1.14.4", "**/@grpc/proto-loader/protobufjs": "7.6.1", "**/@opentelemetry/otlp-transformer/protobufjs": "8.4.1", "**/glob/minimatch": "9.0.9", - "form-data": "4.0.6" + "@grpc/grpc-js": "1.14.4", + "form-data": "4.0.6", + "mocha/minimatch": "9.0.9", + "mocha/serialize-javascript": "7.0.3" }, "devDependencies": { "@types/adm-zip": "^0.5.8", + "@types/mocha": "^10.0.10", "@types/node": "~26.0.1", "@types/tar": "^7.0.87", + "mocha": "^11.7.6", "rollup": "^4.62.2", - "rollup-plugin-dts": "^6.4.1" + "rollup-plugin-dts": "^6.4.1", + "ts-node": "^10.9.2" } } diff --git a/library/src/module/introspector/test/case_convertor.spec.ts b/library/src/module/introspector/test/case_convertor.spec.ts new file mode 100644 index 0000000..f869bc8 --- /dev/null +++ b/library/src/module/introspector/test/case_convertor.spec.ts @@ -0,0 +1,70 @@ +import assert from "assert" +import { describe, it } from "mocha" + +import { convertToPascalCase } from "../case_convertor.js" + +describe("case convertor", function () { + describe("convertToPascalCase", function () { + it("should convert kebab-case to pascal case", function () { + const result = convertToPascalCase("hello-world") + assert.equal(result, "HelloWorld") + }) + + it("should convert snake-case to pascal case", function () { + const result = convertToPascalCase("hello_world") + assert.equal(result, "HelloWorld") + }) + + it("should convert camel case to pascal case", function () { + const result = convertToPascalCase("helloWorld") + assert.equal(result, "HelloWorld") + }) + + it("should convert single word to pascal case", function () { + const result = convertToPascalCase("hello") + assert.equal(result, "Hello") + }) + + it("should convert empty string to empty string", function () { + const result = convertToPascalCase("") + assert.equal(result, "") + }) + + it("should keep pascal case if already valid", function () { + const result = convertToPascalCase("HelloWorld") + assert.equal(result, "HelloWorld") + }) + + it("should correctly handle numbers as spacers", function () { + const result = convertToPascalCase("hello123world") + assert.equal(result, "Hello123World") + }) + + it("should correctly handle number as first word", function () { + const result = convertToPascalCase("123helloworld") + assert.equal(result, "123Helloworld") + }) + + it("should correctly handle number as last word", function () { + const result = convertToPascalCase("helloWorld123") + assert.equal(result, "HelloWorld123") + }) + + it("should correctly handle special characters as spacers", function () { + const result = convertToPascalCase("hello world") + assert.equal(result, "HelloWorld") + }) + + it("should correctly handle mix cases", function () { + const result = convertToPascalCase("123hello-world_here") + assert.equal(result, "123HelloWorldHere") + }) + + it("should correctly handle multiple uppercase words", function () { + // This will still not work in module because the generated class name would be `IntrospectionJson` + // See https://github.com/dagger/dagger/issues/7941 + const result = convertToPascalCase("introspectionJSON") + assert.equal(result, "IntrospectionJSON") + }) + }) +}) diff --git a/library/src/module/introspector/test/files.spec.ts b/library/src/module/introspector/test/files.spec.ts new file mode 100644 index 0000000..3809087 --- /dev/null +++ b/library/src/module/introspector/test/files.spec.ts @@ -0,0 +1,21 @@ +import assert from "assert" +import { describe, it } from "mocha" +import * as path from "path" +import { fileURLToPath } from "url" + +import { listFiles } from "../utils/files.js" + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const rootDirectory = `${__dirname}/testdata` + +describe("ListFiles", function () { + it("Should correctly list files from hello world example and ignore unwanted files", async function () { + const files = await listFiles(`${rootDirectory}/helloWorld`) + + assert.deepEqual( + files.map((f) => path.basename(f)), + ["helloWorld.ts"], + ) + }) +}) diff --git a/library/src/module/introspector/test/introspection_json.spec.ts b/library/src/module/introspector/test/introspection_json.spec.ts new file mode 100644 index 0000000..75afae7 --- /dev/null +++ b/library/src/module/introspector/test/introspection_json.spec.ts @@ -0,0 +1,107 @@ +import assert from "assert" +import { describe, it } from "mocha" +import path from "path" +import { fileURLToPath } from "url" + +import { scan } from "../index.js" +import { serializeIntrospection } from "../introspection_json.js" +import { listFiles } from "../utils/files.js" + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const rootDirectory = `${__dirname}/testdata` + +// These types mirror the introspection JSON shape (a subset) so the test can +// navigate the emitter output without `any`. +type TypeRef = { kind: string; name?: string; ofType?: TypeRef } +type Field = { + name: string + type: TypeRef + args: { name: string; type: TypeRef; directives?: unknown[] }[] +} +type IntrospectionType = { + kind: string + name: string + fields?: Field[] + enumValues?: { name: string }[] +} +type Introspection = { + __schema: { queryType: { name: string }; types: IntrospectionType[] } +} + +async function introspect( + directory: string, +): Promise { + const files = await listFiles(`${rootDirectory}/${directory}`) + const module = await scan(files, directory) + return serializeIntrospection(module as never).__schema +} + +function typeByName( + schema: Introspection["__schema"], + name: string, +): IntrospectionType | undefined { + return schema.types.find((t) => t.name === name) +} + +function fieldByName(t: IntrospectionType | undefined, name: string) { + return t?.fields?.find((f) => f.name === name) +} + +describe("serializeIntrospection", function () { + it("emits the main object, its methods and a Node id field", async function () { + this.timeout(60000) + const schema = await introspect("helloWorld") + + const obj = typeByName(schema, "HelloWorld") + assert.ok(obj, "HelloWorld object type is emitted") + assert.equal(obj?.kind, "OBJECT") + + const method = fieldByName(obj, "helloWorld") + assert.ok(method, "helloWorld method is emitted as a field") + // string return -> NON_NULL String + assert.equal(method?.type.kind, "NON_NULL") + assert.equal(method?.type.ofType?.name, "String") + // string arg -> NON_NULL String, named "name" + assert.equal(method?.args[0]?.name, "name") + assert.equal(method?.args[0]?.type.kind, "NON_NULL") + + const id = fieldByName(obj, "id") + assert.ok(id, "synthetic Node id field is emitted") + assert.equal(id?.type.kind, "NON_NULL") + assert.equal(id?.type.ofType?.name, "ID") + }) + + it("emits a Query type carrying the module constructor field", async function () { + this.timeout(60000) + const schema = await introspect("helloWorld") + + assert.equal(schema.queryType.name, "Query") + const query = typeByName(schema, "Query") + const ctor = fieldByName(query, "helloWorld") + assert.ok(ctor, "Query has the lowerCamel(moduleName) constructor field") + assert.equal(ctor?.type.kind, "NON_NULL") + assert.equal(ctor?.type.ofType?.kind, "OBJECT") + assert.equal(ctor?.type.ofType?.name, "HelloWorld") + }) + + it("namespaces module-local enums and keeps conventional member names", async function () { + this.timeout(60000) + const schema = await introspect("enums") + + // enum "Status" in module "Enums" is namespaced to "EnumsStatus". + const enumType = typeByName(schema, "EnumsStatus") + assert.ok(enumType, "module enum is namespaced with the module name") + assert.equal(enumType?.kind, "ENUM") + const members = (enumType?.enumValues ?? []).map((v) => v.name) + assert.deepEqual(members, ["ACTIVE", "INACTIVE"]) + + // a method taking the enum refers to it by its namespaced name. + const obj = typeByName(schema, "Enums") + const setStatus = fieldByName(obj, "setStatus") + assert.equal( + setStatus?.args[0]?.type.ofType?.name ?? setStatus?.args[0]?.type.name, + "EnumsStatus", + ) + }) +}) diff --git a/library/src/module/introspector/test/scan.spec.ts b/library/src/module/introspector/test/scan.spec.ts new file mode 100644 index 0000000..b266266 --- /dev/null +++ b/library/src/module/introspector/test/scan.spec.ts @@ -0,0 +1,208 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import assert from "assert" +import * as fs from "fs" +import { describe, it } from "mocha" +import path from "path" +import { fileURLToPath } from "url" + +import { scan } from "../index.js" +import { listFiles } from "../utils/files.js" + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const rootDirectory = `${__dirname}/testdata` + +type TestCase = { + name: string + directory: string +} + +describe("scan by reference TypeScript", function () { + const testCases: TestCase[] = [ + { + name: "Should correctly scan a basic class with one method", + directory: "helloWorld", + }, + { + name: "Should correctly resolve references", + directory: "references", + }, + { + name: "Should correctly handle optional parameters", + directory: "optionalParameter", + }, + { + name: "Should correctly handle context", + directory: "context", + }, + { + name: "Should correctly scan scalar", + directory: "scalar", + }, + { + name: "Should correctly scan enums", + directory: "enums", + }, + { + name: "Should correctly scan legacy enum decorator", + directory: "legacyEnumDecorator", + }, + { + name: "Should correctly scan list", + directory: "list", + }, + { + name: "Should correctly scan variadic", + directory: "variadic", + }, + { + name: "Should correctly scan void return", + directory: "voidReturn", + }, + { + name: "Should correctly scan state", + directory: "state", + }, + { + name: "Should correctly scan private method", + directory: "privateMethod", + }, + { + name: "Should correctly scan object param", + directory: "objectParam", + }, + { + name: "Should correctly scan multiple args", + directory: "multiArgs", + }, + { + name: "Should correctly scan multiple objects as fields", + directory: "multipleObjectsAsFields", + }, + { + name: "Should correctly scan multiple objects", + directory: "multipleObjects", + }, + { + name: "Should correctly scan core enums", + directory: "coreEnums", + }, + { + name: "Should correctly scan core enum defaults", + directory: "coreEnumDefault", + }, + { + name: "Should correctly scan constructor", + directory: "constructor", + }, + { + name: "Should correctly scan alias", + directory: "alias", + }, + { + name: "Should correctly scan minimal", + directory: "minimal", + }, + { + name: "Should correctly scan deprecated objects", + directory: "deprecatedObject", + }, + { + name: "Should correctly scan deprecated functions", + directory: "deprecatedFunction", + }, + { + name: "Should correctly scan deprecated arguments", + directory: "deprecatedArgument", + }, + { + name: "Should correctly scan deprecated fields", + directory: "deprecatedField", + }, + { + name: "Should correctly scan interfaces", + directory: "interface", + }, + { + name: "Should correctly scan decorators", + directory: "decorators", + }, + ] + + for (const test of testCases) { + it(`${test.name} - ${test.directory}`, async function () { + this.timeout(60000) + + try { + const files = await listFiles(`${rootDirectory}/${test.directory}`) + const result = await scan(files, test.directory) + const jsonResult = JSON.stringify(result, null, 2) + const expected = fs.readFileSync( + `${rootDirectory}/${test.directory}/expected.json`, + "utf-8", + ) + + assert.deepStrictEqual( + JSON.parse(jsonResult), + JSON.parse(expected), + ` +Expected: +${expected} +Got: +${jsonResult} + `, + ) + } catch (e) { + assert.fail(e as Error) + } + }) + } + + describe("Should throw error on invalid module", function () { + it("Should throw an error when no files are provided", async function () { + this.timeout(60000) + + try { + await scan([], "") + assert.fail("Should throw an error") + } catch (e: any) { + assert.equal(e.message, "no files to introspect found") + } + }) + + it("Should throw an error if the module class has no decorators", async function () { + this.timeout(60000) + + try { + const files = await listFiles(`${rootDirectory}/noDecorators`) + + await scan(files, "noDecorators") + assert.fail("Should throw an error") + } catch (e: any) { + assert.match( + e.message, + /is used by the module but not exposed with a dagger decorator/, + ) + } + }) + + it("Should throw an error if a primitive type is used", async function () { + this.timeout(60000) + + try { + const files = await listFiles(`${rootDirectory}/primitives`) + + const f = await scan(files, "primitives") + // Trigger the module resolution with a strigify + JSON.stringify(f, null, 2) + + assert.fail("Should throw an error") + } catch (e: any) { + assert.equal( + e.message, + `Use of primitive 'String' type detected, please use 'string' instead.`, + ) + } + }) + }) +}) diff --git a/library/src/module/introspector/test/testdata/alias/expected.json b/library/src/module/introspector/test/testdata/alias/expected.json new file mode 100644 index 0000000..491764b --- /dev/null +++ b/library/src/module/introspector/test/testdata/alias/expected.json @@ -0,0 +1,200 @@ +{ + "name": "Alias", + "objects": { + "Alias": { + "name": "Alias", + "description": "", + "constructor": { + "arguments": { + "ctr": { + "name": "ctr", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Container" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true + } + } + }, + "methods": { + "testBar": { + "name": "bar", + "description": "", + "alias": "testBar", + "arguments": {}, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Bar" + } + }, + "bar": { + "name": "customBar", + "description": "", + "alias": "bar", + "arguments": { + "baz": { + "name": "baz", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "foo": { + "name": "foo", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Bar" + } + }, + "version": { + "name": "displayVersion", + "description": "", + "alias": "version", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "greet": { + "name": "helloWorld", + "description": "", + "alias": "greet", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "customGreet": { + "name": "customHelloWorld", + "description": "", + "alias": "customGreet", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": { + "prefix": { + "name": "gretingPrefix", + "description": "", + "alias": "prefix", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + }, + "container": { + "name": "ctr", + "description": "", + "alias": "container", + "type": { + "kind": "OBJECT_KIND", + "name": "Container" + }, + "isExposed": true + } + } + }, + "Bar": { + "name": "Bar", + "description": "", + "constructor": { + "arguments": { + "baz": { + "name": "baz", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "baz" + }, + "foo": { + "name": "foo", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": 4 + } + } + }, + "methods": { + "zoo": { + "name": "za", + "description": "", + "alias": "zoo", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": { + "bar": { + "name": "baz", + "description": "", + "alias": "bar", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + }, + "oof": { + "name": "foo", + "description": "", + "alias": "oof", + "type": { + "kind": "INTEGER_KIND" + }, + "isExposed": true + } + } + } + }, + "enums": {}, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/alias/index.ts b/library/src/module/introspector/test/testdata/alias/index.ts new file mode 100644 index 0000000..5f53b80 --- /dev/null +++ b/library/src/module/introspector/test/testdata/alias/index.ts @@ -0,0 +1,61 @@ +import { dag, Container } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +@object() +export class Bar { + @func("bar") + baz: string = "baz" + + @func("oof") + foo: number = 4 + + constructor(baz: string = "baz", foo: number = 4) { + this.baz = baz + this.foo = foo + } + + @func("zoo") + za(): string { + return this.baz + } +} + +@object() +export class Alias { + @func("prefix") + gretingPrefix = "test" + + @func("container") + ctr: Container + + constructor(ctr?: Container) { + this.ctr = ctr ?? dag.container().from("alpine:3.14.0") + } + + @func("testBar") + bar(): Bar { + return new Bar() + } + + @func("bar") + customBar(baz: string, foo: number): Bar { + return new Bar(baz, foo) + } + + @func("version") + async displayVersion(): Promise { + return await this.ctr + .withExec(["/bin/sh", "-c", "cat /etc/os-release | grep VERSION_ID"]) + .stdout() + } + + @func("greet") + helloWorld(name: string): string { + return `hello ${name}` + } + + @func("customGreet") + customHelloWorld(name: string): string { + return `${this.gretingPrefix} ${name}` + } +} diff --git a/library/src/module/introspector/test/testdata/constructor/expected.json b/library/src/module/introspector/test/testdata/constructor/expected.json new file mode 100644 index 0000000..8b6d114 --- /dev/null +++ b/library/src/module/introspector/test/testdata/constructor/expected.json @@ -0,0 +1,58 @@ +{ + "name": "Constructor", + "description": "Constructor module", + "objects": { + "Constructor": { + "name": "Constructor", + "description": "Constructor class", + "constructor": { + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "world" + } + } + }, + "methods": { + "sayHello": { + "name": "sayHello", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": false + } + } + } + }, + "enums": {}, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/constructor/index.ts b/library/src/module/introspector/test/testdata/constructor/index.ts new file mode 100644 index 0000000..212e06b --- /dev/null +++ b/library/src/module/introspector/test/testdata/constructor/index.ts @@ -0,0 +1,21 @@ +/** + * Constructor module + */ +import { func, object } from "../../../../decorators.js" + +/** + * Constructor class + */ +@object() +export class Constructor { + name: string + + constructor(name: string = "world") { + this.name = name + } + + @func() + sayHello(name: string): string { + return `hello ${name}` + } +} diff --git a/library/src/module/introspector/test/testdata/context/expected.json b/library/src/module/introspector/test/testdata/context/expected.json new file mode 100644 index 0000000..9b64569 --- /dev/null +++ b/library/src/module/introspector/test/testdata/context/expected.json @@ -0,0 +1,59 @@ +{ + "name": "Context", + "objects": { + "Context": { + "name": "Context", + "description": "", + "methods": { + "helloWorld": { + "name": "helloWorld", + "description": "", + "arguments": { + "dir": { + "name": "dir", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Directory" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultPath": "." + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "helloWorldIgnored": { + "name": "helloWorldIgnored", + "description": "", + "arguments": { + "dir": { + "name": "dir", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Directory" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultPath": ".", + "ignore": [ + "dir" + ] + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/context/index.ts b/library/src/module/introspector/test/testdata/context/index.ts new file mode 100644 index 0000000..4840fbb --- /dev/null +++ b/library/src/module/introspector/test/testdata/context/index.ts @@ -0,0 +1,21 @@ +import { Directory } from "../../../../../api/client.gen.js" +import { func, object, argument } from "../../../../decorators.js" + +@object() +export class Context { + @func() + helloWorld( + @argument({ defaultPath: "." }) + dir: Directory, + ): string { + return `hello ${name}` + } + + @func() + helloWorldIgnored( + @argument({ defaultPath: ".", ignore: ["dir"] }) + dir: Directory, + ): string { + return `hello ${name}` + } +} diff --git a/library/src/module/introspector/test/testdata/coreEnumDefault/expected.json b/library/src/module/introspector/test/testdata/coreEnumDefault/expected.json new file mode 100644 index 0000000..347cd7d --- /dev/null +++ b/library/src/module/introspector/test/testdata/coreEnumDefault/expected.json @@ -0,0 +1,36 @@ +{ + "name": "CoreEnumDefault", + "objects": { + "CoreEnumDefault": { + "name": "CoreEnumDefault", + "description": "", + "methods": { + "defaultProto": { + "name": "defaultProto", + "description": "", + "arguments": { + "proto": { + "name": "proto", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "NetworkProtocol" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "UDP" + } + }, + "returnType": { + "kind": "ENUM_KIND", + "name": "NetworkProtocol" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/coreEnumDefault/index.ts b/library/src/module/introspector/test/testdata/coreEnumDefault/index.ts new file mode 100644 index 0000000..e976a8f --- /dev/null +++ b/library/src/module/introspector/test/testdata/coreEnumDefault/index.ts @@ -0,0 +1,12 @@ +import { NetworkProtocol } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +@object() +export class CoreEnumDefault { + @func() + defaultProto( + proto: NetworkProtocol = NetworkProtocol.Udp, + ): NetworkProtocol { + return proto + } +} diff --git a/library/src/module/introspector/test/testdata/coreEnums/expected.json b/library/src/module/introspector/test/testdata/coreEnums/expected.json new file mode 100644 index 0000000..6200f7a --- /dev/null +++ b/library/src/module/introspector/test/testdata/coreEnums/expected.json @@ -0,0 +1,54 @@ +{ + "name": "CoreEnums", + "objects": { + "CoreEnums": { + "name": "CoreEnums", + "description": "", + "methods": { + "toImageLayerCompression": { + "name": "toImageLayerCompression", + "description": "", + "arguments": { + "compression": { + "name": "compression", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "ENUM_KIND", + "name": "ImageLayerCompression" + } + }, + "fromImageLayerCompression": { + "name": "fromImageLayerCompression", + "description": "", + "arguments": { + "compression": { + "name": "compression", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "ImageLayerCompression" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/coreEnums/index.ts b/library/src/module/introspector/test/testdata/coreEnums/index.ts new file mode 100644 index 0000000..8e29838 --- /dev/null +++ b/library/src/module/introspector/test/testdata/coreEnums/index.ts @@ -0,0 +1,15 @@ +import { ImageLayerCompression } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +@object() +export class CoreEnums { + @func() + toImageLayerCompression(compression: string): ImageLayerCompression { + return compression as ImageLayerCompression + } + + @func() + fromImageLayerCompression(compression: ImageLayerCompression): string { + return compression + } +} diff --git a/library/src/module/introspector/test/testdata/decorators/expected.json b/library/src/module/introspector/test/testdata/decorators/expected.json new file mode 100644 index 0000000..16dfc87 --- /dev/null +++ b/library/src/module/introspector/test/testdata/decorators/expected.json @@ -0,0 +1,291 @@ +{ + "name": "Decorators", + "objects": { + "Decorators": { + "name": "Decorators", + "description": "", + "methods": { + "withDefaultPath": { + "name": "withDefaultPath", + "description": "", + "arguments": { + "source": { + "name": "source", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Directory" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultPath": "." + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Directory" + } + }, + "withReferencedDefaultPath": { + "name": "withReferencedDefaultPath", + "description": "", + "arguments": { + "source": { + "name": "source", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Directory" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultPath": "/src" + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Directory" + } + }, + "withFileDefaultPath": { + "name": "withFileDefaultPath", + "description": "", + "arguments": { + "file": { + "name": "file", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "File" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultPath": "./README.md" + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "File" + } + }, + "withInlinedIgnore": { + "name": "withInlinedIgnore", + "description": "", + "arguments": { + "source": { + "name": "source", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Directory" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "ignore": [ + "foo", + "bar", + "baz" + ] + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Directory" + } + }, + "withReferencedIgnore": { + "name": "withReferencedIgnore", + "description": "", + "arguments": { + "source": { + "name": "source", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Directory" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "ignore": [ + "foo", + "ref", + "bar" + ] + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Directory" + } + }, + "withDefaultPathAndIgnore": { + "name": "withDefaultPathAndIgnore", + "description": "", + "arguments": { + "source": { + "name": "source", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Directory" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultPath": ".", + "ignore": [ + "foo", + "ref", + "bar" + ] + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Directory" + } + }, + "withDefaultAddress": { + "name": "withDefaultAddress", + "description": "", + "arguments": { + "ctr": { + "name": "ctr", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Container" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true, + "defaultAddress": "alpine:3.21" + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Container" + } + }, + "withReferencedDefaultAddress": { + "name": "withReferencedDefaultAddress", + "description": "", + "arguments": { + "ctr": { + "name": "ctr", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Container" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true, + "defaultAddress": "alpine:3.21" + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Container" + } + }, + "stringAlias": { + "name": "withStringAlias", + "description": "", + "alias": "stringAlias", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "objectAlias": { + "name": "withObjectAlias", + "description": "", + "alias": "objectAlias", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "renamedReference": { + "name": "withReferencedAlias", + "description": "", + "alias": "renamedReference", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "withCache": { + "name": "withCache", + "description": "", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "cachedAlias": { + "name": "withCacheAndAlias", + "description": "", + "alias": "cachedAlias", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "checkSomething": { + "name": "checkSomething", + "description": "", + "arguments": {}, + "returnType": { + "kind": "VOID_KIND" + } + }, + "generateSomething": { + "name": "generateSomething", + "description": "", + "arguments": {}, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Changeset" + } + }, + "upSomething": { + "name": "upSomething", + "description": "", + "arguments": {}, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Service" + } + } + }, + "properties": { + "version": { + "name": "version", + "description": "A field exposed with the deprecated `@field` decorator.", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + }, + "aliasedField": { + "name": "name", + "description": "A field exposed with `@func` using a string alias.", + "alias": "aliasedField", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + } + } + } + }, + "enums": {}, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/decorators/index.ts b/library/src/module/introspector/test/testdata/decorators/index.ts new file mode 100644 index 0000000..1e6a713 --- /dev/null +++ b/library/src/module/introspector/test/testdata/decorators/index.ts @@ -0,0 +1,158 @@ +import { + Changeset, + Container, + Directory, + File, + Service, +} from "../../../../../api/client.gen.js" +import { + argument, + check, + field, + func, + generate, + object, + up, +} from "../../../../decorators.js" + +// Module-level constants referenced from decorators. They exercise the decorator +// evaluator: it must resolve referenced symbols, not only inlined literals. +const IGNORE = ["foo", "ref", "bar"] +const DEFAULT_PATH = "/src" +const DEFAULT_ADDRESS = "alpine:3.21" +const ALIAS = "renamedReference" +const CACHE = "session" + +@object() +export class Decorators { + /** + * A field exposed with the deprecated `@field` decorator. + */ + @field() + version: string = "1.0.0" + + /** + * A field exposed with `@func` using a string alias. + */ + @func("aliasedField") + name: string = "dagger" + + // --- @argument: defaultPath --- + + @func() + withDefaultPath( + @argument({ defaultPath: "." }) + source: Directory, + ): Directory { + return source + } + + @func() + withReferencedDefaultPath( + @argument({ defaultPath: DEFAULT_PATH }) + source: Directory, + ): Directory { + return source + } + + @func() + withFileDefaultPath( + @argument({ defaultPath: "./README.md" }) + file: File, + ): File { + return file + } + + // --- @argument: ignore --- + + @func() + withInlinedIgnore( + @argument({ ignore: ["foo", "bar", "baz"] }) + source: Directory, + ): Directory { + return source + } + + @func() + withReferencedIgnore( + @argument({ ignore: IGNORE }) + source: Directory, + ): Directory { + return source + } + + // --- @argument: defaultPath and ignore combined (inlined + referenced) --- + + @func() + withDefaultPathAndIgnore( + @argument({ defaultPath: ".", ignore: IGNORE }) + source: Directory, + ): Directory { + return source + } + + // --- @argument: defaultAddress (Container) --- + + @func() + withDefaultAddress( + @argument({ defaultAddress: "alpine:3.21" }) + ctr: Container, + ): Container { + return ctr + } + + @func() + withReferencedDefaultAddress( + @argument({ defaultAddress: DEFAULT_ADDRESS }) + ctr: Container, + ): Container { + return ctr + } + + // --- @func: alias --- + + @func("stringAlias") + withStringAlias(): string { + return "aliased" + } + + @func({ alias: "objectAlias" }) + withObjectAlias(): string { + return "aliased" + } + + @func({ alias: ALIAS }) + withReferencedAlias(): string { + return "aliased" + } + + // --- @func: cache --- + + @func({ cache: "never" }) + withCache(): string { + return "cached" + } + + @func({ alias: "cachedAlias", cache: CACHE }) + withCacheAndAlias(): string { + return "cached" + } + + // --- @check / @generate / @up markers (combined with @func) --- + + @func() + @check() + checkSomething(): void {} + + @func() + @generate() + generateSomething(): Changeset { + throw new Error("not implemented") + } + + @func() + @up() + upSomething(): Service { + throw new Error("not implemented") + } +} diff --git a/library/src/module/introspector/test/testdata/deprecatedArgument/expected.json b/library/src/module/introspector/test/testdata/deprecatedArgument/expected.json new file mode 100644 index 0000000..a3d163f --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedArgument/expected.json @@ -0,0 +1,63 @@ +{ + "name": "DeprecatedArgument", + "objects": { + "DeprecationArgs": { + "name": "DeprecationArgs", + "description": "", + "methods": { + "legacy": { + "name": "legacy", + "description": "", + "arguments": { + "other": { + "name": "other", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "input": { + "name": "input", + "description": "", + "deprecated": "Use `other` instead.", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "current": { + "name": "current", + "description": "", + "arguments": { + "other": { + "name": "other", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/deprecatedArgument/index.ts b/library/src/module/introspector/test/testdata/deprecatedArgument/index.ts new file mode 100644 index 0000000..d2eba01 --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedArgument/index.ts @@ -0,0 +1,18 @@ +import { func, object } from "../../../../decorators.js" + +@object() +export class DeprecationArgs { + @func() + legacy( + other: string, + /** @deprecated Use `other` instead. */ + input?: string, + ): string { + return input ?? other + } + + @func() + current(other: string): string { + return other + } +} diff --git a/library/src/module/introspector/test/testdata/deprecatedEnum/expected.json b/library/src/module/introspector/test/testdata/deprecatedEnum/expected.json new file mode 100644 index 0000000..df2864c --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedEnum/expected.json @@ -0,0 +1,58 @@ +{ + "name": "DeprecatedEnum", + "objects": { + "DeprecatedEnums": { + "name": "DeprecatedEnums", + "description": "", + "methods": { + "useMode": { + "name": "useMode", + "description": "", + "arguments": { + "mode": { + "name": "mode", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "LegacyMode" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "ENUM_KIND", + "name": "LegacyMode" + } + } + }, + "properties": {} + } + }, + "enums": { + "LegacyMode": { + "name": "LegacyMode", + "description": "", + "values": { + "Alpha": { + "name": "Alpha", + "value": "alpha", + "description": "" + }, + "Beta": { + "name": "Beta", + "value": "beta", + "description": "", + "deprecated": "Switch to Gamma." + }, + "Gamma": { + "name": "Gamma", + "value": "gamma", + "description": "" + } + } + } + }, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/deprecatedEnum/index.ts b/library/src/module/introspector/test/testdata/deprecatedEnum/index.ts new file mode 100644 index 0000000..f3c1ea0 --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedEnum/index.ts @@ -0,0 +1,17 @@ +import { func, object } from "../../../../decorators.js" + +/** @deprecated Legacy enum kept only for compatibility. */ +export enum LegacyMode { + Alpha = "alpha", + /** @deprecated Switch to Gamma. */ + Beta = "beta", + Gamma = "gamma", +} + +@object() +export class DeprecatedEnums { + @func() + useMode(mode: LegacyMode): LegacyMode { + return mode + } +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/deprecatedField/expected.json b/library/src/module/introspector/test/testdata/deprecatedField/expected.json new file mode 100644 index 0000000..6469e7a --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedField/expected.json @@ -0,0 +1,65 @@ +{ + "name": "DeprecatedField", + "objects": { + "DeprecatedFields": { + "name": "DeprecatedFields", + "description": "Module exposing deprecated fields.", + "methods": { + "record": { + "name": "record", + "description": "", + "arguments": {}, + "returnType": { + "kind": "OBJECT_KIND", + "name": "LegacyRecord" + } + } + }, + "properties": { + "legacyField": { + "name": "legacyField", + "description": "", + "deprecated": "Inline note that this field is going away.", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + }, + "latestField": { + "name": "latestField", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + } + } + }, + "LegacyRecord": { + "name": "LegacyRecord", + "description": "", + "properties": { + "note": { + "name": "note", + "description": "", + "deprecated": "Prefer `message`.", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + }, + "message": { + "name": "message", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + } + }, + "deprecated": "Alias maintained only for compatibility." + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/deprecatedField/index.ts b/library/src/module/introspector/test/testdata/deprecatedField/index.ts new file mode 100644 index 0000000..ca863cf --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedField/index.ts @@ -0,0 +1,26 @@ +import { func, object } from "../../../../decorators.js" + +/** + * Module exposing deprecated fields. + */ +@object() +export class DeprecatedFields { + /** @deprecated Inline note that this field is going away. */ + @func() + legacyField = "legacy" + + @func() + latestField = "latest" + + @func() + record(): LegacyRecord { + return { note: "legacy", message: "latest" } + } +} + +/** @deprecated Alias maintained only for compatibility. */ +export type LegacyRecord = { + /** @deprecated Prefer `message`. */ + note: string + message: string +} diff --git a/library/src/module/introspector/test/testdata/deprecatedFunction/expected.json b/library/src/module/introspector/test/testdata/deprecatedFunction/expected.json new file mode 100644 index 0000000..23f0a2c --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedFunction/expected.json @@ -0,0 +1,40 @@ +{ + "name": "DeprecatedFunction", + "objects": { + "DeprecatedFunctions": { + "name": "DeprecatedFunctions", + "description": "", + "methods": { + "legacy": { + "name": "legacy", + "description": "", + "deprecated": "Use `current` instead.\nLegacy behaviour is kept only for compatibility.", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "empty": { + "name": "empty", + "description": "", + "deprecated": "", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "current": { + "name": "current", + "description": "", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/deprecatedFunction/index.ts b/library/src/module/introspector/test/testdata/deprecatedFunction/index.ts new file mode 100644 index 0000000..60b7b1f --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedFunction/index.ts @@ -0,0 +1,24 @@ +import { func, object } from "../../../../decorators.js" + +@object() +export class DeprecatedFunctions { + /** + * @deprecated Use `current` instead. + * Legacy behaviour is kept only for compatibility. + */ + @func() + legacy(): string { + return "legacy" + } + + /** @deprecated */ + @func() + empty(): string { + return "empty" + } + + @func() + current(): string { + return "current" + } +} diff --git a/library/src/module/introspector/test/testdata/deprecatedObject/expected.json b/library/src/module/introspector/test/testdata/deprecatedObject/expected.json new file mode 100644 index 0000000..ebf9fe7 --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedObject/expected.json @@ -0,0 +1,40 @@ +{ + "name": "DeprecatedObject", + "objects": { + "LegacyModule": { + "name": "LegacyModule", + "description": "", + "deprecated": "Use `ModernModule` instead.", + "methods": { + "manifest": { + "name": "manifest", + "description": "", + "arguments": {}, + "returnType": { + "kind": "OBJECT_KIND", + "name": "LegacyType" + } + } + }, + "properties": {} + }, + "LegacyType": { + "name": "LegacyType", + "description": "", + "properties": { + "oldField": { + "name": "oldField", + "description": "", + "deprecated": "Migrate to `newField`.", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + } + }, + "deprecated": "Type alias kept for compatibility." + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/deprecatedObject/index.ts b/library/src/module/introspector/test/testdata/deprecatedObject/index.ts new file mode 100644 index 0000000..69c16b3 --- /dev/null +++ b/library/src/module/introspector/test/testdata/deprecatedObject/index.ts @@ -0,0 +1,24 @@ +import { func, object } from "../../../../decorators.js" + +/** + * @deprecated Use `ModernModule` instead. + */ +@object() +export class LegacyModule { + @func() + manifest(): LegacyType { + return { + oldField: "legacy", + } + } +} + +/** + * @deprecated Type alias kept for compatibility. + */ +export type LegacyType = { + /** + * @deprecated Migrate to `newField`. + */ + oldField: string +} diff --git a/library/src/module/introspector/test/testdata/enums/expected.json b/library/src/module/introspector/test/testdata/enums/expected.json new file mode 100644 index 0000000..2470bde --- /dev/null +++ b/library/src/module/introspector/test/testdata/enums/expected.json @@ -0,0 +1,71 @@ +{ + "name": "Enums", + "objects": { + "Enums": { + "name": "Enums", + "description": "", + "methods": { + "setStatus": { + "name": "setStatus", + "description": "", + "arguments": { + "status": { + "name": "status", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "Status" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Enums" + } + }, + "getStatus": { + "name": "getStatus", + "description": "", + "arguments": {}, + "returnType": { + "kind": "ENUM_KIND", + "name": "Status" + } + } + }, + "properties": { + "status": { + "name": "status", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "Status" + }, + "isExposed": true + } + } + } + }, + "enums": { + "Status": { + "name": "Status", + "description": "Enum for Status", + "values": { + "ACTIVE": { + "name": "ACTIVE", + "value": "ACTIVE value", + "description": "Active status" + }, + "INACTIVE": { + "name": "INACTIVE", + "value": "INACTIVE value", + "description": "Inactive status" + } + } + } + }, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/enums/index.ts b/library/src/module/introspector/test/testdata/enums/index.ts new file mode 100644 index 0000000..0f432dc --- /dev/null +++ b/library/src/module/introspector/test/testdata/enums/index.ts @@ -0,0 +1,34 @@ +import { func, object } from "../../../../decorators.js" + +/** + * Enum for Status + */ +export enum Status { + /** + * Active status + */ + ACTIVE = "ACTIVE value", + + /** + * Inactive status + */ + INACTIVE = "INACTIVE value", +} + +@object() +export class Enums { + @func() + status: Status = Status.ACTIVE + + @func() + setStatus(status: Status): Enums { + this.status = status + + return this + } + + @func() + getStatus(): Status { + return this.status + } +} diff --git a/library/src/module/introspector/test/testdata/generate_expected_scan.ts b/library/src/module/introspector/test/testdata/generate_expected_scan.ts new file mode 100644 index 0000000..adf077a --- /dev/null +++ b/library/src/module/introspector/test/testdata/generate_expected_scan.ts @@ -0,0 +1,55 @@ +import * as fs from "fs" +import * as path from "path" +import { fileURLToPath } from "url" + +import { scan } from "../../index.js" +import { DaggerModule } from "../../dagger_module/index.js" +import { listFiles } from "../../utils/files.js" + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const expectedFilename = "expected.json" +const diffExpectedFileName = "expected.diff.json" + +async function generateExpectedScan() { + console.info(`Generating expected scan file from directory: ${__dirname}`) + + for (const entry of fs.readdirSync(__dirname)) { + if (!fs.lstatSync(path.join(__dirname, entry)).isDirectory()) { + continue + } + + console.info(`* Generating expected scan file for directory: ${entry}`) + const files = await listFiles(`${__dirname}/${entry}`) + + let result: DaggerModule + try { + result = await scan(files, `${entry}`) + } catch (e) { + console.error(`Failed to scan ${entry}: ${e}`) + continue + } + + const expectedPath = path.join(__dirname, entry, expectedFilename) + const diffExpectedPath = path.join(__dirname, entry, diffExpectedFileName) + const currentExpected = fs.readFileSync(expectedPath, "utf8") + + if (currentExpected.trimEnd() !== JSON.stringify(result, null, 2)) { + console.log( + `/!\\ Expected scan file for : ${path.join(entry, expectedFilename)} is different from the current result.`, + ) + console.log( + `/!\\ Please review the changes on ${path.join(entry, diffExpectedFileName)} and update the expected file if necessary.`, + ) + fs.writeFileSync(diffExpectedPath, JSON.stringify(result, null, 2)) + } else { + console.log( + `Expected scan file for : ${path.join(entry, expectedFilename)} is up to date.`, + ) + } + + console.log("\n") + } +} + +await generateExpectedScan() diff --git a/library/src/module/introspector/test/testdata/helloWorld/expected.json b/library/src/module/introspector/test/testdata/helloWorld/expected.json new file mode 100644 index 0000000..6f0ad95 --- /dev/null +++ b/library/src/module/introspector/test/testdata/helloWorld/expected.json @@ -0,0 +1,33 @@ +{ + "name": "HelloWorld", + "objects": { + "HelloWorld": { + "name": "HelloWorld", + "description": "HelloWorld class", + "methods": { + "helloWorld": { + "name": "helloWorld", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/helloWorld/helloWorld.ts b/library/src/module/introspector/test/testdata/helloWorld/helloWorld.ts new file mode 100644 index 0000000..6402c42 --- /dev/null +++ b/library/src/module/introspector/test/testdata/helloWorld/helloWorld.ts @@ -0,0 +1,12 @@ +import { func, object } from "../../../../decorators.js" + +/** + * HelloWorld class + */ +@object() +export class HelloWorld { + @func() + helloWorld(name: string): string { + return `hello ${name}` + } +} diff --git a/library/src/module/introspector/test/testdata/helloWorld/toIgnore.md b/library/src/module/introspector/test/testdata/helloWorld/toIgnore.md new file mode 100644 index 0000000..e69de29 diff --git a/library/src/module/introspector/test/testdata/interface/expected.json b/library/src/module/introspector/test/testdata/interface/expected.json new file mode 100644 index 0000000..af2435f --- /dev/null +++ b/library/src/module/introspector/test/testdata/interface/expected.json @@ -0,0 +1,134 @@ +{ + "name": "Interface", + "objects": { + "Interface": { + "name": "Interface", + "description": "", + "methods": { + "hello": { + "name": "hello", + "description": "", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "iface": { + "name": "iface", + "description": "", + "arguments": {}, + "returnType": { + "kind": "INTERFACE_KIND", + "name": "IFace" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": { + "IFace": { + "name": "IFace", + "description": "Example of iface", + "functions": { + "foo": { + "name": "foo", + "description": "Foo fct", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "count": { + "name": "count", + "description": "", + "arguments": { + "n": { + "name": "n", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "INTEGER_KIND" + } + } + }, + "withClass": { + "name": "withClass", + "description": "", + "arguments": { + "c": { + "name": "c", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Container" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "outClass": { + "name": "outClass", + "description": "", + "arguments": {}, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Container" + } + }, + "self": { + "name": "self", + "description": "", + "arguments": {}, + "returnType": { + "kind": "INTERFACE_KIND", + "name": "IFace" + } + }, + "withSelf": { + "name": "withSelf", + "description": "", + "arguments": { + "i": { + "name": "i", + "description": "", + "type": { + "kind": "INTERFACE_KIND", + "name": "IFace" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "VOID_KIND" + } + }, + "method": { + "name": "method", + "description": "", + "arguments": {}, + "returnType": { + "kind": "VOID_KIND" + } + } + } + } + } +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/interface/index.ts b/library/src/module/introspector/test/testdata/interface/index.ts new file mode 100644 index 0000000..5c37cf0 --- /dev/null +++ b/library/src/module/introspector/test/testdata/interface/index.ts @@ -0,0 +1,42 @@ +import { func, object } from "../../../../decorators.js" +import { Container, dag } from "./../../../../../api/client.gen.js" + +/** + * Example of iface + */ +export interface IFace { + /** + * Foo fct + */ + foo: () => string + count: (n: number) => number[] + withClass: (c: Container) => Promise + outClass: () => Container + self(): IFace + withSelf: (i: IFace) => void + + method(): void +} + +@object() +export class Interface { + @func() + hello(): string { + return "hello" + } + + @func() + iface(): IFace { + const iface = { + foo: () => "", + count: (n: number) => [4], + withClass: async (c: Container) => await c.id(), + outClass: () => dag.container(), + self: () => iface, + withSelf: (i: IFace) => {}, + method: () => {}, + } + + return iface + } +} diff --git a/library/src/module/introspector/test/testdata/invalid/expected.json b/library/src/module/introspector/test/testdata/invalid/expected.json new file mode 100644 index 0000000..9c12baa --- /dev/null +++ b/library/src/module/introspector/test/testdata/invalid/expected.json @@ -0,0 +1,6 @@ +{ + "name": "Invalid", + "objects": {}, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/invalid/index.ts b/library/src/module/introspector/test/testdata/invalid/index.ts new file mode 100644 index 0000000..e4f2d19 --- /dev/null +++ b/library/src/module/introspector/test/testdata/invalid/index.ts @@ -0,0 +1 @@ +console.log("Hello world") \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/legacyEnumDecorator/expected.json b/library/src/module/introspector/test/testdata/legacyEnumDecorator/expected.json new file mode 100644 index 0000000..cf71e3a --- /dev/null +++ b/library/src/module/introspector/test/testdata/legacyEnumDecorator/expected.json @@ -0,0 +1,71 @@ +{ + "name": "LegacyEnumDecorator", + "objects": { + "LegacyEnums": { + "name": "LegacyEnums", + "description": "", + "methods": { + "setStatus": { + "name": "setStatus", + "description": "", + "arguments": { + "status": { + "name": "status", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "LegacyStatus" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "LegacyEnums" + } + }, + "getStatus": { + "name": "getStatus", + "description": "", + "arguments": {}, + "returnType": { + "kind": "ENUM_KIND", + "name": "LegacyStatus" + } + } + }, + "properties": { + "status": { + "name": "status", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "LegacyStatus" + }, + "isExposed": true + } + } + } + }, + "enums": { + "LegacyStatus": { + "name": "LegacyStatus", + "description": "Legacy enum exposed through the deprecated decorator.", + "values": { + "ACTIVE": { + "name": "ACTIVE", + "value": "ACTIVE value", + "description": "Active status" + }, + "INACTIVE": { + "name": "INACTIVE", + "value": "INACTIVE value", + "description": "Inactive status" + } + } + } + }, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/legacyEnumDecorator/index.ts b/library/src/module/introspector/test/testdata/legacyEnumDecorator/index.ts new file mode 100644 index 0000000..8f23ba0 --- /dev/null +++ b/library/src/module/introspector/test/testdata/legacyEnumDecorator/index.ts @@ -0,0 +1,35 @@ +import { enumType, func, object } from "../../../../decorators.js" + +/** + * Legacy enum exposed through the deprecated decorator. + */ +@enumType() +export class LegacyStatus { + /** + * Active status + */ + static readonly ACTIVE: string = "ACTIVE value" + + /** + * Inactive status + */ + static readonly INACTIVE: string = "INACTIVE value" +} + +@object() +export class LegacyEnums { + @func() + status: LegacyStatus = LegacyStatus.ACTIVE + + @func() + setStatus(status: LegacyStatus): LegacyEnums { + this.status = status + + return this + } + + @func() + getStatus(): LegacyStatus { + return this.status + } +} diff --git a/library/src/module/introspector/test/testdata/list/expected.json b/library/src/module/introspector/test/testdata/list/expected.json new file mode 100644 index 0000000..9394511 --- /dev/null +++ b/library/src/module/introspector/test/testdata/list/expected.json @@ -0,0 +1,103 @@ +{ + "name": "List", + "objects": { + "List": { + "name": "List", + "description": "", + "methods": { + "create": { + "name": "create", + "description": "", + "arguments": { + "n": { + "name": "n", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "INTEGER_KIND" + } + }, + "isVariadic": true, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "OBJECT_KIND", + "name": "Integer" + } + } + }, + "floats": { + "name": "floats", + "description": "", + "arguments": { + "n": { + "name": "n", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "FLOAT_KIND" + } + }, + "isVariadic": true, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "FLOAT_KIND" + } + } + } + }, + "properties": {} + }, + "Integer": { + "name": "Integer", + "description": "", + "constructor": { + "arguments": { + "value": { + "name": "value", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + } + }, + "methods": { + "positive": { + "name": "positive", + "description": "", + "arguments": {}, + "returnType": { + "kind": "BOOLEAN_KIND" + } + } + }, + "properties": { + "value": { + "name": "value", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isExposed": true + } + } + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/list/index.ts b/library/src/module/introspector/test/testdata/list/index.ts new file mode 100644 index 0000000..2ca113d --- /dev/null +++ b/library/src/module/introspector/test/testdata/list/index.ts @@ -0,0 +1,31 @@ +import type { float } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +@object() +export class Integer { + @func() + value: number + + constructor(value: number) { + this.value = value + } + + @func() + positive(): boolean { + return this.value > 0 + } +} + +@object() +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export class List { + @func() + create(...n: number[]): Integer[] { + return n.map((v) => new Integer(v)) + } + + @func() + floats(...n: float[]): float[] { + return n + } +} diff --git a/library/src/module/introspector/test/testdata/minimal/expected.json b/library/src/module/introspector/test/testdata/minimal/expected.json new file mode 100644 index 0000000..9e2bc22 --- /dev/null +++ b/library/src/module/introspector/test/testdata/minimal/expected.json @@ -0,0 +1,221 @@ +{ + "name": "Minimal", + "objects": { + "Minimal": { + "name": "Minimal", + "description": "This is the Minimal object", + "methods": { + "hello": { + "name": "hello", + "description": "", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + }, + "echo": { + "name": "echo", + "description": "", + "arguments": { + "msg": { + "name": "msg", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "echoOpts": { + "name": "echoOpts", + "description": "EchoOpts does some opts things", + "arguments": { + "msg": { + "name": "msg", + "description": "the message to echo", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "suffix": { + "name": "suffix", + "description": "String to append to the echoed message", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "" + }, + "times": { + "name": "times", + "description": "number of times to repeat the message", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": 1 + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "echoMaybe": { + "name": "echoMaybe", + "description": "", + "arguments": { + "msg": { + "name": "msg", + "description": "the message to echo", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "isQuestion": { + "name": "isQuestion", + "description": "set to true to add a question mark.", + "type": { + "kind": "BOOLEAN_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "echoOptional": { + "name": "echoOptional", + "description": "", + "arguments": { + "msg": { + "name": "msg", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "default" + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "echoOptionalSlice": { + "name": "echoOptionalSlice", + "description": "", + "arguments": { + "msg": { + "name": "msg", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": [ + "foobar" + ] + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "echoes": { + "name": "echoes", + "description": "", + "arguments": { + "msgs": { + "name": "msgs", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + } + }, + "echoesVariadic": { + "name": "echoesVariadic", + "description": "", + "arguments": { + "msgs": { + "name": "msgs", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": true, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "helloVoid": { + "name": "helloVoid", + "description": "", + "arguments": {}, + "returnType": { + "kind": "VOID_KIND" + } + } + }, + "properties": { + "foo": { + "name": "foo", + "description": "This is a field", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + } + } + } + }, + "enums": {}, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/minimal/index.ts b/library/src/module/introspector/test/testdata/minimal/index.ts new file mode 100644 index 0000000..7d06fe3 --- /dev/null +++ b/library/src/module/introspector/test/testdata/minimal/index.ts @@ -0,0 +1,73 @@ +import { func, object } from "../../../../decorators.js" + +/** + * This is the Minimal object + */ +@object() +export class Minimal { + /** + * This is a field + */ + @func() + foo: string = "bar" + + @func() + hello(): string { + return "hello" + } + + @func() + echo(msg: string): string { + return this.echoOpts(msg, "...", 3) + } + + /** + * EchoOpts does some opts things + * + * @param msg the message to echo + * @param suffix String to append to the echoed message + * @param times number of times to repeat the message + */ + @func() + echoOpts(msg: string, suffix: string = "", times: number = 1): string { + msg = msg += suffix + + return msg.repeat(times) + } + + /** + * @param msg the message to echo + * @param isQuestion set to true to add a question mark. + */ + @func() + echoMaybe(msg: string, isQuestion = false): string { + if (isQuestion) { + return this.echo(msg + "?") + } + + return this.echo(msg) + } + + @func() + echoOptional(msg: string = "default"): string { + return this.echo(msg) + } + + @func() + echoOptionalSlice(msg: string[] = ["foobar"]): string { + return this.echo(msg.join("+")) + } + + @func() + echoes(msgs: string[]): string[] { + return [this.echo(msgs.join(" "))] + } + + @func() + echoesVariadic(...msgs: string[]): string { + return this.echo(msgs.join(" ")) + } + + @func() + helloVoid(): void {} +} diff --git a/library/src/module/introspector/test/testdata/multiArgs/expected.json b/library/src/module/introspector/test/testdata/multiArgs/expected.json new file mode 100644 index 0000000..9d24f4e --- /dev/null +++ b/library/src/module/introspector/test/testdata/multiArgs/expected.json @@ -0,0 +1,53 @@ +{ + "name": "MultiArgs", + "objects": { + "MultiArgs": { + "name": "MultiArgs", + "description": "", + "methods": { + "compute": { + "name": "compute", + "description": "", + "arguments": { + "a": { + "name": "a", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "b": { + "name": "b", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "c": { + "name": "c", + "description": "", + "type": { + "kind": "FLOAT_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "FLOAT_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/multiArgs/index.ts b/library/src/module/introspector/test/testdata/multiArgs/index.ts new file mode 100644 index 0000000..ec95b80 --- /dev/null +++ b/library/src/module/introspector/test/testdata/multiArgs/index.ts @@ -0,0 +1,11 @@ +import type { float } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +@object() +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export class MultiArgs { + @func() + compute(a: number, b: number, c: float): float { + return a * b + c + } +} diff --git a/library/src/module/introspector/test/testdata/multipleObjects/bar.ts b/library/src/module/introspector/test/testdata/multipleObjects/bar.ts new file mode 100644 index 0000000..af90e15 --- /dev/null +++ b/library/src/module/introspector/test/testdata/multipleObjects/bar.ts @@ -0,0 +1,20 @@ +/** + * Should be ignored + */ +import { dag } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +/** + * Bar class + */ +@object() +export class Bar { + /** + * Execute the command and return its result + * @param cmd Command to execute + */ + @func() + async exec(cmd: string[]): Promise { + return await dag.container().from("alpine").withExec(cmd).stdout() + } +} diff --git a/library/src/module/introspector/test/testdata/multipleObjects/expected.json b/library/src/module/introspector/test/testdata/multipleObjects/expected.json new file mode 100644 index 0000000..cde42fb --- /dev/null +++ b/library/src/module/introspector/test/testdata/multipleObjects/expected.json @@ -0,0 +1,53 @@ +{ + "name": "MultipleObjects", + "description": "Foo object module\n\nCompose of bar but its file description should be ignore.", + "objects": { + "MultipleObjects": { + "name": "MultipleObjects", + "description": "Foo class", + "methods": { + "bar": { + "name": "bar", + "description": "Return Bar object", + "arguments": {}, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Bar" + } + } + }, + "properties": {} + }, + "Bar": { + "name": "Bar", + "description": "Bar class", + "methods": { + "exec": { + "name": "exec", + "description": "Execute the command and return its result", + "arguments": { + "cmd": { + "name": "cmd", + "description": "Command to execute", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/multipleObjects/foo.ts b/library/src/module/introspector/test/testdata/multipleObjects/foo.ts new file mode 100644 index 0000000..17cb1d6 --- /dev/null +++ b/library/src/module/introspector/test/testdata/multipleObjects/foo.ts @@ -0,0 +1,21 @@ +/** + * Foo object module + * + * Compose of bar but its file description should be ignore. + */ +import { func, object } from "../../../../decorators.js" +import { Bar } from "./bar.js" + +/** + * Foo class + */ +@object() +export class MultipleObjects { + /** + * Return Bar object + */ + @func() + bar(): Bar { + return new Bar() + } +} diff --git a/library/src/module/introspector/test/testdata/multipleObjectsAsFields/expected.json b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/expected.json new file mode 100644 index 0000000..181bf06 --- /dev/null +++ b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/expected.json @@ -0,0 +1,65 @@ +{ + "name": "MultipleObjectsAsFields", + "objects": { + "MultipleObjectsAsFields": { + "name": "MultipleObjectsAsFields", + "description": "", + "constructor": { + "arguments": {} + }, + "methods": {}, + "properties": { + "test": { + "name": "test", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Test" + }, + "isExposed": true + }, + "lint": { + "name": "lint", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Lint" + }, + "isExposed": true + } + } + }, + "Test": { + "name": "Test", + "description": "", + "methods": { + "echo": { + "name": "echo", + "description": "", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + }, + "Lint": { + "name": "Lint", + "description": "", + "methods": { + "echo": { + "name": "echo", + "description": "", + "arguments": {}, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/multipleObjectsAsFields/index.ts b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/index.ts new file mode 100644 index 0000000..88aac38 --- /dev/null +++ b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/index.ts @@ -0,0 +1,14 @@ +import { object, func } from "../../../../decorators.js" +import { Lint } from "./lint.js" +import { Test } from "./test.js" + +@object() +export class MultipleObjectsAsFields { + @func() + test: Test = new Test() + + @func() + lint: Lint = new Lint() + + constructor() {} +} diff --git a/library/src/module/introspector/test/testdata/multipleObjectsAsFields/lint.ts b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/lint.ts new file mode 100644 index 0000000..b20f284 --- /dev/null +++ b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/lint.ts @@ -0,0 +1,9 @@ +import { func, object } from "../../../../decorators.js" + +@object() +export class Lint { + @func() + echo(): string { + return "world" + } +} diff --git a/library/src/module/introspector/test/testdata/multipleObjectsAsFields/test.ts b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/test.ts new file mode 100644 index 0000000..e4c3a07 --- /dev/null +++ b/library/src/module/introspector/test/testdata/multipleObjectsAsFields/test.ts @@ -0,0 +1,9 @@ +import { func, object } from "../../../../decorators.js" + +@object() +export class Test { + @func() + echo(): string { + return "world" + } +} diff --git a/library/src/module/introspector/test/testdata/noDecorators/expected.json b/library/src/module/introspector/test/testdata/noDecorators/expected.json new file mode 100644 index 0000000..d2b5524 --- /dev/null +++ b/library/src/module/introspector/test/testdata/noDecorators/expected.json @@ -0,0 +1,6 @@ +{ + "name": "NoDecorators", + "objects": {}, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/noDecorators/noDecorators.ts b/library/src/module/introspector/test/testdata/noDecorators/noDecorators.ts new file mode 100644 index 0000000..902a269 --- /dev/null +++ b/library/src/module/introspector/test/testdata/noDecorators/noDecorators.ts @@ -0,0 +1,12 @@ +import { func } from "../../../../decorators.js" + +/** + * HelloWorld class + * @object decorator is missing so this class should be ignored. + */ +export class NoDecorators { + @func() + bar(name: string): string { + return `hello ${name}` + } +} diff --git a/library/src/module/introspector/test/testdata/objectParam/expected.json b/library/src/module/introspector/test/testdata/objectParam/expected.json new file mode 100644 index 0000000..425ec08 --- /dev/null +++ b/library/src/module/introspector/test/testdata/objectParam/expected.json @@ -0,0 +1,111 @@ +{ + "name": "ObjectParam", + "objects": { + "ObjectParam": { + "name": "ObjectParam", + "description": "", + "methods": { + "sayHello": { + "name": "sayHello", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Message" + } + }, + "upper": { + "name": "upper", + "description": "", + "arguments": { + "msg": { + "name": "msg", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Message" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "Message" + } + }, + "uppers": { + "name": "uppers", + "description": "", + "arguments": { + "msg": { + "name": "msg", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "OBJECT_KIND", + "name": "Message" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "OBJECT_KIND", + "name": "Message" + } + } + } + }, + "properties": {} + }, + "Message": { + "name": "Message", + "description": "", + "constructor": { + "arguments": { + "content": { + "name": "content", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + } + }, + "methods": {}, + "properties": { + "content": { + "name": "content", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + } + } + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/objectParam/index.ts b/library/src/module/introspector/test/testdata/objectParam/index.ts new file mode 100644 index 0000000..0a7c7dd --- /dev/null +++ b/library/src/module/introspector/test/testdata/objectParam/index.ts @@ -0,0 +1,33 @@ +import { func, object } from "../../../../decorators.js" + +@object() +export class Message { + @func() + content: string + + constructor(content: string) { + this.content = content + } +} + +@object() +export class ObjectParam { + @func() + sayHello(name: string): Message { + return new Message("hello " + name) + } + + @func() + upper(msg: Message): Message { + msg.content = msg.content.toUpperCase() + return msg + } + + @func() + uppers(msg: Message[]): Message[] { + for (let i = 0; i < msg.length; i++) { + msg[i].content = msg[i].content.toUpperCase() + } + return msg + } +} diff --git a/library/src/module/introspector/test/testdata/optionalParameter/expected.json b/library/src/module/introspector/test/testdata/optionalParameter/expected.json new file mode 100644 index 0000000..49e0b03 --- /dev/null +++ b/library/src/module/introspector/test/testdata/optionalParameter/expected.json @@ -0,0 +1,229 @@ +{ + "name": "OptionalParameter", + "objects": { + "OptionalParameter": { + "name": "OptionalParameter", + "description": "OptionalParameter class", + "methods": { + "helloWorld": { + "name": "helloWorld", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "isTrue": { + "name": "isTrue", + "description": "", + "arguments": { + "value": { + "name": "value", + "description": "", + "type": { + "kind": "BOOLEAN_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "BOOLEAN_KIND" + } + }, + "add": { + "name": "add", + "description": "", + "arguments": { + "a": { + "name": "a", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": 0 + }, + "b": { + "name": "b", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": 0 + } + }, + "returnType": { + "kind": "INTEGER_KIND" + } + }, + "sayBool": { + "name": "sayBool", + "description": "", + "arguments": { + "value": { + "name": "value", + "description": "", + "type": { + "kind": "BOOLEAN_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": false + } + }, + "returnType": { + "kind": "BOOLEAN_KIND" + } + }, + "foo": { + "name": "foo", + "description": "", + "arguments": { + "a": { + "name": "a", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "b": { + "name": "b", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": true, + "isOptional": true + }, + "c": { + "name": "c", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true + }, + "d": { + "name": "d", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "foo" + }, + "e": { + "name": "e", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": true, + "isOptional": true, + "defaultValue": null + }, + "f": { + "name": "f", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": true, + "isOptional": true, + "defaultValue": "bar" + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "array": { + "name": "array", + "description": "", + "arguments": { + "a": { + "name": "a", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": [ + "a", + "b", + "c", + "d" + ] + }, + "b": { + "name": "b", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "c": { + "name": "c", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": true, + "isOptional": true + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/optionalParameter/index.ts b/library/src/module/introspector/test/testdata/optionalParameter/index.ts new file mode 100644 index 0000000..4b578fe --- /dev/null +++ b/library/src/module/introspector/test/testdata/optionalParameter/index.ts @@ -0,0 +1,48 @@ +import { func, object } from "../../../../decorators.js" + +/** + * OptionalParameter class + */ +@object() +export class OptionalParameter { + @func() + helloWorld(name?: string): string { + return `hello world ${name}` + } + + @func() + isTrue(value: boolean): boolean { + return value + } + + @func() + add(a = 0, b = 0): number { + return a + b + } + + @func() + sayBool(value = false): boolean { + return value + } + + @func() + foo( + a: string, + b: string | null, + c?: string, + d: string = "foo", + e: string | null = null, + f: string | null = "bar", + ): string { + return [a, b, c, d, e, f].map((v) => JSON.stringify(v)).join(", ") + } + + @func() + array( + a: string[] = ["a", "b", "c", "d"], + b: (string | null)[], + c: (string | null)[] | null, + ): string { + return [a, b, c].map((v) => JSON.stringify(v)).join(", ") + } +} diff --git a/library/src/module/introspector/test/testdata/primitives/index.ts b/library/src/module/introspector/test/testdata/primitives/index.ts new file mode 100644 index 0000000..9966e56 --- /dev/null +++ b/library/src/module/introspector/test/testdata/primitives/index.ts @@ -0,0 +1,19 @@ +import { func, object } from "../../../../decorators.js" + +@object() +export class Primitives { + @func() + str(v: String): String { + return v + } + + @func() + bool(v: Boolean): Boolean { + return v + } + + @func() + integer(v: Number): Number { + return v + } +} diff --git a/library/src/module/introspector/test/testdata/privateMethod/expected.json b/library/src/module/introspector/test/testdata/privateMethod/expected.json new file mode 100644 index 0000000..d2f17d3 --- /dev/null +++ b/library/src/module/introspector/test/testdata/privateMethod/expected.json @@ -0,0 +1,53 @@ +{ + "name": "PrivateMethod", + "description": "HelloWorld module with private things", + "objects": { + "PrivateMethod": { + "name": "PrivateMethod", + "description": "PrivateMethod class", + "methods": { + "greeting": { + "name": "greeting", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "helloWorld": { + "name": "helloWorld", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/privateMethod/index.ts b/library/src/module/introspector/test/testdata/privateMethod/index.ts new file mode 100644 index 0000000..6d22791 --- /dev/null +++ b/library/src/module/introspector/test/testdata/privateMethod/index.ts @@ -0,0 +1,24 @@ +/** + * HelloWorld module with private things + */ +import { func, object } from "../../../../decorators.js" + +/** + * PrivateMethod class + */ +@object() +export class PrivateMethod { + private privateGreeting(name: string): string { + return `Private hello ${name}` + } + + @func() + greeting(name: string): string { + return this.privateGreeting(name) + } + + @func() + helloWorld(name: string): string { + return `hello ${name}` + } +} diff --git a/library/src/module/introspector/test/testdata/references/expected.json b/library/src/module/introspector/test/testdata/references/expected.json new file mode 100644 index 0000000..4454219 --- /dev/null +++ b/library/src/module/introspector/test/testdata/references/expected.json @@ -0,0 +1,186 @@ +{ + "name": "References", + "objects": { + "References": { + "name": "References", + "description": "References class\n\ntest", + "constructor": { + "arguments": { + "data": { + "name": "data", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "OBJECT_KIND", + "name": "Data" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": [] + } + } + }, + "methods": { + "appendData": { + "name": "addData", + "description": "", + "alias": "appendData", + "arguments": { + "data": { + "name": "data", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "OBJECT_KIND", + "name": "Data" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "References" + } + }, + "dumpDatas": { + "name": "dumpDatas", + "description": "", + "arguments": {}, + "returnType": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "OBJECT_KIND", + "name": "Data" + } + } + }, + "testEnum": { + "name": "testEnum", + "description": "", + "arguments": { + "test": { + "name": "test", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "TestEnum" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "b" + } + }, + "returnType": { + "kind": "ENUM_KIND", + "name": "TestEnum" + } + }, + "testEnumStatic": { + "name": "testEnumStatic", + "description": "", + "arguments": { + "test": { + "name": "test", + "description": "", + "type": { + "kind": "ENUM_KIND", + "name": "TestEnum" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "a" + } + }, + "returnType": { + "kind": "ENUM_KIND", + "name": "TestEnum" + } + }, + "testDefaultValue": { + "name": "testDefaultValue", + "description": "Doc\n\nfoo", + "arguments": { + "foo": { + "name": "foo", + "description": "Doc\n\ntest", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false, + "defaultValue": "a" + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": { + "data": { + "name": "data", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "OBJECT_KIND", + "name": "Data" + } + }, + "isExposed": true + } + } + }, + "Data": { + "name": "Data", + "description": "Data", + "properties": { + "item1": { + "name": "item1", + "description": "Item 1", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": true + }, + "item2": { + "name": "item2", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isExposed": true + } + } + } + }, + "enums": { + "TestEnum": { + "name": "TestEnum", + "description": "Test Enum", + "values": { + "A": { + "name": "A", + "value": "a", + "description": "Field A" + }, + "B": { + "name": "B", + "value": "b", + "description": "Field B" + } + } + } + }, + "interfaces": {} +} diff --git a/library/src/module/introspector/test/testdata/references/index.ts b/library/src/module/introspector/test/testdata/references/index.ts new file mode 100644 index 0000000..44351f7 --- /dev/null +++ b/library/src/module/introspector/test/testdata/references/index.ts @@ -0,0 +1,57 @@ +import { func, object } from "../../../../decorators.js" +import { defaultEnum, TestEnum } from "./types.js" +import type { STR, Data } from "./types.js" + +/** + * References class + * + * test + */ +@object() +export class References { + @func() + data: Data[] + + constructor(data: Data[] = []) { + this.data = data + } + + @func("appendData") + addData(data: Data[]): References { + this.data.push(...data) + + return this + } + + @func() + dumpDatas(): Data[] { + return this.data + } + + @func() + testEnum(test: TestEnum = defaultEnum): TestEnum { + return test + } + + @func() + testEnumStatic(test: TestEnum = TestEnum.A): TestEnum { + return test + } + + /** + * Doc + * + * foo + */ + @func() + async testDefaultValue( + /** + * Doc + * + * test + */ + foo: STR = "a", + ): Promise { + return foo + } +} diff --git a/library/src/module/introspector/test/testdata/references/types.ts b/library/src/module/introspector/test/testdata/references/types.ts new file mode 100644 index 0000000..884338f --- /dev/null +++ b/library/src/module/introspector/test/testdata/references/types.ts @@ -0,0 +1,29 @@ +/** + * Data + */ +export type Data = { + /** + * Item 1 + */ + item1: string + item2: number +} + +/** + * Test Enum + */ +export enum TestEnum { + /** + * Field A + */ + A = "a", + + /** + * Field B + */ + B = "b", +} + +export const defaultEnum = TestEnum.B + +export type STR = string \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/scalar/expected.json b/library/src/module/introspector/test/testdata/scalar/expected.json new file mode 100644 index 0000000..2e60828 --- /dev/null +++ b/library/src/module/introspector/test/testdata/scalar/expected.json @@ -0,0 +1,60 @@ +{ + "name": "Scalar", + "objects": { + "Scalar": { + "name": "Scalar", + "description": "", + "methods": { + "fromPlatform": { + "name": "fromPlatform", + "description": "", + "arguments": { + "platform": { + "name": "platform", + "description": "", + "type": { + "kind": "SCALAR_KIND", + "name": "Platform" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "fromPlatforms": { + "name": "fromPlatforms", + "description": "", + "arguments": { + "platforms": { + "name": "platforms", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "SCALAR_KIND", + "name": "Platform" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/scalar/index.ts b/library/src/module/introspector/test/testdata/scalar/index.ts new file mode 100644 index 0000000..c166b5f --- /dev/null +++ b/library/src/module/introspector/test/testdata/scalar/index.ts @@ -0,0 +1,15 @@ +import type { Platform } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +@object() +export class Scalar { + @func() + fromPlatform(platform: Platform): string { + return platform as string + } + + @func() + fromPlatforms(platforms: Platform[]): string[] { + return platforms.map((p) => p as string) + } +} diff --git a/library/src/module/introspector/test/testdata/state/expected.json b/library/src/module/introspector/test/testdata/state/expected.json new file mode 100644 index 0000000..c2fcad0 --- /dev/null +++ b/library/src/module/introspector/test/testdata/state/expected.json @@ -0,0 +1,117 @@ +{ + "name": "State", + "description": "A State Module with Alpine implementation for testing purpose only.\n\nWarning: Do not reproduce in production.", + "objects": { + "State": { + "name": "State", + "description": "State module", + "methods": { + "base": { + "name": "base", + "description": "Returns a base Alpine container", + "arguments": { + "version": { + "name": "version", + "description": "version to use (default to: 3.16.2)", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "State" + } + }, + "install": { + "name": "install", + "description": "", + "arguments": { + "pkgs": { + "name": "pkgs", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "OBJECT_KIND", + "name": "State" + } + }, + "exec": { + "name": "exec", + "description": "", + "arguments": { + "cmd": { + "name": "cmd", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "STRING_KIND" + } + } + }, + "properties": { + "version": { + "name": "version", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": false + }, + "user": { + "name": "user", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isExposed": false + }, + "packages": { + "name": "packages", + "description": "packages to install", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isExposed": true + }, + "ctr": { + "name": "ctr", + "description": "", + "type": { + "kind": "OBJECT_KIND", + "name": "Container" + }, + "isExposed": true + } + } + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/state/state.ts b/library/src/module/introspector/test/testdata/state/state.ts new file mode 100644 index 0000000..96a5184 --- /dev/null +++ b/library/src/module/introspector/test/testdata/state/state.ts @@ -0,0 +1,56 @@ +/** + * A State Module with Alpine implementation for testing purpose only. + * + * Warning: Do not reproduce in production. + */ +import { dag, Container } from "../../../../../api/client.gen.js" +import { func, object } from "../../../../decorators.js" + +/** + * State module + */ +@object() +export class State { + private version = "3.16.2" + + protected user = "root" + + /** + * packages to install + */ + @func() + public packages: string[] = [] + + @func() + ctr?: Container = undefined + + /** + * Returns a base Alpine container + * @param version version to use (default to: 3.16.2) + */ + @func() + base(version?: string): State { + if (version) { + this.version = version + } + + this.ctr = dag.container().from(`alpine:${this.version}`) + + return this + } + + @func() + install(pkgs: string[]): State { + this.packages.push(...pkgs) + + return this + } + + @func() + async exec(cmd: string[]): Promise { + return this.ctr!.withExec(["apk", "add", ...this.packages]) + .withExec(cmd) + .withUser(this.user) + .stdout() + } +} diff --git a/library/src/module/introspector/test/testdata/variadic/expected.json b/library/src/module/introspector/test/testdata/variadic/expected.json new file mode 100644 index 0000000..94b9e3d --- /dev/null +++ b/library/src/module/introspector/test/testdata/variadic/expected.json @@ -0,0 +1,122 @@ +{ + "name": "Variadic", + "objects": { + "Variadic": { + "name": "Variadic", + "description": "", + "methods": { + "fullVariadicStr": { + "name": "fullVariadicStr", + "description": "", + "arguments": { + "vars": { + "name": "vars", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": true, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "semiVariadicStr": { + "name": "semiVariadicStr", + "description": "", + "arguments": { + "separator": { + "name": "separator", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "vars": { + "name": "vars", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "STRING_KIND" + } + }, + "isVariadic": true, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "STRING_KIND" + } + }, + "fullVariadicNum": { + "name": "fullVariadicNum", + "description": "", + "arguments": { + "vars": { + "name": "vars", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "INTEGER_KIND" + } + }, + "isVariadic": true, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "INTEGER_KIND" + } + }, + "semiVariadicNum": { + "name": "semiVariadicNum", + "description": "", + "arguments": { + "mul": { + "name": "mul", + "description": "", + "type": { + "kind": "INTEGER_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + }, + "vars": { + "name": "vars", + "description": "", + "type": { + "kind": "LIST_KIND", + "typeDef": { + "kind": "INTEGER_KIND" + } + }, + "isVariadic": true, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "INTEGER_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/variadic/index.ts b/library/src/module/introspector/test/testdata/variadic/index.ts new file mode 100644 index 0000000..b45b252 --- /dev/null +++ b/library/src/module/introspector/test/testdata/variadic/index.ts @@ -0,0 +1,24 @@ +import { func, object } from "../../../../decorators.js" + +@object() +export class Variadic { + @func() + fullVariadicStr(...vars: string[]): string { + return `hello ${vars.join(" ")}` + } + + @func() + semiVariadicStr(separator: string, ...vars: string[]): string { + return `hello ${vars.join(separator)}` + } + + @func() + fullVariadicNum(...vars: number[]): number { + return vars.reduce((a, b) => a + b) + } + + @func() + semiVariadicNum(mul: number, ...vars: number[]): number { + return vars.reduce((a, b) => a + b, 0) * mul + } +} diff --git a/library/src/module/introspector/test/testdata/voidReturn/expected.json b/library/src/module/introspector/test/testdata/voidReturn/expected.json new file mode 100644 index 0000000..c4171df --- /dev/null +++ b/library/src/module/introspector/test/testdata/voidReturn/expected.json @@ -0,0 +1,52 @@ +{ + "name": "VoidReturn", + "objects": { + "VoidReturn": { + "name": "VoidReturn", + "description": "VoidReturn class", + "methods": { + "helloWorld": { + "name": "helloWorld", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": false + } + }, + "returnType": { + "kind": "VOID_KIND" + } + }, + "asyncHelloWorld": { + "name": "asyncHelloWorld", + "description": "", + "arguments": { + "name": { + "name": "name", + "description": "", + "type": { + "kind": "STRING_KIND" + }, + "isVariadic": false, + "isNullable": false, + "isOptional": true + } + }, + "returnType": { + "kind": "VOID_KIND" + } + } + }, + "properties": {} + } + }, + "enums": {}, + "interfaces": {} +} \ No newline at end of file diff --git a/library/src/module/introspector/test/testdata/voidReturn/index.ts b/library/src/module/introspector/test/testdata/voidReturn/index.ts new file mode 100644 index 0000000..10a3c52 --- /dev/null +++ b/library/src/module/introspector/test/testdata/voidReturn/index.ts @@ -0,0 +1,17 @@ +import { func, object } from "../../../../decorators.js" + +/** + * VoidReturn class + */ +@object() +export class VoidReturn { + @func() + helloWorld(name: string): void { + console.log(`hello ${name}`) + } + + @func() + async asyncHelloWorld(name?: string): Promise { + console.log(`async hello ${name}`) + } +}