openapi-typesafe 1.0.0-rc.1 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -5
- package/dist/adapters/redocly-loader/configured-headers.cjs +32 -0
- package/dist/adapters/redocly-loader/configured-headers.cjs.map +1 -0
- package/dist/adapters/redocly-loader/configured-headers.mjs +30 -0
- package/dist/adapters/redocly-loader/configured-headers.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +19 -6
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +18 -5
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.cjs +37 -4
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.mjs +37 -4
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-resolution-check.cjs +191 -0
- package/dist/adapters/redocly-loader/ref-resolution-check.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-resolution-check.mjs +189 -0
- package/dist/adapters/redocly-loader/ref-resolution-check.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-resolution-steps.cjs +73 -0
- package/dist/adapters/redocly-loader/ref-resolution-steps.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-resolution-steps.mjs +60 -0
- package/dist/adapters/redocly-loader/ref-resolution-steps.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +41 -14
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -14
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +23 -5
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +23 -5
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +9 -1
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +9 -1
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +2 -1
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -1
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +2 -1
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -1
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -1
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -1
- package/dist/api/default-ports.cjs +9 -0
- package/dist/api/default-ports.cjs.map +1 -1
- package/dist/api/default-ports.mjs +8 -1
- package/dist/api/default-ports.mjs.map +1 -1
- package/dist/api/discriminator-patch.cjs +5 -1
- package/dist/api/discriminator-patch.cjs.map +1 -1
- package/dist/api/discriminator-patch.mjs +5 -1
- package/dist/api/discriminator-patch.mjs.map +1 -1
- package/dist/api/document-refs.cjs +15 -12
- package/dist/api/document-refs.cjs.map +1 -1
- package/dist/api/document-refs.mjs +15 -12
- package/dist/api/document-refs.mjs.map +1 -1
- package/dist/api/document-run.cjs +4 -2
- package/dist/api/document-run.cjs.map +1 -1
- package/dist/api/document-run.mjs +4 -2
- package/dist/api/document-run.mjs.map +1 -1
- package/dist/api/footer-sink.cjs +25 -2
- package/dist/api/footer-sink.cjs.map +1 -1
- package/dist/api/footer-sink.mjs +25 -2
- package/dist/api/footer-sink.mjs.map +1 -1
- package/dist/api/legacy-callback-warning.cjs +4 -1
- package/dist/api/legacy-callback-warning.cjs.map +1 -1
- package/dist/api/legacy-callback-warning.mjs +4 -1
- package/dist/api/legacy-callback-warning.mjs.map +1 -1
- package/dist/api/legacy-ts-helpers.cjs.map +1 -1
- package/dist/api/legacy-ts-helpers.mjs.map +1 -1
- package/dist/api/legacy-utils.cjs.map +1 -1
- package/dist/api/legacy-utils.mjs.map +1 -1
- package/dist/api/openapi-ts.cjs +2 -1
- package/dist/api/openapi-ts.cjs.map +1 -1
- package/dist/api/openapi-ts.mjs +3 -2
- package/dist/api/openapi-ts.mjs.map +1 -1
- package/dist/api/transform-context.cjs +1 -1
- package/dist/api/transform-context.cjs.map +1 -1
- package/dist/api/transform-context.mjs +1 -1
- package/dist/api/transform-context.mjs.map +1 -1
- package/dist/api/transform-schema.cjs.map +1 -1
- package/dist/api/transform-schema.mjs.map +1 -1
- package/dist/application/print/type-printer.cjs +2 -1
- package/dist/application/print/type-printer.cjs.map +1 -1
- package/dist/application/print/type-printer.mjs +2 -1
- package/dist/application/print/type-printer.mjs.map +1 -1
- package/dist/application/transform/document/parameters.cjs +1 -1
- package/dist/application/transform/document/parameters.cjs.map +1 -1
- package/dist/application/transform/document/parameters.mjs +1 -1
- package/dist/application/transform/document/parameters.mjs.map +1 -1
- package/dist/application/transform/document/paths.cjs +1 -1
- package/dist/application/transform/document/paths.cjs.map +1 -1
- package/dist/application/transform/document/paths.mjs +1 -1
- package/dist/application/transform/document/paths.mjs.map +1 -1
- package/dist/application/transform/footer/evaluation.cjs +9 -0
- package/dist/application/transform/footer/evaluation.cjs.map +1 -1
- package/dist/application/transform/footer/evaluation.mjs +8 -1
- package/dist/application/transform/footer/evaluation.mjs.map +1 -1
- package/dist/application/transform/footer/type-evaluation.cjs +4 -112
- package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
- package/dist/application/transform/footer/type-evaluation.mjs +4 -112
- package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
- package/dist/application/transform/footer/type-indexing.cjs +107 -0
- package/dist/application/transform/footer/type-indexing.cjs.map +1 -0
- package/dist/application/transform/footer/type-indexing.mjs +105 -0
- package/dist/application/transform/footer/type-indexing.mjs.map +1 -0
- package/dist/cli/api-settings.cjs +78 -0
- package/dist/cli/api-settings.cjs.map +1 -0
- package/dist/cli/api-settings.mjs +73 -0
- package/dist/cli/api-settings.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +1 -0
- package/dist/cli/cli-arguments.cjs.map +1 -1
- package/dist/cli/cli-arguments.mjs +1 -1
- package/dist/cli/cli-arguments.mjs.map +1 -1
- package/dist/cli/help-text.cjs +3 -3
- package/dist/cli/help-text.cjs.map +1 -1
- package/dist/cli/help-text.mjs +3 -3
- package/dist/cli/help-text.mjs.map +1 -1
- package/dist/cli/redocly-apis.cjs +8 -4
- package/dist/cli/redocly-apis.cjs.map +1 -1
- package/dist/cli/redocly-apis.mjs +7 -3
- package/dist/cli/redocly-apis.mjs.map +1 -1
- package/dist/cli/run-cli.cjs +5 -1
- package/dist/cli/run-cli.cjs.map +1 -1
- package/dist/cli/run-cli.mjs +5 -1
- package/dist/cli/run-cli.mjs.map +1 -1
- package/dist/domain/errors.cjs +4 -1
- package/dist/domain/errors.cjs.map +1 -1
- package/dist/domain/errors.mjs +4 -1
- package/dist/domain/errors.mjs.map +1 -1
- package/dist/domain/ir/constructors.cjs +2 -0
- package/dist/domain/ir/constructors.cjs.map +1 -1
- package/dist/domain/ir/constructors.mjs +2 -1
- package/dist/domain/ir/constructors.mjs.map +1 -1
- package/dist/domain/openapi/path-templates.cjs +1 -1
- package/dist/domain/openapi/path-templates.cjs.map +1 -1
- package/dist/domain/openapi/path-templates.mjs +1 -1
- package/dist/domain/openapi/path-templates.mjs.map +1 -1
- package/dist/domain/url-credentials.cjs +10 -0
- package/dist/domain/url-credentials.cjs.map +1 -0
- package/dist/domain/url-credentials.mjs +8 -0
- package/dist/domain/url-credentials.mjs.map +1 -0
- package/dist/domain/warnings.cjs +9 -1
- package/dist/domain/warnings.cjs.map +1 -1
- package/dist/domain/warnings.mjs +9 -1
- package/dist/domain/warnings.mjs.map +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1160 -53
- package/dist/index.d.mts +1160 -53
- package/dist/index.d.ts +1160 -53
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/transform/path-item-object.cjs.map +1 -1
- package/dist/transform/path-item-object.mjs.map +1 -1
- package/package.json +6 -5
- package/src/adapters/redocly-loader/configured-headers.ts +65 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +22 -7
- package/src/adapters/redocly-loader/ref-access.ts +60 -5
- package/src/adapters/redocly-loader/ref-resolution-check.ts +257 -0
- package/src/adapters/redocly-loader/ref-resolution-steps.ts +113 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +77 -21
- package/src/adapters/redocly-loader/schema-load-errors.ts +33 -11
- package/src/adapters/redocly-loader/unsupported-keys.ts +17 -2
- package/src/adapters/terminal-logger/terminal-logger.ts +9 -5
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +2 -1
- package/src/adapters/type-ast-bridge/print-typescript.ts +3 -1
- package/src/adapters/type-ast-bridge/typescript-types.ts +57 -5
- package/src/api/default-ports.ts +16 -0
- package/src/api/discriminator-patch.ts +7 -2
- package/src/api/document-refs.ts +19 -15
- package/src/api/document-run.ts +9 -6
- package/src/api/footer-sink.ts +34 -2
- package/src/api/legacy-callback-warning.ts +7 -3
- package/src/api/legacy-ts-helpers.ts +7 -5
- package/src/api/legacy-utils.ts +1 -1
- package/src/api/openapi-ts.ts +2 -0
- package/src/api/run-context.ts +34 -0
- package/src/api/transform-context.ts +10 -8
- package/src/api/transform-schema.ts +6 -5
- package/src/application/print/type-printer.ts +2 -1
- package/src/application/transform/document/parameters.ts +2 -1
- package/src/application/transform/document/paths.ts +2 -1
- package/src/application/transform/footer/evaluation.ts +10 -0
- package/src/application/transform/footer/type-evaluation.ts +6 -133
- package/src/application/transform/footer/type-indexing.ts +152 -0
- package/src/cli/api-settings.ts +109 -0
- package/src/cli/cli-arguments.ts +5 -2
- package/src/cli/help-text.ts +4 -4
- package/src/cli/redocly-apis.ts +13 -7
- package/src/cli/run-cli.ts +5 -1
- package/src/domain/errors.ts +8 -2
- package/src/domain/ir/constructors.ts +3 -0
- package/src/domain/ir/nodes.ts +9 -6
- package/src/domain/openapi/path-templates.ts +2 -1
- package/src/domain/url-credentials.ts +18 -0
- package/src/domain/warnings.ts +8 -0
- package/src/index.ts +1 -0
- package/src/transform/path-item-object.ts +6 -2
- package/src/types/generator-options.ts +12 -32
- package/src/types/openapi-common.ts +1 -0
- package/src/types/openapi-request.ts +3 -0
- package/src/types/openapi-schema.ts +2 -0
- package/src/types/openapi-security.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redocly-apis.cjs","sources":["../../src/cli/redocly-apis.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport type { GeneratorOptions } from \"../types.js\";\nimport { GENERATOR_FLAGS, type GeneratorFlags } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf, fixOption } from \"./fix-option.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/** The `apis` of a Redocly config: each API is generated into its `x-openapi-ts.output`. */\n\n/** The key of an API's openapi-typesafe settings in `redocly.yaml`. */\nconst REDOCLY_CONFIG_KEY = \"x-openapi-ts\";\n\
|
|
1
|
+
{"version":3,"file":"redocly-apis.cjs","sources":["../../src/cli/redocly-apis.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport type { GeneratorOptions } from \"../types.js\";\nimport {\n type ApiSettings,\n apiRefLimitOptions,\n FIX_SETTING,\n OUTPUT_SETTING,\n unknownSettingWarnings,\n} from \"./api-settings.js\";\nimport { GENERATOR_FLAGS, type GeneratorFlags } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf, fixOption } from \"./fix-option.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/** The `apis` of a Redocly config: each API is generated into its `x-openapi-ts.output`. */\n\n/** The key of an API's openapi-typesafe settings in `redocly.yaml`. */\nconst REDOCLY_CONFIG_KEY = \"x-openapi-ts\";\n\ninterface RedoclyApi {\n readonly name: string;\n readonly root: string;\n readonly settings: ApiSettings | undefined;\n}\n\nfunction redoclyApisOf(redocly: RedoclyConfig): RedoclyApi[] {\n return Object.entries(redocly.apis ?? {}).map(([name, api]) => {\n const settings = (api as Record<string, unknown>)[REDOCLY_CONFIG_KEY];\n return { name, root: api.root, settings: settings as ApiSettings | undefined };\n });\n}\n\nexport function hasRedoclyApis(redocly: RedoclyConfig): boolean {\n return Object.keys(redocly.apis ?? {}).length > 0;\n}\n\n/** The boolean flags an API sets, in camelCase or kebab-case; they win over the CLI's flags. */\nfunction apiFlags(settings: ApiSettings): GeneratorFlags {\n const flags: Partial<Record<(typeof GENERATOR_FLAGS)[number], boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n const value = typeof settings[name] === \"boolean\" ? settings[name] : settings[kebabCase(name)];\n if (typeof value === \"boolean\") {\n flags[name] = value;\n }\n }\n return flags;\n}\n\n/** The API's `fix` names; they replace the CLI's `--fix`, as its boolean settings win (ADR-021). */\nfunction apiFixNames(settings: ApiSettings): readonly OutputFixName[] | undefined {\n return fixNamesOf(settings[FIX_SETTING]);\n}\n\n/** Paths in the config are relative to the config file; without a file, to the working dir. */\nfunction configRootOf(redocly: RedoclyConfig, cwd: URL): URL {\n return redocly.configFile ? resolveLocationUrl(redocly.configFile, cwd) : cwd;\n}\n\nasync function generateApi(run: CliRun, redocly: RedoclyConfig, api: RedoclyApi): Promise<void> {\n if (!api.settings?.[OUTPUT_SETTING]) {\n throw cliError(\n \"CLI_CONFIG_OUTPUT_MISSING\",\n `API ${api.name} is missing an \\`${REDOCLY_CONFIG_KEY}.output\\` key. ` +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n for (const warning of unknownSettingWarnings(api.name, api.settings)) {\n run.deps.logger.warn(warning);\n }\n const output = String(api.settings[OUTPUT_SETTING]);\n const configRoot = configRootOf(redocly, run.deps.cwd);\n const options: GeneratorOptions = {\n ...run.args.generatorFlags,\n ...apiFlags(api.settings),\n ...refLimitOptions(run.args, run.deps.cwd),\n ...apiRefLimitOptions(api.name, api.settings, configRoot),\n ...fixOption(apiFixNames(api.settings) ?? run.args.fix),\n redocly,\n };\n const contents = await run.deps.generate(resolveLocationUrl(api.root, configRoot), options);\n emitOutput(\n run,\n { source: api.name, output, file: resolveLocationUrl(output, configRoot) },\n contents,\n );\n}\n\n/**\n * Generate every API of the config, concurrently. Every API is generated or checked even when\n * another fails, so `--check` reports a stale output wherever it is; the failures are returned\n * in the order of the config.\n */\nexport async function generateRedoclyApis(run: CliRun, redocly: RedoclyConfig): Promise<unknown[]> {\n const apis = redoclyApisOf(redocly);\n const results = await Promise.allSettled(apis.map((api) => generateApi(run, redocly, api)));\n return results.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n}\n"],"names":["GENERATOR_FLAGS","kebabCase","fixNamesOf","FIX_SETTING","resolveLocationUrl","OUTPUT_SETTING","cliError","MULTIPLE_SCHEMAS_DOCS_URL","unknownSettingWarnings","refLimitOptions","apiRefLimitOptions","fixOption","emitOutput"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { kebabCase } from 'scule';
|
|
2
|
+
import { OUTPUT_SETTING, unknownSettingWarnings, apiRefLimitOptions, FIX_SETTING } from './api-settings.mjs';
|
|
2
3
|
import { GENERATOR_FLAGS } from './cli-arguments.mjs';
|
|
3
4
|
import { cliError } from './cli-errors.mjs';
|
|
4
5
|
import { resolveLocationUrl, emitOutput } from './cli-output.mjs';
|
|
@@ -7,7 +8,6 @@ import { fixOption, fixNamesOf } from './fix-option.mjs';
|
|
|
7
8
|
import { refLimitOptions } from './ref-limits.mjs';
|
|
8
9
|
|
|
9
10
|
const REDOCLY_CONFIG_KEY = "x-openapi-ts";
|
|
10
|
-
const FIX_SETTING = "fix";
|
|
11
11
|
function redoclyApisOf(redocly) {
|
|
12
12
|
return Object.entries(redocly.apis ?? {}).map(([name, api]) => {
|
|
13
13
|
const settings = api[REDOCLY_CONFIG_KEY];
|
|
@@ -34,18 +34,22 @@ function configRootOf(redocly, cwd) {
|
|
|
34
34
|
return redocly.configFile ? resolveLocationUrl(redocly.configFile, cwd) : cwd;
|
|
35
35
|
}
|
|
36
36
|
async function generateApi(run, redocly, api) {
|
|
37
|
-
if (!api.settings?.
|
|
37
|
+
if (!api.settings?.[OUTPUT_SETTING]) {
|
|
38
38
|
throw cliError(
|
|
39
39
|
"CLI_CONFIG_OUTPUT_MISSING",
|
|
40
40
|
`API ${api.name} is missing an \`${REDOCLY_CONFIG_KEY}.output\` key. See ${MULTIPLE_SCHEMAS_DOCS_URL}`
|
|
41
41
|
);
|
|
42
42
|
}
|
|
43
|
-
const
|
|
43
|
+
for (const warning of unknownSettingWarnings(api.name, api.settings)) {
|
|
44
|
+
run.deps.logger.warn(warning);
|
|
45
|
+
}
|
|
46
|
+
const output = String(api.settings[OUTPUT_SETTING]);
|
|
44
47
|
const configRoot = configRootOf(redocly, run.deps.cwd);
|
|
45
48
|
const options = {
|
|
46
49
|
...run.args.generatorFlags,
|
|
47
50
|
...apiFlags(api.settings),
|
|
48
51
|
...refLimitOptions(run.args, run.deps.cwd),
|
|
52
|
+
...apiRefLimitOptions(api.name, api.settings, configRoot),
|
|
49
53
|
...fixOption(apiFixNames(api.settings) ?? run.args.fix),
|
|
50
54
|
redocly
|
|
51
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redocly-apis.mjs","sources":["../../src/cli/redocly-apis.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport type { GeneratorOptions } from \"../types.js\";\nimport { GENERATOR_FLAGS, type GeneratorFlags } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf, fixOption } from \"./fix-option.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/** The `apis` of a Redocly config: each API is generated into its `x-openapi-ts.output`. */\n\n/** The key of an API's openapi-typesafe settings in `redocly.yaml`. */\nconst REDOCLY_CONFIG_KEY = \"x-openapi-ts\";\n\
|
|
1
|
+
{"version":3,"file":"redocly-apis.mjs","sources":["../../src/cli/redocly-apis.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport type { GeneratorOptions } from \"../types.js\";\nimport {\n type ApiSettings,\n apiRefLimitOptions,\n FIX_SETTING,\n OUTPUT_SETTING,\n unknownSettingWarnings,\n} from \"./api-settings.js\";\nimport { GENERATOR_FLAGS, type GeneratorFlags } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf, fixOption } from \"./fix-option.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/** The `apis` of a Redocly config: each API is generated into its `x-openapi-ts.output`. */\n\n/** The key of an API's openapi-typesafe settings in `redocly.yaml`. */\nconst REDOCLY_CONFIG_KEY = \"x-openapi-ts\";\n\ninterface RedoclyApi {\n readonly name: string;\n readonly root: string;\n readonly settings: ApiSettings | undefined;\n}\n\nfunction redoclyApisOf(redocly: RedoclyConfig): RedoclyApi[] {\n return Object.entries(redocly.apis ?? {}).map(([name, api]) => {\n const settings = (api as Record<string, unknown>)[REDOCLY_CONFIG_KEY];\n return { name, root: api.root, settings: settings as ApiSettings | undefined };\n });\n}\n\nexport function hasRedoclyApis(redocly: RedoclyConfig): boolean {\n return Object.keys(redocly.apis ?? {}).length > 0;\n}\n\n/** The boolean flags an API sets, in camelCase or kebab-case; they win over the CLI's flags. */\nfunction apiFlags(settings: ApiSettings): GeneratorFlags {\n const flags: Partial<Record<(typeof GENERATOR_FLAGS)[number], boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n const value = typeof settings[name] === \"boolean\" ? settings[name] : settings[kebabCase(name)];\n if (typeof value === \"boolean\") {\n flags[name] = value;\n }\n }\n return flags;\n}\n\n/** The API's `fix` names; they replace the CLI's `--fix`, as its boolean settings win (ADR-021). */\nfunction apiFixNames(settings: ApiSettings): readonly OutputFixName[] | undefined {\n return fixNamesOf(settings[FIX_SETTING]);\n}\n\n/** Paths in the config are relative to the config file; without a file, to the working dir. */\nfunction configRootOf(redocly: RedoclyConfig, cwd: URL): URL {\n return redocly.configFile ? resolveLocationUrl(redocly.configFile, cwd) : cwd;\n}\n\nasync function generateApi(run: CliRun, redocly: RedoclyConfig, api: RedoclyApi): Promise<void> {\n if (!api.settings?.[OUTPUT_SETTING]) {\n throw cliError(\n \"CLI_CONFIG_OUTPUT_MISSING\",\n `API ${api.name} is missing an \\`${REDOCLY_CONFIG_KEY}.output\\` key. ` +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n for (const warning of unknownSettingWarnings(api.name, api.settings)) {\n run.deps.logger.warn(warning);\n }\n const output = String(api.settings[OUTPUT_SETTING]);\n const configRoot = configRootOf(redocly, run.deps.cwd);\n const options: GeneratorOptions = {\n ...run.args.generatorFlags,\n ...apiFlags(api.settings),\n ...refLimitOptions(run.args, run.deps.cwd),\n ...apiRefLimitOptions(api.name, api.settings, configRoot),\n ...fixOption(apiFixNames(api.settings) ?? run.args.fix),\n redocly,\n };\n const contents = await run.deps.generate(resolveLocationUrl(api.root, configRoot), options);\n emitOutput(\n run,\n { source: api.name, output, file: resolveLocationUrl(output, configRoot) },\n contents,\n );\n}\n\n/**\n * Generate every API of the config, concurrently. Every API is generated or checked even when\n * another fails, so `--check` reports a stale output wherever it is; the failures are returned\n * in the order of the config.\n */\nexport async function generateRedoclyApis(run: CliRun, redocly: RedoclyConfig): Promise<unknown[]> {\n const apis = redoclyApisOf(redocly);\n const results = await Promise.allSettled(apis.map((api) => generateApi(run, redocly, api)));\n return results.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n}\n"],"names":[],"mappings":"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"}
|
package/dist/cli/run-cli.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const warnings = require('../domain/warnings.cjs');
|
|
3
4
|
const cliArguments = require('./cli-arguments.cjs');
|
|
4
5
|
const cliErrors = require('./cli-errors.cjs');
|
|
5
6
|
const cliOutput = require('./cli-output.cjs');
|
|
@@ -69,7 +70,10 @@ async function generate(run) {
|
|
|
69
70
|
}
|
|
70
71
|
if (run.args.input) {
|
|
71
72
|
run.deps.logger.warn(
|
|
72
|
-
|
|
73
|
+
warnings.warningText(
|
|
74
|
+
"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.",
|
|
75
|
+
warnings.WARNING_CODES.CLI_INPUT_IGNORED
|
|
76
|
+
)
|
|
73
77
|
);
|
|
74
78
|
}
|
|
75
79
|
return redoclyApis.generateRedoclyApis(run, redocly);
|
package/dist/cli/run-cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli.cjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** One schema from a path, a URL or stdin; without `--output`, the types go to stdout only. */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n silent: !output,\n };\n const contents = await run.deps.generate(source, options);\n if (!output) {\n run.deps.writeStdout(contents);\n return;\n }\n const file = resolveLocationUrl(output, run.deps.cwd);\n emitOutput(run, { source: input ?? \"stdin\", output, file }, contents);\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":["cliError","resolveLocationUrl","MULTIPLE_SCHEMAS_DOCS_URL","refLimitOptions","fixOption","emitOutput","hasRedoclyApis","generateRedoclyApis","ineffectiveFlagNotices","parseCliArguments","HELP_TEXT","describeCliFailure","EXIT_CODES"],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-cli.cjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** One schema from a path, a URL or stdin; without `--output`, the types go to stdout only. */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n silent: !output,\n };\n const contents = await run.deps.generate(source, options);\n if (!output) {\n run.deps.writeStdout(contents);\n return;\n }\n const file = resolveLocationUrl(output, run.deps.cwd);\n emitOutput(run, { source: input ?? \"stdin\", output, file }, contents);\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":["cliError","resolveLocationUrl","MULTIPLE_SCHEMAS_DOCS_URL","refLimitOptions","fixOption","emitOutput","hasRedoclyApis","warningText","WARNING_CODES","generateRedoclyApis","ineffectiveFlagNotices","parseCliArguments","HELP_TEXT","describeCliFailure","EXIT_CODES"],"mappings":"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"}
|
package/dist/cli/run-cli.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { warningText, WARNING_CODES } from '../domain/warnings.mjs';
|
|
1
2
|
import { ineffectiveFlagNotices, parseCliArguments } from './cli-arguments.mjs';
|
|
2
3
|
import { describeCliFailure, EXIT_CODES, cliError } from './cli-errors.mjs';
|
|
3
4
|
import { resolveLocationUrl, emitOutput } from './cli-output.mjs';
|
|
@@ -67,7 +68,10 @@ async function generate(run) {
|
|
|
67
68
|
}
|
|
68
69
|
if (run.args.input) {
|
|
69
70
|
run.deps.logger.warn(
|
|
70
|
-
|
|
71
|
+
warningText(
|
|
72
|
+
"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.",
|
|
73
|
+
WARNING_CODES.CLI_INPUT_IGNORED
|
|
74
|
+
)
|
|
71
75
|
);
|
|
72
76
|
}
|
|
73
77
|
return generateRedoclyApis(run, redocly);
|
package/dist/cli/run-cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** One schema from a path, a URL or stdin; without `--output`, the types go to stdout only. */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n silent: !output,\n };\n const contents = await run.deps.generate(source, options);\n if (!output) {\n run.deps.writeStdout(contents);\n return;\n }\n const file = resolveLocationUrl(output, run.deps.cwd);\n emitOutput(run, { source: input ?? \"stdin\", output, file }, contents);\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** One schema from a path, a URL or stdin; without `--output`, the types go to stdout only. */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n silent: !output,\n };\n const contents = await run.deps.generate(source, options);\n if (!output) {\n run.deps.writeStdout(contents);\n return;\n }\n const file = resolveLocationUrl(output, run.deps.cwd);\n emitOutput(run, { source: input ?? \"stdin\", output, file }, contents);\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"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"}
|
package/dist/domain/errors.cjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const urlCredentials = require('./url-credentials.cjs');
|
|
4
|
+
|
|
3
5
|
const ERROR_CODES = {
|
|
4
6
|
SCHEMA_SOURCE_EMPTY: "SCHEMA_SOURCE_EMPTY",
|
|
5
7
|
SCHEMA_SOURCE_INVALID: "SCHEMA_SOURCE_INVALID",
|
|
@@ -32,7 +34,8 @@ class OpenAPITypesafeError extends Error {
|
|
|
32
34
|
code;
|
|
33
35
|
details;
|
|
34
36
|
constructor(init) {
|
|
35
|
-
|
|
37
|
+
const message = urlCredentials.redactUrlCredentials(init.message);
|
|
38
|
+
super(message, init.cause === void 0 ? void 0 : { cause: init.cause });
|
|
36
39
|
this.name = "OpenAPITypesafeError";
|
|
37
40
|
this.code = init.code;
|
|
38
41
|
this.details = init.details ?? {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.cjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n
|
|
1
|
+
{"version":3,"file":"errors.cjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactUrlCredentials } from \"./url-credentials.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * never shows the user info of a URL (`url-credentials.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlCredentials(init.message);\n super(message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":["redactUrlCredentials"],"mappings":";;;;AAUO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAmBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAUA,mCAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AACjD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAC3E,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;;;"}
|
package/dist/domain/errors.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { redactUrlCredentials } from './url-credentials.mjs';
|
|
2
|
+
|
|
1
3
|
const ERROR_CODES = {
|
|
2
4
|
SCHEMA_SOURCE_EMPTY: "SCHEMA_SOURCE_EMPTY",
|
|
3
5
|
SCHEMA_SOURCE_INVALID: "SCHEMA_SOURCE_INVALID",
|
|
@@ -30,7 +32,8 @@ class OpenAPITypesafeError extends Error {
|
|
|
30
32
|
code;
|
|
31
33
|
details;
|
|
32
34
|
constructor(init) {
|
|
33
|
-
|
|
35
|
+
const message = redactUrlCredentials(init.message);
|
|
36
|
+
super(message, init.cause === void 0 ? void 0 : { cause: init.cause });
|
|
34
37
|
this.name = "OpenAPITypesafeError";
|
|
35
38
|
this.code = init.code;
|
|
36
39
|
this.details = init.details ?? {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.mjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n
|
|
1
|
+
{"version":3,"file":"errors.mjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactUrlCredentials } from \"./url-credentials.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * never shows the user info of a URL (`url-credentials.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlCredentials(init.message);\n super(message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":[],"mappings":";;AAUO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAmBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AACjD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAC3E,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
function irKeyword(keyword) {
|
|
4
4
|
return { kind: "keyword", keyword };
|
|
5
5
|
}
|
|
6
|
+
const DEFAULT_STRING_ENCODING = "json";
|
|
6
7
|
function irString(value, encoding) {
|
|
7
8
|
return { kind: "stringLiteral", value, encoding };
|
|
8
9
|
}
|
|
@@ -72,6 +73,7 @@ function irRecord(key, value) {
|
|
|
72
73
|
return irReference("Record", [key, value]);
|
|
73
74
|
}
|
|
74
75
|
|
|
76
|
+
exports.DEFAULT_STRING_ENCODING = DEFAULT_STRING_ENCODING;
|
|
75
77
|
exports.irArray = irArray;
|
|
76
78
|
exports.irBoolean = irBoolean;
|
|
77
79
|
exports.irIndexedAccess = irIndexedAccess;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constructors.cjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest, isOptional: false };\n}\n\n/** `T?`: an element the tuple may end before. */\nexport function irOptionalTupleElement(type: IrType): IrTupleElement {\n return { type, isRest: false, isOptional: true };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":";;AA+BO,SAAS,UAAU,OAAA,EAAmC;AAC3D,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAQ;AACpC;
|
|
1
|
+
{"version":3,"file":"constructors.cjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\n/** The encoding of a string literal that does not name one. */\nexport const DEFAULT_STRING_ENCODING: IrStringEncoding = \"json\";\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest, isOptional: false };\n}\n\n/** `T?`: an element the tuple may end before. */\nexport function irOptionalTupleElement(type: IrType): IrTupleElement {\n return { type, isRest: false, isOptional: true };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
function irKeyword(keyword) {
|
|
2
2
|
return { kind: "keyword", keyword };
|
|
3
3
|
}
|
|
4
|
+
const DEFAULT_STRING_ENCODING = "json";
|
|
4
5
|
function irString(value, encoding) {
|
|
5
6
|
return { kind: "stringLiteral", value, encoding };
|
|
6
7
|
}
|
|
@@ -70,5 +71,5 @@ function irRecord(key, value) {
|
|
|
70
71
|
return irReference("Record", [key, value]);
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
export { irArray, irBoolean, irIndexedAccess, irIntersection, irKeyword, irNumber, irObject, irOptionalTupleElement, irProperty, irRaw, irReadonly, irRecord, irReference, irString, irStringIndexSignature, irTuple, irTupleElement, irUnion };
|
|
74
|
+
export { DEFAULT_STRING_ENCODING, irArray, irBoolean, irIndexedAccess, irIntersection, irKeyword, irNumber, irObject, irOptionalTupleElement, irProperty, irRaw, irReadonly, irRecord, irReference, irString, irStringIndexSignature, irTuple, irTupleElement, irUnion };
|
|
74
75
|
//# sourceMappingURL=constructors.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constructors.mjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest, isOptional: false };\n}\n\n/** `T?`: an element the tuple may end before. */\nexport function irOptionalTupleElement(type: IrType): IrTupleElement {\n return { type, isRest: false, isOptional: true };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":"AA+BO,SAAS,UAAU,OAAA,EAAmC;AAC3D,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAQ;AACpC;
|
|
1
|
+
{"version":3,"file":"constructors.mjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\n/** The encoding of a string literal that does not name one. */\nexport const DEFAULT_STRING_ENCODING: IrStringEncoding = \"json\";\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest, isOptional: false };\n}\n\n/** `T?`: an element the tuple may end before. */\nexport function irOptionalTupleElement(type: IrType): IrTupleElement {\n return { type, isRest: false, isOptional: true };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-templates.cjs","sources":["../../../src/domain/openapi/path-templates.ts"],"sourcesContent":["/**\n * The Paths Object rule (OpenAPI 3.1 §4.8.8): \"Templated paths with the same hierarchy but\n * different templated names MUST NOT exist as they are identical.\" Such paths, `/a/{id}` and\n * `/a/{name}`, match the same URLs, so a client cannot tell which one a request is for.\n */\n\nconst PATH_PARAMETER_RE = /\\{[^}]+\\}/g;\nconst PATH_PREFIX = \"/\";\nconst UNNAMED_PARAMETER = \"{}\";\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The groups of paths that differ only in the names of their template parameters, each group in\n * document order, the groups in the order of their first path. Keys that are no path, such as an\n * `x-` extension, are left out.\n */\nexport function findIdenticalPathTemplates(document: unknown): string[][] {\n const paths = isObject(document) && isObject(document.paths) ? document.paths : {};\n const byHierarchy = new Map<string, string[]>();\n for (const url of Object.keys(paths)) {\n if (!url.startsWith(PATH_PREFIX) || !url.includes(\"{\")) {\n continue;\n }\n const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);\n byHierarchy.set(hierarchy, [...(byHierarchy.get(hierarchy) ?? []), url]);\n }\n return [...byHierarchy.values()].filter((urls) => urls.length > 1);\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"path-templates.cjs","sources":["../../../src/domain/openapi/path-templates.ts"],"sourcesContent":["/**\n * The Paths Object rule (OpenAPI 3.1 §4.8.8): \"Templated paths with the same hierarchy but\n * different templated names MUST NOT exist as they are identical.\" Such paths, `/a/{id}` and\n * `/a/{name}`, match the same URLs, so a client cannot tell which one a request is for.\n */\n\n/** `[^{}]` keeps the scan linear: `[^}]` retried from every `{` of a long run of them. */\nconst PATH_PARAMETER_RE = /\\{[^{}]+\\}/g;\nconst PATH_PREFIX = \"/\";\nconst UNNAMED_PARAMETER = \"{}\";\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The groups of paths that differ only in the names of their template parameters, each group in\n * document order, the groups in the order of their first path. Keys that are no path, such as an\n * `x-` extension, are left out.\n */\nexport function findIdenticalPathTemplates(document: unknown): string[][] {\n const paths = isObject(document) && isObject(document.paths) ? document.paths : {};\n const byHierarchy = new Map<string, string[]>();\n for (const url of Object.keys(paths)) {\n if (!url.startsWith(PATH_PREFIX) || !url.includes(\"{\")) {\n continue;\n }\n const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);\n byHierarchy.set(hierarchy, [...(byHierarchy.get(hierarchy) ?? []), url]);\n }\n return [...byHierarchy.values()].filter((urls) => urls.length > 1);\n}\n"],"names":[],"mappings":";;AAOA,MAAM,iBAAA,GAAoB,aAAA;AAC1B,MAAM,WAAA,GAAc,GAAA;AACpB,MAAM,iBAAA,GAAoB,IAAA;AAE1B,SAAS,SAAS,KAAA,EAA4D;AAC5E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,SAAS,2BAA2B,QAAA,EAA+B;AACxE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,KAAK,CAAA,GAAI,QAAA,CAAS,KAAA,GAAQ,EAAC;AACjF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,IAAI,UAAA,CAAW,WAAW,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,iBAAiB,CAAA;AAClE,IAAA,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,CAAC,GAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,EAAC,EAAI,GAAG,CAAC,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,CAAC,GAAG,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACnE;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-templates.mjs","sources":["../../../src/domain/openapi/path-templates.ts"],"sourcesContent":["/**\n * The Paths Object rule (OpenAPI 3.1 §4.8.8): \"Templated paths with the same hierarchy but\n * different templated names MUST NOT exist as they are identical.\" Such paths, `/a/{id}` and\n * `/a/{name}`, match the same URLs, so a client cannot tell which one a request is for.\n */\n\nconst PATH_PARAMETER_RE = /\\{[^}]+\\}/g;\nconst PATH_PREFIX = \"/\";\nconst UNNAMED_PARAMETER = \"{}\";\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The groups of paths that differ only in the names of their template parameters, each group in\n * document order, the groups in the order of their first path. Keys that are no path, such as an\n * `x-` extension, are left out.\n */\nexport function findIdenticalPathTemplates(document: unknown): string[][] {\n const paths = isObject(document) && isObject(document.paths) ? document.paths : {};\n const byHierarchy = new Map<string, string[]>();\n for (const url of Object.keys(paths)) {\n if (!url.startsWith(PATH_PREFIX) || !url.includes(\"{\")) {\n continue;\n }\n const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);\n byHierarchy.set(hierarchy, [...(byHierarchy.get(hierarchy) ?? []), url]);\n }\n return [...byHierarchy.values()].filter((urls) => urls.length > 1);\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"path-templates.mjs","sources":["../../../src/domain/openapi/path-templates.ts"],"sourcesContent":["/**\n * The Paths Object rule (OpenAPI 3.1 §4.8.8): \"Templated paths with the same hierarchy but\n * different templated names MUST NOT exist as they are identical.\" Such paths, `/a/{id}` and\n * `/a/{name}`, match the same URLs, so a client cannot tell which one a request is for.\n */\n\n/** `[^{}]` keeps the scan linear: `[^}]` retried from every `{` of a long run of them. */\nconst PATH_PARAMETER_RE = /\\{[^{}]+\\}/g;\nconst PATH_PREFIX = \"/\";\nconst UNNAMED_PARAMETER = \"{}\";\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The groups of paths that differ only in the names of their template parameters, each group in\n * document order, the groups in the order of their first path. Keys that are no path, such as an\n * `x-` extension, are left out.\n */\nexport function findIdenticalPathTemplates(document: unknown): string[][] {\n const paths = isObject(document) && isObject(document.paths) ? document.paths : {};\n const byHierarchy = new Map<string, string[]>();\n for (const url of Object.keys(paths)) {\n if (!url.startsWith(PATH_PREFIX) || !url.includes(\"{\")) {\n continue;\n }\n const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);\n byHierarchy.set(hierarchy, [...(byHierarchy.get(hierarchy) ?? []), url]);\n }\n return [...byHierarchy.values()].filter((urls) => urls.length > 1);\n}\n"],"names":[],"mappings":"AAOA,MAAM,iBAAA,GAAoB,aAAA;AAC1B,MAAM,WAAA,GAAc,GAAA;AACpB,MAAM,iBAAA,GAAoB,IAAA;AAE1B,SAAS,SAAS,KAAA,EAA4D;AAC5E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,SAAS,2BAA2B,QAAA,EAA+B;AACxE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,KAAK,CAAA,GAAI,QAAA,CAAS,KAAA,GAAQ,EAAC;AACjF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,IAAI,UAAA,CAAW,WAAW,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,iBAAiB,CAAA;AAClE,IAAA,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,CAAC,GAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,EAAC,EAAI,GAAG,CAAC,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,CAAC,GAAG,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACnE;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const URL_USER_INFO = /:\/\/[^\s/?#@]*@/g;
|
|
4
|
+
const REDACTED_USER_INFO = "://***@";
|
|
5
|
+
function redactUrlCredentials(text) {
|
|
6
|
+
return text.replace(URL_USER_INFO, () => REDACTED_USER_INFO);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
exports.redactUrlCredentials = redactUrlCredentials;
|
|
10
|
+
//# sourceMappingURL=url-credentials.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-credentials.cjs","sources":["../../src/domain/url-credentials.ts"],"sourcesContent":["/**\n * URLs with user info (`https://user:token@host/…`) can reach a message: the CLI input, a `$ref`,\n * a redirect. Messages end up in CI job logs, so the user info is hidden in every one (audit B2,\n * F12). Fetch refuses such URLs anyway, so a message never needs the credentials.\n */\n\n/**\n * The user info after a scheme: everything up to an `@` that comes before the end of the\n * authority. The class stops at `/`, so a scan never runs past the next `://`; it stays linear.\n */\nconst URL_USER_INFO = /:\\/\\/[^\\s/?#@]*@/g;\n\nconst REDACTED_USER_INFO = \"://***@\";\n\n/** The text with the user info of every URL in it replaced by `***`. */\nexport function redactUrlCredentials(text: string): string {\n return text.replace(URL_USER_INFO, () => REDACTED_USER_INFO);\n}\n"],"names":[],"mappings":";;AAUA,MAAM,aAAA,GAAgB,mBAAA;AAEtB,MAAM,kBAAA,GAAqB,SAAA;AAGpB,SAAS,qBAAqB,IAAA,EAAsB;AACzD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,MAAM,kBAAkB,CAAA;AAC7D;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const URL_USER_INFO = /:\/\/[^\s/?#@]*@/g;
|
|
2
|
+
const REDACTED_USER_INFO = "://***@";
|
|
3
|
+
function redactUrlCredentials(text) {
|
|
4
|
+
return text.replace(URL_USER_INFO, () => REDACTED_USER_INFO);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export { redactUrlCredentials };
|
|
8
|
+
//# sourceMappingURL=url-credentials.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-credentials.mjs","sources":["../../src/domain/url-credentials.ts"],"sourcesContent":["/**\n * URLs with user info (`https://user:token@host/…`) can reach a message: the CLI input, a `$ref`,\n * a redirect. Messages end up in CI job logs, so the user info is hidden in every one (audit B2,\n * F12). Fetch refuses such URLs anyway, so a message never needs the credentials.\n */\n\n/**\n * The user info after a scheme: everything up to an `@` that comes before the end of the\n * authority. The class stops at `/`, so a scan never runs past the next `://`; it stays linear.\n */\nconst URL_USER_INFO = /:\\/\\/[^\\s/?#@]*@/g;\n\nconst REDACTED_USER_INFO = \"://***@\";\n\n/** The text with the user info of every URL in it replaced by `***`. */\nexport function redactUrlCredentials(text: string): string {\n return text.replace(URL_USER_INFO, () => REDACTED_USER_INFO);\n}\n"],"names":[],"mappings":"AAUA,MAAM,aAAA,GAAgB,mBAAA;AAEtB,MAAM,kBAAA,GAAqB,SAAA;AAGpB,SAAS,qBAAqB,IAAA,EAAsB;AACzD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,MAAM,kBAAkB,CAAA;AAC7D;;"}
|
package/dist/domain/warnings.cjs
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const WARNING_CODES = {
|
|
4
|
+
CLI_INPUT_IGNORED: "CLI_INPUT_IGNORED",
|
|
5
|
+
CONFIG_SETTING_UNKNOWN: "CONFIG_SETTING_UNKNOWN",
|
|
6
|
+
DISCRIMINATOR_MAPPING_INVALID: "DISCRIMINATOR_MAPPING_INVALID",
|
|
4
7
|
DISCRIMINATOR_VALUE_NOT_ALLOWED: "DISCRIMINATOR_VALUE_NOT_ALLOWED",
|
|
5
8
|
ENUM_VALUES_EXCLUDED: "ENUM_VALUES_EXCLUDED",
|
|
9
|
+
FIX_NEEDS_OPTION: "FIX_NEEDS_OPTION",
|
|
10
|
+
LEGACY_CALLBACK_DEPRECATED: "LEGACY_CALLBACK_DEPRECATED",
|
|
11
|
+
LINT_PROBLEM: "LINT_PROBLEM",
|
|
6
12
|
PATH_TEMPLATES_IDENTICAL: "PATH_TEMPLATES_IDENTICAL",
|
|
7
|
-
QUERYSTRING_NEXT_TO_QUERY: "QUERYSTRING_NEXT_TO_QUERY"
|
|
13
|
+
QUERYSTRING_NEXT_TO_QUERY: "QUERYSTRING_NEXT_TO_QUERY",
|
|
14
|
+
REF_CIRCULAR: "REF_CIRCULAR",
|
|
15
|
+
REF_NOT_FOUND: "REF_NOT_FOUND"
|
|
8
16
|
};
|
|
9
17
|
function warningText(message, code) {
|
|
10
18
|
return `${message} (${code})`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warnings.cjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":";;AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B;
|
|
1
|
+
{"version":3,"file":"warnings.cjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n CLI_INPUT_IGNORED: \"CLI_INPUT_IGNORED\",\n CONFIG_SETTING_UNKNOWN: \"CONFIG_SETTING_UNKNOWN\",\n DISCRIMINATOR_MAPPING_INVALID: \"DISCRIMINATOR_MAPPING_INVALID\",\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n FIX_NEEDS_OPTION: \"FIX_NEEDS_OPTION\",\n LEGACY_CALLBACK_DEPRECATED: \"LEGACY_CALLBACK_DEPRECATED\",\n LINT_PROBLEM: \"LINT_PROBLEM\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n REF_CIRCULAR: \"REF_CIRCULAR\",\n REF_NOT_FOUND: \"REF_NOT_FOUND\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":";;AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,YAAA,EAAc,cAAA;AAAA,EACd,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe;AACjB;AAKO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAC5B;;;"}
|
package/dist/domain/warnings.mjs
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
const WARNING_CODES = {
|
|
2
|
+
CLI_INPUT_IGNORED: "CLI_INPUT_IGNORED",
|
|
3
|
+
CONFIG_SETTING_UNKNOWN: "CONFIG_SETTING_UNKNOWN",
|
|
4
|
+
DISCRIMINATOR_MAPPING_INVALID: "DISCRIMINATOR_MAPPING_INVALID",
|
|
2
5
|
DISCRIMINATOR_VALUE_NOT_ALLOWED: "DISCRIMINATOR_VALUE_NOT_ALLOWED",
|
|
3
6
|
ENUM_VALUES_EXCLUDED: "ENUM_VALUES_EXCLUDED",
|
|
7
|
+
FIX_NEEDS_OPTION: "FIX_NEEDS_OPTION",
|
|
8
|
+
LEGACY_CALLBACK_DEPRECATED: "LEGACY_CALLBACK_DEPRECATED",
|
|
9
|
+
LINT_PROBLEM: "LINT_PROBLEM",
|
|
4
10
|
PATH_TEMPLATES_IDENTICAL: "PATH_TEMPLATES_IDENTICAL",
|
|
5
|
-
QUERYSTRING_NEXT_TO_QUERY: "QUERYSTRING_NEXT_TO_QUERY"
|
|
11
|
+
QUERYSTRING_NEXT_TO_QUERY: "QUERYSTRING_NEXT_TO_QUERY",
|
|
12
|
+
REF_CIRCULAR: "REF_CIRCULAR",
|
|
13
|
+
REF_NOT_FOUND: "REF_NOT_FOUND"
|
|
6
14
|
};
|
|
7
15
|
function warningText(message, code) {
|
|
8
16
|
return `${message} (${code})`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warnings.mjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":"AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B;
|
|
1
|
+
{"version":3,"file":"warnings.mjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n CLI_INPUT_IGNORED: \"CLI_INPUT_IGNORED\",\n CONFIG_SETTING_UNKNOWN: \"CONFIG_SETTING_UNKNOWN\",\n DISCRIMINATOR_MAPPING_INVALID: \"DISCRIMINATOR_MAPPING_INVALID\",\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n FIX_NEEDS_OPTION: \"FIX_NEEDS_OPTION\",\n LEGACY_CALLBACK_DEPRECATED: \"LEGACY_CALLBACK_DEPRECATED\",\n LINT_PROBLEM: \"LINT_PROBLEM\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n REF_CIRCULAR: \"REF_CIRCULAR\",\n REF_NOT_FOUND: \"REF_NOT_FOUND\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":"AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,YAAA,EAAc,cAAA;AAAA,EACd,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe;AACjB;AAKO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAC5B;;"}
|
package/dist/index.cjs
CHANGED
|
@@ -13,6 +13,7 @@ const transformSchema = require('./api/transform-schema.cjs');
|
|
|
13
13
|
const typeHelpers = require('./api/type-helpers.cjs');
|
|
14
14
|
const errors = require('./domain/errors.cjs');
|
|
15
15
|
const outputFixes = require('./domain/output-fixes.cjs');
|
|
16
|
+
const warnings = require('./domain/warnings.cjs');
|
|
16
17
|
const componentsObject = require('./transform/components-object.cjs');
|
|
17
18
|
const headerObject = require('./transform/header-object.cjs');
|
|
18
19
|
const mediaTypeObject = require('./transform/media-type-object.cjs');
|
|
@@ -82,6 +83,7 @@ exports.isOpenAPITypesafeError = errors.isOpenAPITypesafeError;
|
|
|
82
83
|
exports.ALL_OUTPUT_FIXES = outputFixes.ALL_OUTPUT_FIXES;
|
|
83
84
|
exports.OUTPUT_FIXES = outputFixes.OUTPUT_FIXES;
|
|
84
85
|
exports.OutputFix = outputFixes.OutputFix;
|
|
86
|
+
exports.WARNING_CODES = warnings.WARNING_CODES;
|
|
85
87
|
exports.transformComponentsObject = componentsObject.default;
|
|
86
88
|
exports.transformHeaderObject = headerObject;
|
|
87
89
|
exports.transformMediaTypeObject = mediaTypeObject;
|