openapi-typesafe 1.0.0-rc.5 → 1.0.0-rc.6
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/CHANGELOG.md +73 -0
- package/dist/adapters/redocly-loader/query-document-names.cjs +50 -0
- package/dist/adapters/redocly-loader/query-document-names.cjs.map +1 -0
- package/dist/adapters/redocly-loader/query-document-names.mjs +48 -0
- package/dist/adapters/redocly-loader/query-document-names.mjs.map +1 -0
- package/dist/adapters/redocly-loader/query-named-components.cjs +29 -37
- package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -1
- package/dist/adapters/redocly-loader/query-named-components.mjs +29 -37
- package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +3 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +4 -1
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +16 -7
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +17 -8
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.cjs +9 -1
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.mjs +10 -2
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.cjs +16 -1
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.mjs +16 -2
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
- package/dist/api/cwd-option.cjs +58 -0
- package/dist/api/cwd-option.cjs.map +1 -0
- package/dist/api/cwd-option.mjs +52 -0
- package/dist/api/cwd-option.mjs.map +1 -0
- package/dist/api/default-ports.cjs +15 -7
- package/dist/api/default-ports.cjs.map +1 -1
- package/dist/api/default-ports.mjs +14 -8
- package/dist/api/default-ports.mjs.map +1 -1
- package/dist/api/document-run.cjs +2 -16
- package/dist/api/document-run.cjs.map +1 -1
- package/dist/api/document-run.mjs +2 -12
- package/dist/api/document-run.mjs.map +1 -1
- package/dist/api/legacy-utils.cjs +1 -1
- package/dist/api/legacy-utils.cjs.map +1 -1
- package/dist/api/legacy-utils.mjs +1 -1
- package/dist/api/legacy-utils.mjs.map +1 -1
- package/dist/api/openapi-ts.cjs.map +1 -1
- package/dist/api/openapi-ts.mjs.map +1 -1
- package/dist/api/option-errors.cjs +24 -0
- package/dist/api/option-errors.cjs.map +1 -0
- package/dist/api/option-errors.mjs +21 -0
- package/dist/api/option-errors.mjs.map +1 -0
- package/dist/api/ref-limit-options.cjs +19 -24
- package/dist/api/ref-limit-options.cjs.map +1 -1
- package/dist/api/ref-limit-options.mjs +15 -20
- package/dist/api/ref-limit-options.mjs.map +1 -1
- package/dist/application/transform/document/path-template-refs.cjs +12 -2
- package/dist/application/transform/document/path-template-refs.cjs.map +1 -1
- package/dist/application/transform/document/path-template-refs.mjs +12 -2
- package/dist/application/transform/document/path-template-refs.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.cjs +28 -10
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.mjs +29 -11
- package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/original-index.cjs +1 -1
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/original-index.mjs +1 -1
- package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/property-shape.cjs +5 -0
- package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/property-shape.mjs +5 -1
- package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/typed-walk.cjs +11 -1
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/typed-walk.mjs +12 -2
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
- package/dist/cli/api-settings.cjs +3 -2
- package/dist/cli/api-settings.cjs.map +1 -1
- package/dist/cli/api-settings.mjs +2 -1
- package/dist/cli/api-settings.mjs.map +1 -1
- package/dist/cli/api-writes.cjs +7 -1
- package/dist/cli/api-writes.cjs.map +1 -1
- package/dist/cli/api-writes.mjs +7 -1
- package/dist/cli/api-writes.mjs.map +1 -1
- package/dist/cli/cli-arguments.cjs +25 -107
- package/dist/cli/cli-arguments.cjs.map +1 -1
- package/dist/cli/cli-arguments.mjs +18 -100
- package/dist/cli/cli-arguments.mjs.map +1 -1
- package/dist/cli/cli-errors.cjs +1 -0
- package/dist/cli/cli-errors.cjs.map +1 -1
- package/dist/cli/cli-errors.mjs +1 -0
- package/dist/cli/cli-errors.mjs.map +1 -1
- package/dist/cli/cli-flag-names.cjs +77 -0
- package/dist/cli/cli-flag-names.cjs.map +1 -0
- package/dist/cli/cli-flag-names.mjs +64 -0
- package/dist/cli/cli-flag-names.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +7 -2
- package/dist/cli/cli-output.cjs.map +1 -1
- package/dist/cli/cli-output.mjs +7 -2
- package/dist/cli/cli-output.mjs.map +1 -1
- package/dist/cli/main.cjs +1 -1
- package/dist/cli/main.cjs.map +1 -1
- package/dist/cli/main.mjs +1 -1
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/redocly-apis.cjs +14 -4
- package/dist/cli/redocly-apis.cjs.map +1 -1
- package/dist/cli/redocly-apis.mjs +14 -4
- package/dist/cli/redocly-apis.mjs.map +1 -1
- package/dist/cli/written-flags.cjs +83 -0
- package/dist/cli/written-flags.cjs.map +1 -0
- package/dist/cli/written-flags.mjs +77 -0
- package/dist/cli/written-flags.mjs.map +1 -0
- package/dist/domain/errors.cjs +1 -0
- package/dist/domain/errors.cjs.map +1 -1
- package/dist/domain/errors.mjs +1 -0
- package/dist/domain/errors.mjs.map +1 -1
- package/dist/domain/location-text.cjs +7 -1
- package/dist/domain/location-text.cjs.map +1 -1
- package/dist/domain/location-text.mjs +7 -1
- package/dist/domain/location-text.mjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/package.json +1 -1
- package/src/adapters/redocly-loader/query-document-names.ts +79 -0
- package/src/adapters/redocly-loader/query-named-components.ts +48 -49
- package/src/adapters/redocly-loader/redocly-config-source.ts +11 -1
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +20 -6
- package/src/adapters/redocly-loader/ref-access.ts +16 -2
- package/src/adapters/redocly-loader/remote-fetch.ts +26 -0
- package/src/api/cwd-option.ts +76 -0
- package/src/api/default-ports.ts +33 -10
- package/src/api/document-run.ts +2 -17
- package/src/api/legacy-utils.ts +1 -1
- package/src/api/openapi-ts.ts +14 -1
- package/src/api/option-errors.ts +22 -0
- package/src/api/ref-limit-options.ts +17 -24
- package/src/application/ports/redocly-config-source.ts +5 -0
- package/src/application/transform/document/path-template-refs.ts +28 -7
- package/src/application/transform/ref-pointer/generated-shape.ts +57 -14
- package/src/application/transform/ref-pointer/original-index.ts +6 -3
- package/src/application/transform/ref-pointer/property-shape.ts +9 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +26 -4
- package/src/cli/api-writes.ts +11 -3
- package/src/cli/cli-arguments.ts +42 -153
- package/src/cli/cli-errors.ts +1 -0
- package/src/cli/cli-flag-names.ts +99 -0
- package/src/cli/cli-output.ts +20 -6
- package/src/cli/main.ts +2 -1
- package/src/cli/redocly-apis.ts +21 -5
- package/src/cli/written-flags.ts +131 -0
- package/src/domain/errors.ts +1 -0
- package/src/domain/location-text.ts +17 -2
package/dist/cli/api-writes.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ApiFailure } from './cli-errors.mjs';
|
|
1
2
|
import { duplicateOutputError, ensureOutputIsNotSchema, emitOutput } from './cli-output.mjs';
|
|
2
3
|
|
|
3
4
|
function failuresOf(step) {
|
|
@@ -42,6 +43,11 @@ function writeClaimed(run, { api, claim }) {
|
|
|
42
43
|
const failures = failuresOf(() => emitOutput(run, api.outputFile, api.types.contents));
|
|
43
44
|
return failures.length > 0 && claim ? [...failures, ...failuresOf(() => claim.release())] : failures;
|
|
44
45
|
}
|
|
46
|
+
function namedFailures(failures) {
|
|
47
|
+
return new Map(
|
|
48
|
+
[...failures].map(([name, list]) => [name, list.map((cause) => new ApiFailure(name, cause))])
|
|
49
|
+
);
|
|
50
|
+
}
|
|
45
51
|
function writeGeneratedApis(run, apis, readFiles) {
|
|
46
52
|
const failures = /* @__PURE__ */ new Map();
|
|
47
53
|
const ownOutputs = apis.filter((api) => {
|
|
@@ -62,7 +68,7 @@ function writeGeneratedApis(run, apis, readFiles) {
|
|
|
62
68
|
for (const entry of claimed.filter(({ api }) => !shared.has(api.name))) {
|
|
63
69
|
failures.set(entry.api.name, writeClaimed(run, entry));
|
|
64
70
|
}
|
|
65
|
-
return failures;
|
|
71
|
+
return namedFailures(failures);
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
export { failuresOf, writeGeneratedApis };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-writes.mjs","sources":["../../src/cli/api-writes.ts"],"sourcesContent":["import type { ClaimedFile } from \"../application/ports/file-system.js\";\nimport type { GeneratedTypes } from \"./cli-dependencies.js\";\nimport {\n type CliRun,\n duplicateOutputError,\n emitOutput,\n ensureOutputIsNotSchema,\n type NamedFile,\n type OutputFile,\n} from \"./cli-output.js\";\n\n/**\n * Writing the generated APIs of a Redocly config. Before the first byte is written, every output\n * is claimed: a missing one is created empty, so the file system gives it its own identity. Two\n * APIs whose files then have one identity fail with `CLI_OUTPUT_DUPLICATE` and write nothing,\n * also when their names looked different (ADR-043, decision 1).\n */\n\n/** An API whose types are generated and not written yet. */\nexport interface GeneratedApi {\n readonly name: string;\n readonly outputFile: OutputFile;\n readonly types: GeneratedTypes;\n}\n\n/** An API whose output is claimed; `claim` is undefined with `--check`, which writes nothing. */\ninterface ClaimedApi {\n readonly api: GeneratedApi;\n readonly claim: ClaimedFile | undefined;\n}\n\n/** The failures of the API an API name maps to; an API without failures was written. */\ntype ApiFailures = Map<string, unknown[]>;\n\n/** The failure of a step, as a list: empty when it succeeded. */\nexport function failuresOf(step: () => void): unknown[] {\n try {\n step();\n return [];\n } catch (failure) {\n return [failure];\n }\n}\n\n/** Claim the output of each API; an API whose claim fails gets that failure instead. */\nfunction claimOutputs(run: CliRun, apis: readonly GeneratedApi[], failures: ApiFailures) {\n const claimed: ClaimedApi[] = [];\n for (const api of apis) {\n try {\n const claim = run.args.isCheck ? undefined : run.deps.files.claimFile(api.outputFile.file);\n claimed.push({ api, claim });\n } catch (failure) {\n failures.set(api.name, [failure]);\n }\n }\n return claimed;\n}\n\n/** The APIs that share their claimed file with another, by API name, with the other names. */\nfunction sharedOutputs(claimed: readonly ClaimedApi[]): Map<string, string[]> {\n const byIdentity = new Map<string, string[]>();\n for (const { api, claim } of claimed) {\n if (claim) {\n byIdentity.set(claim.identity, [...(byIdentity.get(claim.identity) ?? []), api.name]);\n }\n }\n const shared = new Map<string, string[]>();\n for (const names of byIdentity.values()) {\n for (const name of names.length > 1 ? names : []) {\n shared.set(\n name,\n names.filter((other) => other !== name).map((other) => `API ${other}`),\n );\n }\n }\n return shared;\n}\n\n/** Write one claimed API; a failed write releases the claim, so no empty file is left. */\nfunction writeClaimed(run: CliRun, { api, claim }: ClaimedApi): unknown[] {\n const failures = failuresOf(() => emitOutput(run, api.outputFile, api.types.contents));\n return failures.length > 0 && claim\n ? [...failures, ...failuresOf(() => claim.release())]\n : failures;\n}\n\n/**\n * Write (or `--check`) every API unless its output is a file the run read or the file of another\n * API. Returns the failures by API name
|
|
1
|
+
{"version":3,"file":"api-writes.mjs","sources":["../../src/cli/api-writes.ts"],"sourcesContent":["import type { ClaimedFile } from \"../application/ports/file-system.js\";\nimport type { GeneratedTypes } from \"./cli-dependencies.js\";\nimport { ApiFailure } from \"./cli-errors.js\";\nimport {\n type CliRun,\n duplicateOutputError,\n emitOutput,\n ensureOutputIsNotSchema,\n type NamedFile,\n type OutputFile,\n} from \"./cli-output.js\";\n\n/**\n * Writing the generated APIs of a Redocly config. Before the first byte is written, every output\n * is claimed: a missing one is created empty, so the file system gives it its own identity. Two\n * APIs whose files then have one identity fail with `CLI_OUTPUT_DUPLICATE` and write nothing,\n * also when their names looked different (ADR-043, decision 1).\n */\n\n/** An API whose types are generated and not written yet. */\nexport interface GeneratedApi {\n readonly name: string;\n readonly outputFile: OutputFile;\n readonly types: GeneratedTypes;\n}\n\n/** An API whose output is claimed; `claim` is undefined with `--check`, which writes nothing. */\ninterface ClaimedApi {\n readonly api: GeneratedApi;\n readonly claim: ClaimedFile | undefined;\n}\n\n/** The failures of the API an API name maps to; an API without failures was written. */\ntype ApiFailures = Map<string, unknown[]>;\n\n/** The failure of a step, as a list: empty when it succeeded. */\nexport function failuresOf(step: () => void): unknown[] {\n try {\n step();\n return [];\n } catch (failure) {\n return [failure];\n }\n}\n\n/** Claim the output of each API; an API whose claim fails gets that failure instead. */\nfunction claimOutputs(run: CliRun, apis: readonly GeneratedApi[], failures: ApiFailures) {\n const claimed: ClaimedApi[] = [];\n for (const api of apis) {\n try {\n const claim = run.args.isCheck ? undefined : run.deps.files.claimFile(api.outputFile.file);\n claimed.push({ api, claim });\n } catch (failure) {\n failures.set(api.name, [failure]);\n }\n }\n return claimed;\n}\n\n/** The APIs that share their claimed file with another, by API name, with the other names. */\nfunction sharedOutputs(claimed: readonly ClaimedApi[]): Map<string, string[]> {\n const byIdentity = new Map<string, string[]>();\n for (const { api, claim } of claimed) {\n if (claim) {\n byIdentity.set(claim.identity, [...(byIdentity.get(claim.identity) ?? []), api.name]);\n }\n }\n const shared = new Map<string, string[]>();\n for (const names of byIdentity.values()) {\n for (const name of names.length > 1 ? names : []) {\n shared.set(\n name,\n names.filter((other) => other !== name).map((other) => `API ${other}`),\n );\n }\n }\n return shared;\n}\n\n/** Write one claimed API; a failed write releases the claim, so no empty file is left. */\nfunction writeClaimed(run: CliRun, { api, claim }: ClaimedApi): unknown[] {\n const failures = failuresOf(() => emitOutput(run, api.outputFile, api.types.contents));\n return failures.length > 0 && claim\n ? [...failures, ...failuresOf(() => claim.release())]\n : failures;\n}\n\n/** The failures with the name of their API, which the CLI prints before each message. */\nfunction namedFailures(failures: ApiFailures): ApiFailures {\n return new Map(\n [...failures].map(([name, list]) => [name, list.map((cause) => new ApiFailure(name, cause))]),\n );\n}\n\n/**\n * Write (or `--check`) every API unless its output is a file the run read or the file of another\n * API. Returns the failures by API name, each an `ApiFailure`. Claims are released in reverse\n * order, so a directory one claim created is empty by the time it is removed.\n */\nexport function writeGeneratedApis(\n run: CliRun,\n apis: readonly GeneratedApi[],\n readFiles: readonly NamedFile[],\n): ApiFailures {\n const failures: ApiFailures = new Map();\n const ownOutputs = apis.filter((api) => {\n const failure = failuresOf(() => ensureOutputIsNotSchema(run, api.outputFile, readFiles));\n failures.set(api.name, failure);\n return failure.length === 0;\n });\n const claimed = claimOutputs(run, ownOutputs, failures);\n const shared = sharedOutputs(claimed);\n for (const entry of [...claimed].reverse()) {\n const { api, claim } = entry;\n const others = shared.get(api.name);\n if (others) {\n const release = claim ? failuresOf(() => claim.release()) : [];\n failures.set(api.name, [duplicateOutputError(api.outputFile, others), ...release]);\n }\n }\n for (const entry of claimed.filter(({ api }) => !shared.has(api.name))) {\n failures.set(entry.api.name, writeClaimed(run, entry));\n }\n return namedFailures(failures);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,98 +3,16 @@
|
|
|
3
3
|
const scule = require('scule');
|
|
4
4
|
const parser = require('yargs-parser');
|
|
5
5
|
const cliErrors = require('./cli-errors.cjs');
|
|
6
|
+
const cliFlagNames = require('./cli-flag-names.cjs');
|
|
7
|
+
const docsLinks = require('./docs-links.cjs');
|
|
6
8
|
const fixOption = require('./fix-option.cjs');
|
|
9
|
+
const writtenFlags = require('./written-flags.cjs');
|
|
7
10
|
|
|
8
11
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
9
12
|
|
|
10
13
|
const parser__default = /*#__PURE__*/_interopDefaultCompat(parser);
|
|
11
14
|
|
|
12
|
-
const GENERATOR_FLAGS = [
|
|
13
|
-
"additionalProperties",
|
|
14
|
-
"alphabetize",
|
|
15
|
-
"arrayLength",
|
|
16
|
-
"binaryAsBlob",
|
|
17
|
-
"conditionalEnums",
|
|
18
|
-
"dedupeEnums",
|
|
19
|
-
"defaultNonNullable",
|
|
20
|
-
"emptyObjectsUnknown",
|
|
21
|
-
"enum",
|
|
22
|
-
"enumValues",
|
|
23
|
-
"excludeDeprecated",
|
|
24
|
-
"exportType",
|
|
25
|
-
"generatePathParams",
|
|
26
|
-
"immutable",
|
|
27
|
-
"lint",
|
|
28
|
-
"makePathsEnum",
|
|
29
|
-
"pathParamsAsTypes",
|
|
30
|
-
"propertiesRequiredByDefault",
|
|
31
|
-
"readWriteMarkers",
|
|
32
|
-
"rootTypes",
|
|
33
|
-
"rootTypesKeepCasing",
|
|
34
|
-
"rootTypesNoSchemaPrefix"
|
|
35
|
-
];
|
|
36
|
-
const CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, "check", "contentNever", "help"];
|
|
37
|
-
const BOOLEAN_FLAGS = [
|
|
38
|
-
...CAMEL_CASE_BOOLEAN_FLAGS,
|
|
39
|
-
...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => scule.kebabCase(flag))
|
|
40
|
-
];
|
|
41
|
-
const REMOVED_FLAGS = [
|
|
42
|
-
["-ap", `The -ap alias has been deprecated. Use "--additional-properties" instead.`],
|
|
43
|
-
["--immutable-types", `The --immutable-types flag has been renamed to "--immutable".`],
|
|
44
|
-
[
|
|
45
|
-
"--support-array-length",
|
|
46
|
-
`The --support-array-length flag has been renamed to "--array-length".`
|
|
47
|
-
],
|
|
48
|
-
["-it", `The -it alias has been deprecated. Use "--immutable" instead.`],
|
|
49
|
-
["--redoc", `The --redoc config flag has been renamed to "--redocly" (or -c as shorthand).`]
|
|
50
|
-
];
|
|
51
15
|
const ROOT_TYPES_FLAGS = ["rootTypesNoSchemaPrefix", "rootTypesKeepCasing"];
|
|
52
|
-
const OPTIONS_END = "--";
|
|
53
|
-
const LONG_PREFIX = "--";
|
|
54
|
-
const NEGATION_PREFIX = "--no-";
|
|
55
|
-
const VALUE_SEPARATOR = "=";
|
|
56
|
-
const BOOLEAN_VALUES = /* @__PURE__ */ new Set(["true", "false"]);
|
|
57
|
-
function writtenFlags(argv) {
|
|
58
|
-
const end = argv.indexOf(OPTIONS_END);
|
|
59
|
-
return (end === -1 ? argv : argv.slice(0, end)).filter((arg) => arg.startsWith("-") && arg !== "-").map((arg) => {
|
|
60
|
-
const at = arg.indexOf(VALUE_SEPARATOR);
|
|
61
|
-
return at === -1 ? { name: arg, value: void 0 } : { name: arg.slice(0, at), value: arg.slice(at + 1) };
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
function canonicalFlagName(name) {
|
|
65
|
-
if (!name.startsWith(LONG_PREFIX)) {
|
|
66
|
-
return name;
|
|
67
|
-
}
|
|
68
|
-
const bare = name.startsWith(NEGATION_PREFIX) ? name.slice(NEGATION_PREFIX.length) : name.slice(LONG_PREFIX.length);
|
|
69
|
-
return `${LONG_PREFIX}${scule.kebabCase(bare)}`;
|
|
70
|
-
}
|
|
71
|
-
function rejectRemovedFlags(flags) {
|
|
72
|
-
const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));
|
|
73
|
-
for (const [flag, message] of REMOVED_FLAGS) {
|
|
74
|
-
if (names.has(flag)) {
|
|
75
|
-
throw cliErrors.cliError("CLI_FLAG_REMOVED", message);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const ALIASES = { redocly: ["c"], exportType: ["t"], output: ["o"] };
|
|
80
|
-
const BOOLEAN_ALIASES = Object.entries(ALIASES).filter(([flag]) => CAMEL_CASE_BOOLEAN_FLAGS.includes(flag)).flatMap(([, aliases]) => aliases.map((alias) => `-${alias}`));
|
|
81
|
-
const BOOLEAN_FLAG_NAMES = /* @__PURE__ */ new Set([
|
|
82
|
-
...BOOLEAN_FLAGS.map((flag) => `${LONG_PREFIX}${flag}`),
|
|
83
|
-
...BOOLEAN_ALIASES
|
|
84
|
-
]);
|
|
85
|
-
function rejectInvalidBooleans(flags) {
|
|
86
|
-
for (const { name, value } of flags) {
|
|
87
|
-
const negated = name.startsWith(NEGATION_PREFIX) ? `${LONG_PREFIX}${name.slice(NEGATION_PREFIX.length)}` : void 0;
|
|
88
|
-
const isNegatedWithValue = negated !== void 0 && BOOLEAN_FLAG_NAMES.has(negated);
|
|
89
|
-
const isInvalid = BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? "true");
|
|
90
|
-
if (value !== void 0 && (isNegatedWithValue || isInvalid)) {
|
|
91
|
-
throw cliErrors.cliError(
|
|
92
|
-
"CLI_FLAG_INVALID",
|
|
93
|
-
`${name}=${value}: a boolean flag takes no value, or =true or =false.`
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
16
|
function ineffectiveFlagNotices(flags) {
|
|
99
17
|
if (flags.rootTypes === true) {
|
|
100
18
|
return [];
|
|
@@ -105,7 +23,7 @@ function ineffectiveFlagNotices(flags) {
|
|
|
105
23
|
}
|
|
106
24
|
function generatorFlagsOf(parsed) {
|
|
107
25
|
const flags = {};
|
|
108
|
-
for (const name of GENERATOR_FLAGS) {
|
|
26
|
+
for (const name of cliFlagNames.GENERATOR_FLAGS) {
|
|
109
27
|
if (typeof parsed[name] === "boolean") {
|
|
110
28
|
flags[name] = parsed[name];
|
|
111
29
|
}
|
|
@@ -132,20 +50,8 @@ function refLimitsOf(parsed) {
|
|
|
132
50
|
...remoteRefHosts === void 0 ? {} : { remoteRefHosts }
|
|
133
51
|
};
|
|
134
52
|
}
|
|
135
|
-
const STRING_FLAGS = [
|
|
136
|
-
"output",
|
|
137
|
-
"redocly",
|
|
138
|
-
"fix",
|
|
139
|
-
...["localRefRoot", "remoteRefHosts"].flatMap((flag) => [flag, scule.kebabCase(flag)])
|
|
140
|
-
];
|
|
141
|
-
const KNOWN_FLAGS = /* @__PURE__ */ new Set([
|
|
142
|
-
...BOOLEAN_FLAGS,
|
|
143
|
-
...STRING_FLAGS,
|
|
144
|
-
...Object.values(ALIASES).flat(),
|
|
145
|
-
"version"
|
|
146
|
-
]);
|
|
147
53
|
function unknownFlagsOf(parsed, argv) {
|
|
148
|
-
const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
|
|
54
|
+
const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !cliFlagNames.KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
|
|
149
55
|
return [...new Set(names)];
|
|
150
56
|
}
|
|
151
57
|
function writtenFlagName(key, argv) {
|
|
@@ -156,17 +62,29 @@ function writtenFlagName(key, argv) {
|
|
|
156
62
|
const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));
|
|
157
63
|
return isNegated ? negated : `--${scule.kebabCase(key)}`;
|
|
158
64
|
}
|
|
65
|
+
function inputOf(positionals) {
|
|
66
|
+
if (positionals.length > 1) {
|
|
67
|
+
throw cliErrors.cliError(
|
|
68
|
+
"CLI_INPUT_EXTRA",
|
|
69
|
+
`Only one schema argument is allowed, but ${positionals.length} were given: ${positionals.join(" ")}. A shell expands an unquoted *; to generate several schemas, list them under \`apis\` in redocly.yaml. See ${docsLinks.MULTIPLE_SCHEMAS_DOCS_URL}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return optionalString(positionals[0]);
|
|
73
|
+
}
|
|
159
74
|
function parseCliArguments(argv) {
|
|
160
|
-
const flags = writtenFlags(argv);
|
|
161
|
-
rejectRemovedFlags(flags);
|
|
162
|
-
rejectInvalidBooleans(flags);
|
|
75
|
+
const flags = writtenFlags.writtenFlags(argv);
|
|
76
|
+
writtenFlags.rejectRemovedFlags(flags);
|
|
77
|
+
writtenFlags.rejectInvalidBooleans(flags);
|
|
78
|
+
writtenFlags.rejectNegatedValueFlags(flags);
|
|
163
79
|
const parsed = parser__default([...argv], {
|
|
164
|
-
boolean: BOOLEAN_FLAGS,
|
|
165
|
-
string: STRING_FLAGS,
|
|
166
|
-
alias: ALIASES
|
|
80
|
+
boolean: [...cliFlagNames.BOOLEAN_FLAGS, ...writtenFlags.unknownFlagNames(flags)],
|
|
81
|
+
string: cliFlagNames.STRING_FLAGS,
|
|
82
|
+
alias: cliFlagNames.ALIASES,
|
|
83
|
+
// A schema path is a file name: `1.10` is not the number 1.1.
|
|
84
|
+
configuration: { "parse-positional-numbers": false }
|
|
167
85
|
});
|
|
168
86
|
return {
|
|
169
|
-
input:
|
|
87
|
+
input: inputOf(parsed._),
|
|
170
88
|
output: lastString(parsed.output),
|
|
171
89
|
redocly: lastString(parsed.redocly),
|
|
172
90
|
isCheck: parsed.check === true,
|
|
@@ -179,7 +97,7 @@ function parseCliArguments(argv) {
|
|
|
179
97
|
};
|
|
180
98
|
}
|
|
181
99
|
|
|
182
|
-
exports.GENERATOR_FLAGS = GENERATOR_FLAGS;
|
|
100
|
+
exports.GENERATOR_FLAGS = cliFlagNames.GENERATOR_FLAGS;
|
|
183
101
|
exports.hostList = hostList;
|
|
184
102
|
exports.ineffectiveFlagNotices = ineffectiveFlagNotices;
|
|
185
103
|
exports.parseCliArguments = parseCliArguments;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-arguments.cjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** Boolean flags that become generator options (camelCase; yargs also accepts kebab-case). */\nexport const GENERATOR_FLAGS = [\n \"additionalProperties\",\n \"alphabetize\",\n \"arrayLength\",\n \"binaryAsBlob\",\n \"conditionalEnums\",\n \"dedupeEnums\",\n \"defaultNonNullable\",\n \"emptyObjectsUnknown\",\n \"enum\",\n \"enumValues\",\n \"excludeDeprecated\",\n \"exportType\",\n \"generatePathParams\",\n \"immutable\",\n \"lint\",\n \"makePathsEnum\",\n \"pathParamsAsTypes\",\n \"propertiesRequiredByDefault\",\n \"readWriteMarkers\",\n \"rootTypes\",\n \"rootTypesKeepCasing\",\n \"rootTypesNoSchemaPrefix\",\n] as const;\n\nexport type GeneratorFlag = (typeof GENERATOR_FLAGS)[number];\n\nexport type GeneratorFlags = Readonly<Partial<Record<GeneratorFlag, boolean>>>;\n\n// `contentNever` was a boolean flag of the original CLI that no code reads; it stays in the list\n// so that `--content-never <input>` keeps parsing as a flag and an input.\nconst CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, \"check\", \"contentNever\", \"help\"];\n\n// yargs-parser matches the `boolean` list by the exact spelling of the flag: with camelCase names\n// only, `--root-types schema.yaml` took the path as the flag's value (upstream #2523). Both\n// spellings are listed.\nconst BOOLEAN_FLAGS = [\n ...CAMEL_CASE_BOOLEAN_FLAGS,\n ...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => kebabCase(flag)),\n];\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags of older versions that were removed or renamed, with the message for each. */\nconst REMOVED_FLAGS: readonly (readonly [string, string])[] = [\n [\"-ap\", `The -ap alias has been deprecated. Use \"--additional-properties\" instead.`],\n [\"--immutable-types\", `The --immutable-types flag has been renamed to \"--immutable\".`],\n [\n \"--support-array-length\",\n `The --support-array-length flag has been renamed to \"--array-length\".`,\n ],\n [\"-it\", `The -it alias has been deprecated. Use \"--immutable\" instead.`],\n [\"--redoc\", `The --redoc config flag has been renamed to \"--redocly\" (or -c as shorthand).`],\n];\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"rootTypesNoSchemaPrefix\", \"rootTypesKeepCasing\"] as const;\n\nconst OPTIONS_END = \"--\";\nconst LONG_PREFIX = \"--\";\nconst NEGATION_PREFIX = \"--no-\";\nconst VALUE_SEPARATOR = \"=\";\nconst BOOLEAN_VALUES: ReadonlySet<string> = new Set([\"true\", \"false\"]);\n\n/** A flag as written before `--`: its name (`--redoc`, `-o`) and the text after `=`, if any. */\ninterface WrittenFlag {\n readonly name: string;\n readonly value: string | undefined;\n}\n\nfunction writtenFlags(argv: readonly string[]): WrittenFlag[] {\n const end = argv.indexOf(OPTIONS_END);\n return (end === -1 ? argv : argv.slice(0, end))\n .filter((arg) => arg.startsWith(\"-\") && arg !== \"-\")\n .map((arg) => {\n const at = arg.indexOf(VALUE_SEPARATOR);\n return at === -1\n ? { name: arg, value: undefined }\n : { name: arg.slice(0, at), value: arg.slice(at + 1) };\n });\n}\n\n/**\n * A long flag as yargs-parser reads it: in kebab-case and without `--no-`, so `--immutableTypes`\n * and `--no-immutable-types` are `--immutable-types`. A short flag stays as written.\n */\nfunction canonicalFlagName(name: string): string {\n if (!name.startsWith(LONG_PREFIX)) {\n return name;\n }\n const bare = name.startsWith(NEGATION_PREFIX)\n ? name.slice(NEGATION_PREFIX.length)\n : name.slice(LONG_PREFIX.length);\n return `${LONG_PREFIX}${kebabCase(bare)}`;\n}\n\n/** An old flag fails by its name in any spelling, also with a value (`--redoc=redocly.yaml`). */\nfunction rejectRemovedFlags(flags: readonly WrittenFlag[]): void {\n const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));\n for (const [flag, message] of REMOVED_FLAGS) {\n if (names.has(flag)) {\n throw cliError(\"CLI_FLAG_REMOVED\", message);\n }\n }\n}\n\nconst ALIASES = { redocly: [\"c\"], exportType: [\"t\"], output: [\"o\"] };\n\n/** The short aliases of boolean flags (`-t`), which take a value the same way (`-t=true`). */\nconst BOOLEAN_ALIASES = Object.entries(ALIASES)\n .filter(([flag]) => CAMEL_CASE_BOOLEAN_FLAGS.includes(flag))\n .flatMap(([, aliases]) => aliases.map((alias) => `-${alias}`));\n\nconst BOOLEAN_FLAG_NAMES: ReadonlySet<string> = new Set([\n ...BOOLEAN_FLAGS.map((flag) => `${LONG_PREFIX}${flag}`),\n ...BOOLEAN_ALIASES,\n]);\n\n/**\n * A boolean flag takes `=true` or `=false`, and its `--no-` form takes no value. yargs-parser read\n * any other value as false (`--enum=1`, `--alphabetize=yes`), which turned the option off.\n */\nfunction rejectInvalidBooleans(flags: readonly WrittenFlag[]): void {\n for (const { name, value } of flags) {\n const negated = name.startsWith(NEGATION_PREFIX)\n ? `${LONG_PREFIX}${name.slice(NEGATION_PREFIX.length)}`\n : undefined;\n const isNegatedWithValue = negated !== undefined && BOOLEAN_FLAG_NAMES.has(negated);\n const isInvalid = BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? \"true\");\n if (value !== undefined && (isNegatedWithValue || isInvalid)) {\n throw cliError(\n \"CLI_FLAG_INVALID\",\n `${name}=${value}: a boolean flag takes no value, or =true or =false.`,\n );\n }\n }\n}\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(flags: GeneratorFlags): string[] {\n if (flags.rootTypes === true) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(\n (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/**\n * The last value of a flag that takes one value: given twice, the last one wins, as for the\n * boolean flags (yargs-parser gives a list of every value).\n */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/** String flags, in both spellings, so that a value such as `8080` is not read as a number. */\nconst STRING_FLAGS = [\n \"output\",\n \"redocly\",\n \"fix\",\n ...[\"localRefRoot\", \"remoteRefHosts\"].flatMap((flag) => [flag, kebabCase(flag)]),\n];\n\n/** Every name yargs-parser can return for a flag this CLI reads. */\nconst KNOWN_FLAGS = new Set<string>([\n ...BOOLEAN_FLAGS,\n ...STRING_FLAGS,\n ...Object.values(ALIASES).flat(),\n \"version\",\n]);\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag, with\n * `CLI_FLAG_INVALID` for a boolean flag with another value than true or false, and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n const flags = writtenFlags(argv);\n rejectRemovedFlags(flags);\n rejectInvalidBooleans(flags);\n const parsed = parser([...argv], {\n boolean: BOOLEAN_FLAGS,\n string: STRING_FLAGS,\n alias: ALIASES,\n });\n return {\n input: optionalString(parsed._[0]),\n output: lastString(parsed.output),\n redocly: lastString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":["kebabCase","cliError","parser","fixNamesOf"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli-arguments.cjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport {\n ALIASES,\n BOOLEAN_FLAGS,\n GENERATOR_FLAGS,\n type GeneratorFlag,\n type GeneratorFlags,\n KNOWN_FLAGS,\n STRING_FLAGS,\n} from \"./cli-flag-names.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\nimport {\n rejectInvalidBooleans,\n rejectNegatedValueFlags,\n rejectRemovedFlags,\n unknownFlagNames,\n writtenFlags,\n} from \"./written-flags.js\";\n\nexport { GENERATOR_FLAGS, type GeneratorFlag, type GeneratorFlags } from \"./cli-flag-names.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"rootTypesNoSchemaPrefix\", \"rootTypesKeepCasing\"] as const;\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(flags: GeneratorFlags): string[] {\n if (flags.rootTypes === true) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(\n (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/**\n * The last value of a flag that takes one value: given twice, the last one wins, as for the\n * boolean flags (yargs-parser gives a list of every value).\n */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * The one schema argument. More than one fails with `CLI_INPUT_EXTRA`: the original CLI read the\n * first and dropped the rest, so a glob the shell expanded (`g/*.yaml`) generated one schema.\n */\nfunction inputOf(positionals: readonly (string | number)[]): string | undefined {\n if (positionals.length > 1) {\n throw cliError(\n \"CLI_INPUT_EXTRA\",\n `Only one schema argument is allowed, but ${positionals.length} were given: ` +\n `${positionals.join(\" \")}. A shell expands an unquoted *; to generate several ` +\n `schemas, list them under \\`apis\\` in redocly.yaml. See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n return optionalString(positionals[0]);\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag, with\n * `CLI_FLAG_INVALID` for a boolean flag with another value than true or false or a `--no-` form\n * of a flag that takes a value, with `CLI_INPUT_EXTRA` for a second schema argument, and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n const flags = writtenFlags(argv);\n rejectRemovedFlags(flags);\n rejectInvalidBooleans(flags);\n rejectNegatedValueFlags(flags);\n const parsed = parser([...argv], {\n boolean: [...BOOLEAN_FLAGS, ...unknownFlagNames(flags)],\n string: STRING_FLAGS,\n alias: ALIASES,\n // A schema path is a file name: `1.10` is not the number 1.1.\n configuration: { \"parse-positional-numbers\": false },\n });\n return {\n input: inputOf(parsed._),\n output: lastString(parsed.output),\n redocly: lastString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":["kebabCase","GENERATOR_FLAGS","KNOWN_FLAGS","cliError","MULTIPLE_SCHEMAS_DOCS_URL","writtenFlags","rejectRemovedFlags","rejectInvalidBooleans","rejectNegatedValueFlags","parser","BOOLEAN_FLAGS","unknownFlagNames","STRING_FLAGS","ALIASES","fixNamesOf"],"mappings":"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"}
|
|
@@ -1,94 +1,12 @@
|
|
|
1
1
|
import { kebabCase } from 'scule';
|
|
2
2
|
import parser from 'yargs-parser';
|
|
3
3
|
import { cliError } from './cli-errors.mjs';
|
|
4
|
+
import { ALIASES, STRING_FLAGS, BOOLEAN_FLAGS, KNOWN_FLAGS, GENERATOR_FLAGS } from './cli-flag-names.mjs';
|
|
5
|
+
import { MULTIPLE_SCHEMAS_DOCS_URL } from './docs-links.mjs';
|
|
4
6
|
import { fixNamesOf } from './fix-option.mjs';
|
|
7
|
+
import { writtenFlags, rejectRemovedFlags, rejectInvalidBooleans, rejectNegatedValueFlags, unknownFlagNames } from './written-flags.mjs';
|
|
5
8
|
|
|
6
|
-
const GENERATOR_FLAGS = [
|
|
7
|
-
"additionalProperties",
|
|
8
|
-
"alphabetize",
|
|
9
|
-
"arrayLength",
|
|
10
|
-
"binaryAsBlob",
|
|
11
|
-
"conditionalEnums",
|
|
12
|
-
"dedupeEnums",
|
|
13
|
-
"defaultNonNullable",
|
|
14
|
-
"emptyObjectsUnknown",
|
|
15
|
-
"enum",
|
|
16
|
-
"enumValues",
|
|
17
|
-
"excludeDeprecated",
|
|
18
|
-
"exportType",
|
|
19
|
-
"generatePathParams",
|
|
20
|
-
"immutable",
|
|
21
|
-
"lint",
|
|
22
|
-
"makePathsEnum",
|
|
23
|
-
"pathParamsAsTypes",
|
|
24
|
-
"propertiesRequiredByDefault",
|
|
25
|
-
"readWriteMarkers",
|
|
26
|
-
"rootTypes",
|
|
27
|
-
"rootTypesKeepCasing",
|
|
28
|
-
"rootTypesNoSchemaPrefix"
|
|
29
|
-
];
|
|
30
|
-
const CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, "check", "contentNever", "help"];
|
|
31
|
-
const BOOLEAN_FLAGS = [
|
|
32
|
-
...CAMEL_CASE_BOOLEAN_FLAGS,
|
|
33
|
-
...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => kebabCase(flag))
|
|
34
|
-
];
|
|
35
|
-
const REMOVED_FLAGS = [
|
|
36
|
-
["-ap", `The -ap alias has been deprecated. Use "--additional-properties" instead.`],
|
|
37
|
-
["--immutable-types", `The --immutable-types flag has been renamed to "--immutable".`],
|
|
38
|
-
[
|
|
39
|
-
"--support-array-length",
|
|
40
|
-
`The --support-array-length flag has been renamed to "--array-length".`
|
|
41
|
-
],
|
|
42
|
-
["-it", `The -it alias has been deprecated. Use "--immutable" instead.`],
|
|
43
|
-
["--redoc", `The --redoc config flag has been renamed to "--redocly" (or -c as shorthand).`]
|
|
44
|
-
];
|
|
45
9
|
const ROOT_TYPES_FLAGS = ["rootTypesNoSchemaPrefix", "rootTypesKeepCasing"];
|
|
46
|
-
const OPTIONS_END = "--";
|
|
47
|
-
const LONG_PREFIX = "--";
|
|
48
|
-
const NEGATION_PREFIX = "--no-";
|
|
49
|
-
const VALUE_SEPARATOR = "=";
|
|
50
|
-
const BOOLEAN_VALUES = /* @__PURE__ */ new Set(["true", "false"]);
|
|
51
|
-
function writtenFlags(argv) {
|
|
52
|
-
const end = argv.indexOf(OPTIONS_END);
|
|
53
|
-
return (end === -1 ? argv : argv.slice(0, end)).filter((arg) => arg.startsWith("-") && arg !== "-").map((arg) => {
|
|
54
|
-
const at = arg.indexOf(VALUE_SEPARATOR);
|
|
55
|
-
return at === -1 ? { name: arg, value: void 0 } : { name: arg.slice(0, at), value: arg.slice(at + 1) };
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
function canonicalFlagName(name) {
|
|
59
|
-
if (!name.startsWith(LONG_PREFIX)) {
|
|
60
|
-
return name;
|
|
61
|
-
}
|
|
62
|
-
const bare = name.startsWith(NEGATION_PREFIX) ? name.slice(NEGATION_PREFIX.length) : name.slice(LONG_PREFIX.length);
|
|
63
|
-
return `${LONG_PREFIX}${kebabCase(bare)}`;
|
|
64
|
-
}
|
|
65
|
-
function rejectRemovedFlags(flags) {
|
|
66
|
-
const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));
|
|
67
|
-
for (const [flag, message] of REMOVED_FLAGS) {
|
|
68
|
-
if (names.has(flag)) {
|
|
69
|
-
throw cliError("CLI_FLAG_REMOVED", message);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
const ALIASES = { redocly: ["c"], exportType: ["t"], output: ["o"] };
|
|
74
|
-
const BOOLEAN_ALIASES = Object.entries(ALIASES).filter(([flag]) => CAMEL_CASE_BOOLEAN_FLAGS.includes(flag)).flatMap(([, aliases]) => aliases.map((alias) => `-${alias}`));
|
|
75
|
-
const BOOLEAN_FLAG_NAMES = /* @__PURE__ */ new Set([
|
|
76
|
-
...BOOLEAN_FLAGS.map((flag) => `${LONG_PREFIX}${flag}`),
|
|
77
|
-
...BOOLEAN_ALIASES
|
|
78
|
-
]);
|
|
79
|
-
function rejectInvalidBooleans(flags) {
|
|
80
|
-
for (const { name, value } of flags) {
|
|
81
|
-
const negated = name.startsWith(NEGATION_PREFIX) ? `${LONG_PREFIX}${name.slice(NEGATION_PREFIX.length)}` : void 0;
|
|
82
|
-
const isNegatedWithValue = negated !== void 0 && BOOLEAN_FLAG_NAMES.has(negated);
|
|
83
|
-
const isInvalid = BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? "true");
|
|
84
|
-
if (value !== void 0 && (isNegatedWithValue || isInvalid)) {
|
|
85
|
-
throw cliError(
|
|
86
|
-
"CLI_FLAG_INVALID",
|
|
87
|
-
`${name}=${value}: a boolean flag takes no value, or =true or =false.`
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
10
|
function ineffectiveFlagNotices(flags) {
|
|
93
11
|
if (flags.rootTypes === true) {
|
|
94
12
|
return [];
|
|
@@ -126,18 +44,6 @@ function refLimitsOf(parsed) {
|
|
|
126
44
|
...remoteRefHosts === void 0 ? {} : { remoteRefHosts }
|
|
127
45
|
};
|
|
128
46
|
}
|
|
129
|
-
const STRING_FLAGS = [
|
|
130
|
-
"output",
|
|
131
|
-
"redocly",
|
|
132
|
-
"fix",
|
|
133
|
-
...["localRefRoot", "remoteRefHosts"].flatMap((flag) => [flag, kebabCase(flag)])
|
|
134
|
-
];
|
|
135
|
-
const KNOWN_FLAGS = /* @__PURE__ */ new Set([
|
|
136
|
-
...BOOLEAN_FLAGS,
|
|
137
|
-
...STRING_FLAGS,
|
|
138
|
-
...Object.values(ALIASES).flat(),
|
|
139
|
-
"version"
|
|
140
|
-
]);
|
|
141
47
|
function unknownFlagsOf(parsed, argv) {
|
|
142
48
|
const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
|
|
143
49
|
return [...new Set(names)];
|
|
@@ -150,17 +56,29 @@ function writtenFlagName(key, argv) {
|
|
|
150
56
|
const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));
|
|
151
57
|
return isNegated ? negated : `--${kebabCase(key)}`;
|
|
152
58
|
}
|
|
59
|
+
function inputOf(positionals) {
|
|
60
|
+
if (positionals.length > 1) {
|
|
61
|
+
throw cliError(
|
|
62
|
+
"CLI_INPUT_EXTRA",
|
|
63
|
+
`Only one schema argument is allowed, but ${positionals.length} were given: ${positionals.join(" ")}. A shell expands an unquoted *; to generate several schemas, list them under \`apis\` in redocly.yaml. See ${MULTIPLE_SCHEMAS_DOCS_URL}`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return optionalString(positionals[0]);
|
|
67
|
+
}
|
|
153
68
|
function parseCliArguments(argv) {
|
|
154
69
|
const flags = writtenFlags(argv);
|
|
155
70
|
rejectRemovedFlags(flags);
|
|
156
71
|
rejectInvalidBooleans(flags);
|
|
72
|
+
rejectNegatedValueFlags(flags);
|
|
157
73
|
const parsed = parser([...argv], {
|
|
158
|
-
boolean: BOOLEAN_FLAGS,
|
|
74
|
+
boolean: [...BOOLEAN_FLAGS, ...unknownFlagNames(flags)],
|
|
159
75
|
string: STRING_FLAGS,
|
|
160
|
-
alias: ALIASES
|
|
76
|
+
alias: ALIASES,
|
|
77
|
+
// A schema path is a file name: `1.10` is not the number 1.1.
|
|
78
|
+
configuration: { "parse-positional-numbers": false }
|
|
161
79
|
});
|
|
162
80
|
return {
|
|
163
|
-
input:
|
|
81
|
+
input: inputOf(parsed._),
|
|
164
82
|
output: lastString(parsed.output),
|
|
165
83
|
redocly: lastString(parsed.redocly),
|
|
166
84
|
isCheck: parsed.check === true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-arguments.mjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** Boolean flags that become generator options (camelCase; yargs also accepts kebab-case). */\nexport const GENERATOR_FLAGS = [\n \"additionalProperties\",\n \"alphabetize\",\n \"arrayLength\",\n \"binaryAsBlob\",\n \"conditionalEnums\",\n \"dedupeEnums\",\n \"defaultNonNullable\",\n \"emptyObjectsUnknown\",\n \"enum\",\n \"enumValues\",\n \"excludeDeprecated\",\n \"exportType\",\n \"generatePathParams\",\n \"immutable\",\n \"lint\",\n \"makePathsEnum\",\n \"pathParamsAsTypes\",\n \"propertiesRequiredByDefault\",\n \"readWriteMarkers\",\n \"rootTypes\",\n \"rootTypesKeepCasing\",\n \"rootTypesNoSchemaPrefix\",\n] as const;\n\nexport type GeneratorFlag = (typeof GENERATOR_FLAGS)[number];\n\nexport type GeneratorFlags = Readonly<Partial<Record<GeneratorFlag, boolean>>>;\n\n// `contentNever` was a boolean flag of the original CLI that no code reads; it stays in the list\n// so that `--content-never <input>` keeps parsing as a flag and an input.\nconst CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, \"check\", \"contentNever\", \"help\"];\n\n// yargs-parser matches the `boolean` list by the exact spelling of the flag: with camelCase names\n// only, `--root-types schema.yaml` took the path as the flag's value (upstream #2523). Both\n// spellings are listed.\nconst BOOLEAN_FLAGS = [\n ...CAMEL_CASE_BOOLEAN_FLAGS,\n ...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => kebabCase(flag)),\n];\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags of older versions that were removed or renamed, with the message for each. */\nconst REMOVED_FLAGS: readonly (readonly [string, string])[] = [\n [\"-ap\", `The -ap alias has been deprecated. Use \"--additional-properties\" instead.`],\n [\"--immutable-types\", `The --immutable-types flag has been renamed to \"--immutable\".`],\n [\n \"--support-array-length\",\n `The --support-array-length flag has been renamed to \"--array-length\".`,\n ],\n [\"-it\", `The -it alias has been deprecated. Use \"--immutable\" instead.`],\n [\"--redoc\", `The --redoc config flag has been renamed to \"--redocly\" (or -c as shorthand).`],\n];\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"rootTypesNoSchemaPrefix\", \"rootTypesKeepCasing\"] as const;\n\nconst OPTIONS_END = \"--\";\nconst LONG_PREFIX = \"--\";\nconst NEGATION_PREFIX = \"--no-\";\nconst VALUE_SEPARATOR = \"=\";\nconst BOOLEAN_VALUES: ReadonlySet<string> = new Set([\"true\", \"false\"]);\n\n/** A flag as written before `--`: its name (`--redoc`, `-o`) and the text after `=`, if any. */\ninterface WrittenFlag {\n readonly name: string;\n readonly value: string | undefined;\n}\n\nfunction writtenFlags(argv: readonly string[]): WrittenFlag[] {\n const end = argv.indexOf(OPTIONS_END);\n return (end === -1 ? argv : argv.slice(0, end))\n .filter((arg) => arg.startsWith(\"-\") && arg !== \"-\")\n .map((arg) => {\n const at = arg.indexOf(VALUE_SEPARATOR);\n return at === -1\n ? { name: arg, value: undefined }\n : { name: arg.slice(0, at), value: arg.slice(at + 1) };\n });\n}\n\n/**\n * A long flag as yargs-parser reads it: in kebab-case and without `--no-`, so `--immutableTypes`\n * and `--no-immutable-types` are `--immutable-types`. A short flag stays as written.\n */\nfunction canonicalFlagName(name: string): string {\n if (!name.startsWith(LONG_PREFIX)) {\n return name;\n }\n const bare = name.startsWith(NEGATION_PREFIX)\n ? name.slice(NEGATION_PREFIX.length)\n : name.slice(LONG_PREFIX.length);\n return `${LONG_PREFIX}${kebabCase(bare)}`;\n}\n\n/** An old flag fails by its name in any spelling, also with a value (`--redoc=redocly.yaml`). */\nfunction rejectRemovedFlags(flags: readonly WrittenFlag[]): void {\n const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));\n for (const [flag, message] of REMOVED_FLAGS) {\n if (names.has(flag)) {\n throw cliError(\"CLI_FLAG_REMOVED\", message);\n }\n }\n}\n\nconst ALIASES = { redocly: [\"c\"], exportType: [\"t\"], output: [\"o\"] };\n\n/** The short aliases of boolean flags (`-t`), which take a value the same way (`-t=true`). */\nconst BOOLEAN_ALIASES = Object.entries(ALIASES)\n .filter(([flag]) => CAMEL_CASE_BOOLEAN_FLAGS.includes(flag))\n .flatMap(([, aliases]) => aliases.map((alias) => `-${alias}`));\n\nconst BOOLEAN_FLAG_NAMES: ReadonlySet<string> = new Set([\n ...BOOLEAN_FLAGS.map((flag) => `${LONG_PREFIX}${flag}`),\n ...BOOLEAN_ALIASES,\n]);\n\n/**\n * A boolean flag takes `=true` or `=false`, and its `--no-` form takes no value. yargs-parser read\n * any other value as false (`--enum=1`, `--alphabetize=yes`), which turned the option off.\n */\nfunction rejectInvalidBooleans(flags: readonly WrittenFlag[]): void {\n for (const { name, value } of flags) {\n const negated = name.startsWith(NEGATION_PREFIX)\n ? `${LONG_PREFIX}${name.slice(NEGATION_PREFIX.length)}`\n : undefined;\n const isNegatedWithValue = negated !== undefined && BOOLEAN_FLAG_NAMES.has(negated);\n const isInvalid = BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? \"true\");\n if (value !== undefined && (isNegatedWithValue || isInvalid)) {\n throw cliError(\n \"CLI_FLAG_INVALID\",\n `${name}=${value}: a boolean flag takes no value, or =true or =false.`,\n );\n }\n }\n}\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(flags: GeneratorFlags): string[] {\n if (flags.rootTypes === true) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(\n (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/**\n * The last value of a flag that takes one value: given twice, the last one wins, as for the\n * boolean flags (yargs-parser gives a list of every value).\n */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/** String flags, in both spellings, so that a value such as `8080` is not read as a number. */\nconst STRING_FLAGS = [\n \"output\",\n \"redocly\",\n \"fix\",\n ...[\"localRefRoot\", \"remoteRefHosts\"].flatMap((flag) => [flag, kebabCase(flag)]),\n];\n\n/** Every name yargs-parser can return for a flag this CLI reads. */\nconst KNOWN_FLAGS = new Set<string>([\n ...BOOLEAN_FLAGS,\n ...STRING_FLAGS,\n ...Object.values(ALIASES).flat(),\n \"version\",\n]);\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag, with\n * `CLI_FLAG_INVALID` for a boolean flag with another value than true or false, and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n const flags = writtenFlags(argv);\n rejectRemovedFlags(flags);\n rejectInvalidBooleans(flags);\n const parsed = parser([...argv], {\n boolean: BOOLEAN_FLAGS,\n string: STRING_FLAGS,\n alias: ALIASES,\n });\n return {\n input: optionalString(parsed._[0]),\n output: lastString(parsed.output),\n redocly: lastString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli-arguments.mjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport {\n ALIASES,\n BOOLEAN_FLAGS,\n GENERATOR_FLAGS,\n type GeneratorFlag,\n type GeneratorFlags,\n KNOWN_FLAGS,\n STRING_FLAGS,\n} from \"./cli-flag-names.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\nimport {\n rejectInvalidBooleans,\n rejectNegatedValueFlags,\n rejectRemovedFlags,\n unknownFlagNames,\n writtenFlags,\n} from \"./written-flags.js\";\n\nexport { GENERATOR_FLAGS, type GeneratorFlag, type GeneratorFlags } from \"./cli-flag-names.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"rootTypesNoSchemaPrefix\", \"rootTypesKeepCasing\"] as const;\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(flags: GeneratorFlags): string[] {\n if (flags.rootTypes === true) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(\n (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/**\n * The last value of a flag that takes one value: given twice, the last one wins, as for the\n * boolean flags (yargs-parser gives a list of every value).\n */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * The one schema argument. More than one fails with `CLI_INPUT_EXTRA`: the original CLI read the\n * first and dropped the rest, so a glob the shell expanded (`g/*.yaml`) generated one schema.\n */\nfunction inputOf(positionals: readonly (string | number)[]): string | undefined {\n if (positionals.length > 1) {\n throw cliError(\n \"CLI_INPUT_EXTRA\",\n `Only one schema argument is allowed, but ${positionals.length} were given: ` +\n `${positionals.join(\" \")}. A shell expands an unquoted *; to generate several ` +\n `schemas, list them under \\`apis\\` in redocly.yaml. See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n return optionalString(positionals[0]);\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag, with\n * `CLI_FLAG_INVALID` for a boolean flag with another value than true or false or a `--no-` form\n * of a flag that takes a value, with `CLI_INPUT_EXTRA` for a second schema argument, and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n const flags = writtenFlags(argv);\n rejectRemovedFlags(flags);\n rejectInvalidBooleans(flags);\n rejectNegatedValueFlags(flags);\n const parsed = parser([...argv], {\n boolean: [...BOOLEAN_FLAGS, ...unknownFlagNames(flags)],\n string: STRING_FLAGS,\n alias: ALIASES,\n // A schema path is a file name: `1.10` is not the number 1.1.\n configuration: { \"parse-positional-numbers\": false },\n });\n return {\n input: inputOf(parsed._),\n output: lastString(parsed.output),\n redocly: lastString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/cli/cli-errors.cjs
CHANGED
|
@@ -67,6 +67,7 @@ const CLI_ERROR_REPORTS = {
|
|
|
67
67
|
CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
|
|
68
68
|
CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
|
|
69
69
|
CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
|
|
70
|
+
CLI_INPUT_EXTRA: { exitCode: EXIT_CODES.USAGE },
|
|
70
71
|
CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },
|
|
71
72
|
CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },
|
|
72
73
|
CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-errors.cjs","sources":["../../src/cli/cli-errors.ts"],"sourcesContent":["import {\n ERROR_CODES,\n type ErrorCode,\n isOpenAPITypesafeError,\n OpenAPITypesafeError,\n} from \"../domain/errors.js\";\n\n/**\n * How the CLI reports a failure (ENGINEERING_PLAN 4.6, ADR-011): each error code maps to a process\n * exit code and the line printed for it. The table is exhaustive, so a new error code does not\n * compile until the CLI handles it.\n */\n\n/** Process exit codes of the CLI, documented in docs/cli.md. */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n /** `--check` found output that differs from the generated types (as in the original CLI). */\n OUTPUT_STALE: 1,\n /** A flag, the Redocly config, the environment or a callback is wrong. */\n USAGE: 2,\n /** The OpenAPI document cannot be read, is invalid, or cannot be converted. */\n SCHEMA: 3,\n /** An output file cannot be read or written. */\n OUTPUT: 4,\n /** An unexpected failure: a bug in the generator (sysexits `EX_SOFTWARE`). */\n INTERNAL: 70,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\ninterface CliErrorReport {\n readonly exitCode: ExitCode;\n /** The printed text; the error's own message when absent. */\n readonly message?: (error: OpenAPITypesafeError) => string;\n}\n\n/** Problems are printed one by one while linting, so the summary only counts them. */\nfunction schemaInvalidMessage(error: OpenAPITypesafeError): string {\n const count = Array.isArray(error.details.problems) ? error.details.problems.length : 1;\n return `The OpenAPI document has ${count} ${count === 1 ? \"error\" : \"errors\"} (see above)`;\n}\n\n/**\n * Node's `fetch` fails with only \"fetch failed\"; the network reason (refused, DNS, TLS) is the\n * cause of that error. The Node API keeps the original message, so only the CLI adds it.\n */\nfunction loadFailedMessage(error: OpenAPITypesafeError): string {\n const reason = error.cause instanceof Error ? error.cause.cause : undefined;\n if (!(reason instanceof Error)) {\n return error.message;\n }\n // `loadFailedError`, the only source of this code, always sets the source.\n return `${error.message}: ${reason.message} (${String(error.details.source)})`;\n}\n\n/** The message js-yaml throws at its nesting limit (docs/security/threat-model.md T2). */\nconst YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \\((\\d+)\\)/;\n\n/** The parser's message says the limit, not how to stay under it. */\nfunction parseFailedMessage(error: OpenAPITypesafeError): string {\n const limit = YAML_DEPTH_LIMIT_MESSAGE.exec(error.message)?.[1];\n if (limit === undefined) {\n return error.message;\n }\n return (\n `${error.message}. The YAML parser reads at most ${limit} nested levels: ` +\n \"move nested schemas to `components` and reference them with `$ref`\"\n );\n}\n\n/**\n * Text piped into stdin that is only a YAML string (`echo api.yaml | openapi-typesafe`) gets the\n * CLI's advice, not the Node API's (`openapiTS(pathToFileURL(path))`).\n */\nfunction sourceInvalidMessage(error: OpenAPITypesafeError): string {\n const { received, text } = error.details;\n if (received !== \"stream\" || typeof text !== \"string\") {\n return error.message;\n }\n return (\n `stdin held only the YAML string \"${text}\", not an OpenAPI document. To read a file, pass ` +\n \"its path or URL as the first argument: openapi-typesafe ./openapi.yaml -o ./schema.ts\"\n );\n}\n\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: sourceInvalidMessage },\n SCHEMA_LOAD_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: loadFailedMessage },\n SCHEMA_PARSE_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: parseFailedMessage },\n SCHEMA_VERSION_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: schemaInvalidMessage },\n SCHEMA_REF_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_REF_FORBIDDEN: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_OBJECT_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_PROPERTY_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_TOO_DEEP: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_KEY_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },\n OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },\n OPTION_INVALID: { exitCode: EXIT_CODES.USAGE },\n TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_LOCATION_INVALID: { exitCode: EXIT_CODES.USAGE },\n OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },\n OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n};\n\n/** What the CLI prints and returns for a thrown value. */\nexport interface CliFailure {\n readonly exitCode: ExitCode;\n readonly message: string;\n}\n\n/**\n * Map a thrown value to the CLI's output. A typed error prints one line with its code; anything\n * else is a bug and prints its stack, so it can be reported.\n */\nexport function describeCliFailure(error: unknown): CliFailure {\n if (error instanceof ApiFailure) {\n const failure = describeCliFailure(error.cause);\n return { ...failure, message: `API ${error.apiName}: ${failure.message}` };\n }\n if (!isOpenAPITypesafeError(error)) {\n const text = error instanceof Error ? (error.stack ?? error.message) : String(error);\n return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };\n }\n const report = CLI_ERROR_REPORTS[error.code];\n const message = report.message?.(error) ?? error.message;\n return { exitCode: report.exitCode, message: `${message} (${error.code})` };\n}\n\n/**\n * A failure of one API of a Redocly config. The CLI reports its cause with the API named first,\n * as the config errors of an API are; the cause keeps its code and so its exit code.\n */\nexport class ApiFailure extends Error {\n override readonly name = \"ApiFailure\";\n override readonly cause: unknown;\n readonly apiName: string;\n\n constructor(apiName: string, cause: unknown) {\n super(`API ${apiName} failed`, { cause });\n this.apiName = apiName;\n this.cause = cause;\n }\n}\n\n/** Errors of the CLI itself; its messages are the original CLI's messages. */\nexport function cliError(\n code: Extract<ErrorCode, `CLI_${string}` | `OUTPUT_${string}`>,\n message: string,\n cause?: unknown,\n): OpenAPITypesafeError {\n return new OpenAPITypesafeError({ code: ERROR_CODES[code], message, cause });\n}\n"],"names":["isOpenAPITypesafeError","OpenAPITypesafeError","ERROR_CODES"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli-errors.cjs","sources":["../../src/cli/cli-errors.ts"],"sourcesContent":["import {\n ERROR_CODES,\n type ErrorCode,\n isOpenAPITypesafeError,\n OpenAPITypesafeError,\n} from \"../domain/errors.js\";\n\n/**\n * How the CLI reports a failure (ENGINEERING_PLAN 4.6, ADR-011): each error code maps to a process\n * exit code and the line printed for it. The table is exhaustive, so a new error code does not\n * compile until the CLI handles it.\n */\n\n/** Process exit codes of the CLI, documented in docs/cli.md. */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n /** `--check` found output that differs from the generated types (as in the original CLI). */\n OUTPUT_STALE: 1,\n /** A flag, the Redocly config, the environment or a callback is wrong. */\n USAGE: 2,\n /** The OpenAPI document cannot be read, is invalid, or cannot be converted. */\n SCHEMA: 3,\n /** An output file cannot be read or written. */\n OUTPUT: 4,\n /** An unexpected failure: a bug in the generator (sysexits `EX_SOFTWARE`). */\n INTERNAL: 70,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\ninterface CliErrorReport {\n readonly exitCode: ExitCode;\n /** The printed text; the error's own message when absent. */\n readonly message?: (error: OpenAPITypesafeError) => string;\n}\n\n/** Problems are printed one by one while linting, so the summary only counts them. */\nfunction schemaInvalidMessage(error: OpenAPITypesafeError): string {\n const count = Array.isArray(error.details.problems) ? error.details.problems.length : 1;\n return `The OpenAPI document has ${count} ${count === 1 ? \"error\" : \"errors\"} (see above)`;\n}\n\n/**\n * Node's `fetch` fails with only \"fetch failed\"; the network reason (refused, DNS, TLS) is the\n * cause of that error. The Node API keeps the original message, so only the CLI adds it.\n */\nfunction loadFailedMessage(error: OpenAPITypesafeError): string {\n const reason = error.cause instanceof Error ? error.cause.cause : undefined;\n if (!(reason instanceof Error)) {\n return error.message;\n }\n // `loadFailedError`, the only source of this code, always sets the source.\n return `${error.message}: ${reason.message} (${String(error.details.source)})`;\n}\n\n/** The message js-yaml throws at its nesting limit (docs/security/threat-model.md T2). */\nconst YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \\((\\d+)\\)/;\n\n/** The parser's message says the limit, not how to stay under it. */\nfunction parseFailedMessage(error: OpenAPITypesafeError): string {\n const limit = YAML_DEPTH_LIMIT_MESSAGE.exec(error.message)?.[1];\n if (limit === undefined) {\n return error.message;\n }\n return (\n `${error.message}. The YAML parser reads at most ${limit} nested levels: ` +\n \"move nested schemas to `components` and reference them with `$ref`\"\n );\n}\n\n/**\n * Text piped into stdin that is only a YAML string (`echo api.yaml | openapi-typesafe`) gets the\n * CLI's advice, not the Node API's (`openapiTS(pathToFileURL(path))`).\n */\nfunction sourceInvalidMessage(error: OpenAPITypesafeError): string {\n const { received, text } = error.details;\n if (received !== \"stream\" || typeof text !== \"string\") {\n return error.message;\n }\n return (\n `stdin held only the YAML string \"${text}\", not an OpenAPI document. To read a file, pass ` +\n \"its path or URL as the first argument: openapi-typesafe ./openapi.yaml -o ./schema.ts\"\n );\n}\n\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: sourceInvalidMessage },\n SCHEMA_LOAD_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: loadFailedMessage },\n SCHEMA_PARSE_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: parseFailedMessage },\n SCHEMA_VERSION_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: schemaInvalidMessage },\n SCHEMA_REF_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_REF_FORBIDDEN: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_OBJECT_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_PROPERTY_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_TOO_DEEP: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_KEY_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },\n OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },\n OPTION_INVALID: { exitCode: EXIT_CODES.USAGE },\n TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_EXTRA: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_LOCATION_INVALID: { exitCode: EXIT_CODES.USAGE },\n OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },\n OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n};\n\n/** What the CLI prints and returns for a thrown value. */\nexport interface CliFailure {\n readonly exitCode: ExitCode;\n readonly message: string;\n}\n\n/**\n * Map a thrown value to the CLI's output. A typed error prints one line with its code; anything\n * else is a bug and prints its stack, so it can be reported.\n */\nexport function describeCliFailure(error: unknown): CliFailure {\n if (error instanceof ApiFailure) {\n const failure = describeCliFailure(error.cause);\n return { ...failure, message: `API ${error.apiName}: ${failure.message}` };\n }\n if (!isOpenAPITypesafeError(error)) {\n const text = error instanceof Error ? (error.stack ?? error.message) : String(error);\n return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };\n }\n const report = CLI_ERROR_REPORTS[error.code];\n const message = report.message?.(error) ?? error.message;\n return { exitCode: report.exitCode, message: `${message} (${error.code})` };\n}\n\n/**\n * A failure of one API of a Redocly config. The CLI reports its cause with the API named first,\n * as the config errors of an API are; the cause keeps its code and so its exit code.\n */\nexport class ApiFailure extends Error {\n override readonly name = \"ApiFailure\";\n override readonly cause: unknown;\n readonly apiName: string;\n\n constructor(apiName: string, cause: unknown) {\n super(`API ${apiName} failed`, { cause });\n this.apiName = apiName;\n this.cause = cause;\n }\n}\n\n/** Errors of the CLI itself; its messages are the original CLI's messages. */\nexport function cliError(\n code: Extract<ErrorCode, `CLI_${string}` | `OUTPUT_${string}`>,\n message: string,\n cause?: unknown,\n): OpenAPITypesafeError {\n return new OpenAPITypesafeError({ code: ERROR_CODES[code], message, cause });\n}\n"],"names":["isOpenAPITypesafeError","OpenAPITypesafeError","ERROR_CODES"],"mappings":"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"}
|
package/dist/cli/cli-errors.mjs
CHANGED
|
@@ -65,6 +65,7 @@ const CLI_ERROR_REPORTS = {
|
|
|
65
65
|
CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
|
|
66
66
|
CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
|
|
67
67
|
CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
|
|
68
|
+
CLI_INPUT_EXTRA: { exitCode: EXIT_CODES.USAGE },
|
|
68
69
|
CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },
|
|
69
70
|
CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },
|
|
70
71
|
CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },
|