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}`) + } +}