openapi-typesafe 1.0.0-rc.4 → 1.0.0-rc.5
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 +141 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
- package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
- package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
- package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
- package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
- package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
- package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
- package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
- package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
- package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
- package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +26 -14
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +26 -14
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.cjs +16 -3
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.mjs +16 -3
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.cjs +5 -3
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.mjs +5 -3
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
- package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
- package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
- package/dist/api/document-refs.cjs +16 -1
- package/dist/api/document-refs.cjs.map +1 -1
- package/dist/api/document-refs.mjs +16 -1
- package/dist/api/document-refs.mjs.map +1 -1
- package/dist/api/document-run.cjs +4 -10
- package/dist/api/document-run.cjs.map +1 -1
- package/dist/api/document-run.mjs +4 -10
- package/dist/api/document-run.mjs.map +1 -1
- package/dist/api/openapi-ts.cjs +1 -2
- package/dist/api/openapi-ts.cjs.map +1 -1
- package/dist/api/openapi-ts.mjs +2 -3
- package/dist/api/openapi-ts.mjs.map +1 -1
- package/dist/api/ref-limit-options.cjs +63 -0
- package/dist/api/ref-limit-options.cjs.map +1 -0
- package/dist/api/ref-limit-options.mjs +57 -0
- package/dist/api/ref-limit-options.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +12 -5
- package/dist/api/transform-schema.cjs.map +1 -1
- package/dist/api/transform-schema.mjs +12 -5
- package/dist/api/transform-schema.mjs.map +1 -1
- package/dist/application/transform/declared-value-types.cjs +36 -0
- package/dist/application/transform/declared-value-types.cjs.map +1 -0
- package/dist/application/transform/declared-value-types.mjs +34 -0
- package/dist/application/transform/declared-value-types.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +3 -1
- package/dist/application/transform/document/document.cjs.map +1 -1
- package/dist/application/transform/document/document.mjs +3 -1
- package/dist/application/transform/document/document.mjs.map +1 -1
- package/dist/application/transform/document/exploded-query-values.cjs +63 -0
- package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
- package/dist/application/transform/document/exploded-query-values.mjs +59 -0
- package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +11 -3
- package/dist/application/transform/document/header.cjs.map +1 -1
- package/dist/application/transform/document/header.mjs +10 -2
- package/dist/application/transform/document/header.mjs.map +1 -1
- package/dist/application/transform/document/parameter.cjs +1 -1
- package/dist/application/transform/document/parameter.cjs.map +1 -1
- package/dist/application/transform/document/parameter.mjs +1 -1
- package/dist/application/transform/document/parameter.mjs.map +1 -1
- package/dist/application/transform/document/parameters.cjs +23 -5
- package/dist/application/transform/document/parameters.cjs.map +1 -1
- package/dist/application/transform/document/parameters.mjs +23 -5
- package/dist/application/transform/document/parameters.mjs.map +1 -1
- package/dist/application/transform/document/path-item.cjs +4 -3
- package/dist/application/transform/document/path-item.cjs.map +1 -1
- package/dist/application/transform/document/path-item.mjs +4 -4
- package/dist/application/transform/document/path-item.mjs.map +1 -1
- package/dist/application/transform/document/path-template-key.cjs +84 -0
- package/dist/application/transform/document/path-template-key.cjs.map +1 -0
- package/dist/application/transform/document/path-template-key.mjs +79 -0
- package/dist/application/transform/document/path-template-key.mjs.map +1 -0
- package/dist/application/transform/document/path-template-refs.cjs +70 -0
- package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
- package/dist/application/transform/document/path-template-refs.mjs +67 -0
- package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +7 -6
- package/dist/application/transform/document/paths-enum.cjs.map +1 -1
- package/dist/application/transform/document/paths-enum.mjs +7 -6
- package/dist/application/transform/document/paths-enum.mjs.map +1 -1
- package/dist/application/transform/document/paths.cjs +38 -66
- package/dist/application/transform/document/paths.cjs.map +1 -1
- package/dist/application/transform/document/paths.mjs +36 -66
- package/dist/application/transform/document/paths.mjs.map +1 -1
- package/dist/application/transform/document/webhooks.cjs +10 -3
- package/dist/application/transform/document/webhooks.cjs.map +1 -1
- package/dist/application/transform/document/webhooks.mjs +9 -2
- package/dist/application/transform/document/webhooks.mjs.map +1 -1
- package/dist/application/transform/footer/document-footer.cjs +6 -3
- package/dist/application/transform/footer/document-footer.cjs.map +1 -1
- package/dist/application/transform/footer/document-footer.mjs +6 -3
- package/dist/application/transform/footer/document-footer.mjs.map +1 -1
- package/dist/application/transform/helper-types.cjs +3 -3
- package/dist/application/transform/helper-types.cjs.map +1 -1
- package/dist/application/transform/helper-types.mjs +3 -3
- package/dist/application/transform/helper-types.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
- package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
- package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
- package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
- package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
- package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
- package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
- package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
- package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
- package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
- package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
- package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
- package/dist/application/transform/schema/access-flags.cjs.map +1 -1
- package/dist/application/transform/schema/access-flags.mjs.map +1 -1
- package/dist/application/transform/schema/index-signature-type.cjs +21 -0
- package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
- package/dist/application/transform/schema/index-signature-type.mjs +19 -0
- package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
- package/dist/application/transform/schema/input-location.cjs +23 -0
- package/dist/application/transform/schema/input-location.cjs.map +1 -0
- package/dist/application/transform/schema/input-location.mjs +21 -0
- package/dist/application/transform/schema/input-location.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +15 -5
- package/dist/application/transform/schema/object-type.cjs.map +1 -1
- package/dist/application/transform/schema/object-type.mjs +15 -5
- package/dist/application/transform/schema/object-type.mjs.map +1 -1
- package/dist/application/transform/schema/schema-transform.cjs +2 -1
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
- package/dist/application/transform/schema/schema-transform.mjs +2 -1
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
- package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
- package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
- package/dist/cli/api-logger.cjs +13 -0
- package/dist/cli/api-logger.cjs.map +1 -0
- package/dist/cli/api-logger.mjs +11 -0
- package/dist/cli/api-logger.mjs.map +1 -0
- package/dist/cli/api-settings.cjs +7 -15
- package/dist/cli/api-settings.cjs.map +1 -1
- package/dist/cli/api-settings.mjs +8 -16
- package/dist/cli/api-settings.mjs.map +1 -1
- package/dist/cli/cli-arguments.cjs +51 -11
- package/dist/cli/cli-arguments.cjs.map +1 -1
- package/dist/cli/cli-arguments.mjs +51 -11
- package/dist/cli/cli-arguments.mjs.map +1 -1
- package/dist/cli/cli-errors.cjs +17 -0
- package/dist/cli/cli-errors.cjs.map +1 -1
- package/dist/cli/cli-errors.mjs +17 -1
- package/dist/cli/cli-errors.mjs.map +1 -1
- package/dist/cli/cli-output.cjs +6 -4
- package/dist/cli/cli-output.cjs.map +1 -1
- package/dist/cli/cli-output.mjs +7 -5
- package/dist/cli/cli-output.mjs.map +1 -1
- package/dist/cli/main.cjs +10 -4
- package/dist/cli/main.cjs.map +1 -1
- package/dist/cli/main.mjs +10 -4
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/redocly-apis.cjs +20 -9
- package/dist/cli/redocly-apis.cjs.map +1 -1
- package/dist/cli/redocly-apis.mjs +22 -11
- package/dist/cli/redocly-apis.mjs.map +1 -1
- package/dist/cli/ref-limits.cjs +15 -1
- package/dist/cli/ref-limits.cjs.map +1 -1
- package/dist/cli/ref-limits.mjs +15 -2
- package/dist/cli/ref-limits.mjs.map +1 -1
- package/dist/cli/run-cli.cjs +24 -7
- package/dist/cli/run-cli.cjs.map +1 -1
- package/dist/cli/run-cli.mjs +25 -8
- package/dist/cli/run-cli.mjs.map +1 -1
- package/dist/domain/cause-secrets.cjs +31 -16
- package/dist/domain/cause-secrets.cjs.map +1 -1
- package/dist/domain/cause-secrets.mjs +31 -16
- package/dist/domain/cause-secrets.mjs.map +1 -1
- package/dist/domain/errors.cjs +2 -0
- package/dist/domain/errors.cjs.map +1 -1
- package/dist/domain/errors.mjs +2 -0
- package/dist/domain/errors.mjs.map +1 -1
- package/dist/domain/location-text.cjs +9 -0
- package/dist/domain/location-text.cjs.map +1 -0
- package/dist/domain/location-text.mjs +7 -0
- package/dist/domain/location-text.mjs.map +1 -0
- package/dist/domain/openapi/document-places.cjs +55 -0
- package/dist/domain/openapi/document-places.cjs.map +1 -0
- package/dist/domain/openapi/document-places.mjs +53 -0
- package/dist/domain/openapi/document-places.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +8 -2
- package/dist/domain/output-fixes.cjs.map +1 -1
- package/dist/domain/output-fixes.mjs +8 -2
- package/dist/domain/output-fixes.mjs.map +1 -1
- package/dist/domain/terminal-text.cjs +31 -0
- package/dist/domain/terminal-text.cjs.map +1 -0
- package/dist/domain/terminal-text.mjs +29 -0
- package/dist/domain/terminal-text.mjs.map +1 -0
- package/dist/domain/warnings.cjs +1 -0
- package/dist/domain/warnings.cjs.map +1 -1
- package/dist/domain/warnings.mjs +1 -0
- package/dist/domain/warnings.mjs.map +1 -1
- package/dist/index.d.cts +26 -18
- package/dist/index.d.mts +26 -18
- package/dist/index.d.ts +26 -18
- package/package.json +1 -1
- package/src/adapters/node-file-system/node-file-system.ts +14 -1
- package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
- package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
- package/src/adapters/redocly-loader/component-schemas.ts +19 -0
- package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
- package/src/adapters/redocly-loader/query-named-components.ts +201 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +46 -14
- package/src/adapters/redocly-loader/ref-access.ts +16 -3
- package/src/adapters/redocly-loader/ref-holders.ts +75 -14
- package/src/adapters/redocly-loader/remote-fetch.ts +11 -2
- package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
- package/src/adapters/redocly-loader/schema-source.ts +15 -3
- package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
- package/src/api/document-refs.ts +29 -1
- package/src/api/document-run.ts +6 -16
- package/src/api/openapi-ts.ts +6 -3
- package/src/api/ref-limit-options.ts +76 -0
- package/src/api/transform-schema.ts +20 -5
- package/src/application/ports/file-system.ts +8 -0
- package/src/application/transform/declared-value-types.ts +42 -0
- package/src/application/transform/document/document.ts +4 -2
- package/src/application/transform/document/exploded-query-values.ts +88 -0
- package/src/application/transform/document/header.ts +25 -5
- package/src/application/transform/document/parameter.ts +4 -4
- package/src/application/transform/document/parameters.ts +45 -10
- package/src/application/transform/document/path-item.ts +3 -3
- package/src/application/transform/document/path-template-key.ts +152 -0
- package/src/application/transform/document/path-template-refs.ts +106 -0
- package/src/application/transform/document/paths-enum.ts +23 -9
- package/src/application/transform/document/paths.ts +53 -123
- package/src/application/transform/document/webhooks.ts +18 -5
- package/src/application/transform/footer/document-footer.ts +18 -8
- package/src/application/transform/helper-types.ts +4 -4
- package/src/application/transform/ref-pointer/generated-location.ts +1 -1
- package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
- package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
- package/src/application/transform/ref-pointer/located-node.ts +38 -0
- package/src/application/transform/ref-pointer/original-index.ts +100 -17
- package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
- package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
- package/src/application/transform/ref-pointer/property-shape.ts +97 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
- package/src/application/transform/schema/access-flags.ts +5 -2
- package/src/application/transform/schema/index-signature-type.ts +31 -0
- package/src/application/transform/schema/input-location.ts +35 -0
- package/src/application/transform/schema/object-type.ts +18 -8
- package/src/application/transform/schema/schema-transform.ts +2 -1
- package/src/application/transform/schema/unevaluated-properties.ts +4 -44
- package/src/cli/api-logger.ts +17 -0
- package/src/cli/api-settings.ts +12 -20
- package/src/cli/cli-arguments.ts +90 -14
- package/src/cli/cli-dependencies.ts +7 -2
- package/src/cli/cli-errors.ts +22 -0
- package/src/cli/cli-output.ts +11 -10
- package/src/cli/main.ts +10 -4
- package/src/cli/redocly-apis.ts +37 -17
- package/src/cli/ref-limits.ts +21 -2
- package/src/cli/run-cli.ts +39 -7
- package/src/domain/cause-secrets.ts +59 -25
- package/src/domain/errors.ts +2 -0
- package/src/domain/location-text.ts +12 -0
- package/src/domain/openapi/document-places.ts +78 -0
- package/src/domain/output-fixes.ts +9 -2
- package/src/domain/terminal-text.ts +44 -0
- package/src/domain/warnings.ts +1 -0
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const colors = require('ansi-colors');
|
|
4
|
+
const terminalText = require('../../domain/terminal-text.cjs');
|
|
4
5
|
const urlSecrets = require('../../domain/url-secrets.cjs');
|
|
5
6
|
|
|
6
7
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
7
8
|
|
|
8
9
|
const colors__default = /*#__PURE__*/_interopDefaultCompat(colors);
|
|
9
10
|
|
|
11
|
+
function shownText(message) {
|
|
12
|
+
return terminalText.terminalSafeText(urlSecrets.redactUrlSecrets(message));
|
|
13
|
+
}
|
|
10
14
|
const MILLISECONDS_PER_SECOND = 1e3;
|
|
11
15
|
const MILLISECONDS_PER_MINUTE = 6e4;
|
|
12
16
|
function formatDuration(milliseconds) {
|
|
@@ -47,17 +51,17 @@ class TerminalLogger {
|
|
|
47
51
|
}
|
|
48
52
|
const name = groupColor(this.#palette, group)(`openapi-ts:${group ?? "info"}`);
|
|
49
53
|
const time = durationMs === void 0 ? " " : this.#palette.green(` ${formatDuration(durationMs)} `);
|
|
50
|
-
const text =
|
|
54
|
+
const text = shownText(message);
|
|
51
55
|
this.#options.sink.debug(` ${this.#palette.bold(name)}${time}${text}`);
|
|
52
56
|
}
|
|
53
57
|
warn(message) {
|
|
54
58
|
if (!this.#options.silent) {
|
|
55
|
-
this.#options.sink.warn(this.#palette.yellow(` \u26A0 ${
|
|
59
|
+
this.#options.sink.warn(this.#palette.yellow(` \u26A0 ${shownText(message)}`));
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
62
|
error(message) {
|
|
59
63
|
if (!this.#options.silent) {
|
|
60
|
-
this.#options.sink.error(this.#palette.red(` \u2718 ${
|
|
64
|
+
this.#options.sink.error(this.#palette.red(` \u2718 ${shownText(message)}`));
|
|
61
65
|
}
|
|
62
66
|
}
|
|
63
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-logger.cjs","sources":["../../../src/adapters/terminal-logger/terminal-logger.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport type { DebugGroup, Logger } from \"../../application/ports/logger.js\";\nimport { redactUrlSecrets } from \"../../domain/url-secrets.js\";\n\n/**\n * The Logger port on a terminal, with the original output format: ` ⚠ ` warnings, ` ✘ `\n * errors, and `openapi-ts:<group>` debug lines filtered by `DEBUG` (ENGINEERING_PLAN 4.5). No\n * line shows the
|
|
1
|
+
{"version":3,"file":"terminal-logger.cjs","sources":["../../../src/adapters/terminal-logger/terminal-logger.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport type { DebugGroup, Logger } from \"../../application/ports/logger.js\";\nimport { terminalSafeText } from \"../../domain/terminal-text.js\";\nimport { redactUrlSecrets } from \"../../domain/url-secrets.js\";\n\n/**\n * The Logger port on a terminal, with the original output format: ` ⚠ ` warnings, ` ✘ `\n * errors, and `openapi-ts:<group>` debug lines filtered by `DEBUG` (ENGINEERING_PLAN 4.5). No\n * line shows the secrets of a URL, and each message prints as one line: a message quotes the\n * document, whose control characters could forge CI commands (terminal-text.ts).\n */\n\nfunction shownText(message: string): string {\n return terminalSafeText(redactUrlSecrets(message));\n}\n\n/** Where the lines go: `console` in production, a recording sink in tests. */\nexport interface TerminalSink {\n debug(line: string): void;\n warn(line: string): void;\n error(line: string): void;\n}\n\nexport interface TerminalLoggerOptions {\n /**\n * Drop warnings and error lines; debug lines, which `DEBUG` asks for, are still written. The\n * error lines are the problems of a document that fails to load, which the thrown error lists.\n */\n readonly silent: boolean;\n /** The value of `DEBUG`: `*`, `openapi-ts:*` or `openapi-ts:<group>` turn debug lines on. */\n readonly debugFilter: string | undefined;\n readonly useColors: boolean;\n readonly sink: TerminalSink;\n}\n\ntype Colors = ReturnType<typeof colors.create>;\n\nconst MILLISECONDS_PER_SECOND = 1000;\nconst MILLISECONDS_PER_MINUTE = 60_000;\n\n/** A duration as the original prints it: one decimal, in ms, s or m. */\nexport function formatDuration(milliseconds: number): string {\n if (milliseconds < MILLISECONDS_PER_SECOND) {\n return `${Math.round(10 * milliseconds) / 10}ms`;\n }\n if (milliseconds < MILLISECONDS_PER_MINUTE) {\n return `${Math.round(milliseconds / 100) / 10}s`;\n }\n return `${Math.round(milliseconds / 6000) / 10}m`;\n}\n\nfunction groupColor(palette: Colors, group: DebugGroup | undefined): (text: string) => string {\n const byGroup: Readonly<Partial<Record<DebugGroup, (text: string) => string>>> = {\n redoc: palette.cyanBright,\n lint: palette.yellowBright,\n bundle: palette.magentaBright,\n ts: palette.blueBright,\n };\n return (group && byGroup[group]) || palette.whiteBright;\n}\n\n/** Whether `DEBUG` asks for this group (the original check, case-insensitive for the group). */\nexport function isDebugEnabled(filter: string | undefined, group: DebugGroup | undefined): boolean {\n if (!filter) {\n return false;\n }\n return (\n !group ||\n filter === \"*\" ||\n filter === \"openapi-ts:*\" ||\n filter.toLocaleLowerCase() === `openapi-ts:${group.toLocaleLowerCase()}`\n );\n}\n\nclass TerminalLogger implements Logger {\n readonly #options: TerminalLoggerOptions;\n readonly #palette: Colors;\n\n constructor(options: TerminalLoggerOptions) {\n this.#options = options;\n this.#palette = colors.create();\n this.#palette.enabled = options.useColors;\n }\n\n debug(message: string, group?: DebugGroup, durationMs?: number): void {\n if (!isDebugEnabled(this.#options.debugFilter, group)) {\n return;\n }\n const name = groupColor(this.#palette, group)(`openapi-ts:${group ?? \"info\"}`);\n // The original wrote no space without a duration (`openapi-ts:lintIgnored …`).\n const time =\n durationMs === undefined ? \" \" : this.#palette.green(` ${formatDuration(durationMs)} `);\n const text = shownText(message);\n this.#options.sink.debug(` ${this.#palette.bold(name)}${time}${text}`);\n }\n\n warn(message: string): void {\n if (!this.#options.silent) {\n this.#options.sink.warn(this.#palette.yellow(` ⚠ ${shownText(message)}`));\n }\n }\n\n error(message: string): void {\n if (!this.#options.silent) {\n this.#options.sink.error(this.#palette.red(` ✘ ${shownText(message)}`));\n }\n }\n}\n\n/** A Logger that writes to a terminal sink. */\nexport function createTerminalLogger(options: TerminalLoggerOptions): Logger {\n return new TerminalLogger(options);\n}\n"],"names":["terminalSafeText","redactUrlSecrets","colors"],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import colors from 'ansi-colors';
|
|
2
|
+
import { terminalSafeText } from '../../domain/terminal-text.mjs';
|
|
2
3
|
import { redactUrlSecrets } from '../../domain/url-secrets.mjs';
|
|
3
4
|
|
|
5
|
+
function shownText(message) {
|
|
6
|
+
return terminalSafeText(redactUrlSecrets(message));
|
|
7
|
+
}
|
|
4
8
|
const MILLISECONDS_PER_SECOND = 1e3;
|
|
5
9
|
const MILLISECONDS_PER_MINUTE = 6e4;
|
|
6
10
|
function formatDuration(milliseconds) {
|
|
@@ -41,17 +45,17 @@ class TerminalLogger {
|
|
|
41
45
|
}
|
|
42
46
|
const name = groupColor(this.#palette, group)(`openapi-ts:${group ?? "info"}`);
|
|
43
47
|
const time = durationMs === void 0 ? " " : this.#palette.green(` ${formatDuration(durationMs)} `);
|
|
44
|
-
const text =
|
|
48
|
+
const text = shownText(message);
|
|
45
49
|
this.#options.sink.debug(` ${this.#palette.bold(name)}${time}${text}`);
|
|
46
50
|
}
|
|
47
51
|
warn(message) {
|
|
48
52
|
if (!this.#options.silent) {
|
|
49
|
-
this.#options.sink.warn(this.#palette.yellow(` \u26A0 ${
|
|
53
|
+
this.#options.sink.warn(this.#palette.yellow(` \u26A0 ${shownText(message)}`));
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
56
|
error(message) {
|
|
53
57
|
if (!this.#options.silent) {
|
|
54
|
-
this.#options.sink.error(this.#palette.red(` \u2718 ${
|
|
58
|
+
this.#options.sink.error(this.#palette.red(` \u2718 ${shownText(message)}`));
|
|
55
59
|
}
|
|
56
60
|
}
|
|
57
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-logger.mjs","sources":["../../../src/adapters/terminal-logger/terminal-logger.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport type { DebugGroup, Logger } from \"../../application/ports/logger.js\";\nimport { redactUrlSecrets } from \"../../domain/url-secrets.js\";\n\n/**\n * The Logger port on a terminal, with the original output format: ` ⚠ ` warnings, ` ✘ `\n * errors, and `openapi-ts:<group>` debug lines filtered by `DEBUG` (ENGINEERING_PLAN 4.5). No\n * line shows the
|
|
1
|
+
{"version":3,"file":"terminal-logger.mjs","sources":["../../../src/adapters/terminal-logger/terminal-logger.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport type { DebugGroup, Logger } from \"../../application/ports/logger.js\";\nimport { terminalSafeText } from \"../../domain/terminal-text.js\";\nimport { redactUrlSecrets } from \"../../domain/url-secrets.js\";\n\n/**\n * The Logger port on a terminal, with the original output format: ` ⚠ ` warnings, ` ✘ `\n * errors, and `openapi-ts:<group>` debug lines filtered by `DEBUG` (ENGINEERING_PLAN 4.5). No\n * line shows the secrets of a URL, and each message prints as one line: a message quotes the\n * document, whose control characters could forge CI commands (terminal-text.ts).\n */\n\nfunction shownText(message: string): string {\n return terminalSafeText(redactUrlSecrets(message));\n}\n\n/** Where the lines go: `console` in production, a recording sink in tests. */\nexport interface TerminalSink {\n debug(line: string): void;\n warn(line: string): void;\n error(line: string): void;\n}\n\nexport interface TerminalLoggerOptions {\n /**\n * Drop warnings and error lines; debug lines, which `DEBUG` asks for, are still written. The\n * error lines are the problems of a document that fails to load, which the thrown error lists.\n */\n readonly silent: boolean;\n /** The value of `DEBUG`: `*`, `openapi-ts:*` or `openapi-ts:<group>` turn debug lines on. */\n readonly debugFilter: string | undefined;\n readonly useColors: boolean;\n readonly sink: TerminalSink;\n}\n\ntype Colors = ReturnType<typeof colors.create>;\n\nconst MILLISECONDS_PER_SECOND = 1000;\nconst MILLISECONDS_PER_MINUTE = 60_000;\n\n/** A duration as the original prints it: one decimal, in ms, s or m. */\nexport function formatDuration(milliseconds: number): string {\n if (milliseconds < MILLISECONDS_PER_SECOND) {\n return `${Math.round(10 * milliseconds) / 10}ms`;\n }\n if (milliseconds < MILLISECONDS_PER_MINUTE) {\n return `${Math.round(milliseconds / 100) / 10}s`;\n }\n return `${Math.round(milliseconds / 6000) / 10}m`;\n}\n\nfunction groupColor(palette: Colors, group: DebugGroup | undefined): (text: string) => string {\n const byGroup: Readonly<Partial<Record<DebugGroup, (text: string) => string>>> = {\n redoc: palette.cyanBright,\n lint: palette.yellowBright,\n bundle: palette.magentaBright,\n ts: palette.blueBright,\n };\n return (group && byGroup[group]) || palette.whiteBright;\n}\n\n/** Whether `DEBUG` asks for this group (the original check, case-insensitive for the group). */\nexport function isDebugEnabled(filter: string | undefined, group: DebugGroup | undefined): boolean {\n if (!filter) {\n return false;\n }\n return (\n !group ||\n filter === \"*\" ||\n filter === \"openapi-ts:*\" ||\n filter.toLocaleLowerCase() === `openapi-ts:${group.toLocaleLowerCase()}`\n );\n}\n\nclass TerminalLogger implements Logger {\n readonly #options: TerminalLoggerOptions;\n readonly #palette: Colors;\n\n constructor(options: TerminalLoggerOptions) {\n this.#options = options;\n this.#palette = colors.create();\n this.#palette.enabled = options.useColors;\n }\n\n debug(message: string, group?: DebugGroup, durationMs?: number): void {\n if (!isDebugEnabled(this.#options.debugFilter, group)) {\n return;\n }\n const name = groupColor(this.#palette, group)(`openapi-ts:${group ?? \"info\"}`);\n // The original wrote no space without a duration (`openapi-ts:lintIgnored …`).\n const time =\n durationMs === undefined ? \" \" : this.#palette.green(` ${formatDuration(durationMs)} `);\n const text = shownText(message);\n this.#options.sink.debug(` ${this.#palette.bold(name)}${time}${text}`);\n }\n\n warn(message: string): void {\n if (!this.#options.silent) {\n this.#options.sink.warn(this.#palette.yellow(` ⚠ ${shownText(message)}`));\n }\n }\n\n error(message: string): void {\n if (!this.#options.silent) {\n this.#options.sink.error(this.#palette.red(` ✘ ${shownText(message)}`));\n }\n }\n}\n\n/** A Logger that writes to a terminal sink. */\nexport function createTerminalLogger(options: TerminalLoggerOptions): Logger {\n return new TerminalLogger(options);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,21 @@ const defaultPorts = require('./default-ports.cjs');
|
|
|
7
7
|
function isObject(value) {
|
|
8
8
|
return typeof value === "object" && value !== null;
|
|
9
9
|
}
|
|
10
|
+
function childOf(schema, node, key, options) {
|
|
11
|
+
if (!isObject(node)) {
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
const { visited = [] } = options;
|
|
15
|
+
const target = node.$ref;
|
|
16
|
+
if (node[key] || typeof target !== "string" || visited.includes(target)) {
|
|
17
|
+
return node[key];
|
|
18
|
+
}
|
|
19
|
+
const resolved = resolveDocumentRef(schema, target, {
|
|
20
|
+
...options,
|
|
21
|
+
visited: [...visited, target]
|
|
22
|
+
});
|
|
23
|
+
return isObject(resolved) ? resolved[key] : void 0;
|
|
24
|
+
}
|
|
10
25
|
function resolveDocumentRef(schema, $ref, options) {
|
|
11
26
|
const { visited = [] } = options;
|
|
12
27
|
const logger = options.logger ?? defaultPorts.defaultLogger(options.silent ?? false);
|
|
@@ -16,7 +31,7 @@ function resolveDocumentRef(schema, $ref, options) {
|
|
|
16
31
|
}
|
|
17
32
|
let node = schema;
|
|
18
33
|
for (const key of pointer) {
|
|
19
|
-
const child =
|
|
34
|
+
const child = childOf(schema, node, key, { ...options, logger });
|
|
20
35
|
if (!child) {
|
|
21
36
|
logger.warn(warnings.warningText(`Could not resolve $ref "${$ref}"`, warnings.WARNING_CODES.REF_NOT_FOUND));
|
|
22
37
|
return void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-refs.cjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child =
|
|
1
|
+
{"version":3,"file":"document-refs.cjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * The child of a node under a pointer key. A pointer may pass through a `$ref`\n * (`#/components/schemas/Wrap/properties/o/properties/v`, where `o` is a `$ref`): a key the node\n * does not have is read from the node's target, as the generated types index it (ADR-026). A key\n * the node has is read from it, so a pointer to a sibling of a `$ref` (OpenAPI 3.1) stays as\n * written.\n */\nfunction childOf(\n schema: unknown,\n node: unknown,\n key: string,\n options: ResolveRefOptions & { logger: Logger },\n): unknown {\n if (!isObject(node)) {\n return undefined;\n }\n const { visited = [] } = options;\n const target = node.$ref;\n if (node[key] || typeof target !== \"string\" || visited.includes(target)) {\n return node[key];\n }\n const resolved = resolveDocumentRef(schema, target, {\n ...options,\n visited: [...visited, target],\n });\n return isObject(resolved) ? resolved[key] : undefined;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child = childOf(schema, node, key, { ...options, logger });\n if (!child) {\n logger.warn(warningText(`Could not resolve $ref \"${$ref}\"`, WARNING_CODES.REF_NOT_FOUND));\n return undefined;\n }\n node = child;\n }\n\n // if this is also a $ref, keep tracing\n const next = isObject(node) ? node.$ref : undefined;\n if (typeof next === \"string\" && next) {\n if (visited.includes(next)) {\n logger.warn(\n warningText(`Could not resolve circular $ref \"${$ref}\"`, WARNING_CODES.REF_CIRCULAR),\n );\n return undefined;\n }\n return resolveDocumentRef(schema, next, { ...options, logger, visited: [...visited, next] });\n }\n\n return node as T;\n}\n\n/** Call `cb` for every object in a JSON-serializable (non-circular) value, depth first. */\nexport function walkDocument(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n walkDocument(obj[i], cb, path.concat(i));\n }\n return;\n }\n cb(obj as Record<string, unknown>, path);\n for (const k of Object.keys(obj)) {\n walkDocument((obj as Record<string, unknown>)[k], cb, path.concat(k));\n }\n}\n"],"names":["defaultLogger","parseRef","warningText","WARNING_CODES"],"mappings":"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"}
|
|
@@ -5,6 +5,21 @@ import { defaultLogger } from './default-ports.mjs';
|
|
|
5
5
|
function isObject(value) {
|
|
6
6
|
return typeof value === "object" && value !== null;
|
|
7
7
|
}
|
|
8
|
+
function childOf(schema, node, key, options) {
|
|
9
|
+
if (!isObject(node)) {
|
|
10
|
+
return void 0;
|
|
11
|
+
}
|
|
12
|
+
const { visited = [] } = options;
|
|
13
|
+
const target = node.$ref;
|
|
14
|
+
if (node[key] || typeof target !== "string" || visited.includes(target)) {
|
|
15
|
+
return node[key];
|
|
16
|
+
}
|
|
17
|
+
const resolved = resolveDocumentRef(schema, target, {
|
|
18
|
+
...options,
|
|
19
|
+
visited: [...visited, target]
|
|
20
|
+
});
|
|
21
|
+
return isObject(resolved) ? resolved[key] : void 0;
|
|
22
|
+
}
|
|
8
23
|
function resolveDocumentRef(schema, $ref, options) {
|
|
9
24
|
const { visited = [] } = options;
|
|
10
25
|
const logger = options.logger ?? defaultLogger(options.silent ?? false);
|
|
@@ -14,7 +29,7 @@ function resolveDocumentRef(schema, $ref, options) {
|
|
|
14
29
|
}
|
|
15
30
|
let node = schema;
|
|
16
31
|
for (const key of pointer) {
|
|
17
|
-
const child =
|
|
32
|
+
const child = childOf(schema, node, key, { ...options, logger });
|
|
18
33
|
if (!child) {
|
|
19
34
|
logger.warn(warningText(`Could not resolve $ref "${$ref}"`, WARNING_CODES.REF_NOT_FOUND));
|
|
20
35
|
return void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-refs.mjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child =
|
|
1
|
+
{"version":3,"file":"document-refs.mjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * The child of a node under a pointer key. A pointer may pass through a `$ref`\n * (`#/components/schemas/Wrap/properties/o/properties/v`, where `o` is a `$ref`): a key the node\n * does not have is read from the node's target, as the generated types index it (ADR-026). A key\n * the node has is read from it, so a pointer to a sibling of a `$ref` (OpenAPI 3.1) stays as\n * written.\n */\nfunction childOf(\n schema: unknown,\n node: unknown,\n key: string,\n options: ResolveRefOptions & { logger: Logger },\n): unknown {\n if (!isObject(node)) {\n return undefined;\n }\n const { visited = [] } = options;\n const target = node.$ref;\n if (node[key] || typeof target !== \"string\" || visited.includes(target)) {\n return node[key];\n }\n const resolved = resolveDocumentRef(schema, target, {\n ...options,\n visited: [...visited, target],\n });\n return isObject(resolved) ? resolved[key] : undefined;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child = childOf(schema, node, key, { ...options, logger });\n if (!child) {\n logger.warn(warningText(`Could not resolve $ref \"${$ref}\"`, WARNING_CODES.REF_NOT_FOUND));\n return undefined;\n }\n node = child;\n }\n\n // if this is also a $ref, keep tracing\n const next = isObject(node) ? node.$ref : undefined;\n if (typeof next === \"string\" && next) {\n if (visited.includes(next)) {\n logger.warn(\n warningText(`Could not resolve circular $ref \"${$ref}\"`, WARNING_CODES.REF_CIRCULAR),\n );\n return undefined;\n }\n return resolveDocumentRef(schema, next, { ...options, logger, visited: [...visited, next] });\n }\n\n return node as T;\n}\n\n/** Call `cb` for every object in a JSON-serializable (non-circular) value, depth first. */\nexport function walkDocument(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n walkDocument(obj[i], cb, path.concat(i));\n }\n return;\n }\n cb(obj as Record<string, unknown>, path);\n for (const k of Object.keys(obj)) {\n walkDocument((obj as Record<string, unknown>)[k], cb, path.concat(k));\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ const discriminatorConflictWarnings = require('./discriminator-conflict-warnings
|
|
|
11
11
|
const discriminatorScan = require('./discriminator-scan.cjs');
|
|
12
12
|
const documentRefs = require('./document-refs.cjs');
|
|
13
13
|
const pathTemplateWarnings = require('./path-template-warnings.cjs');
|
|
14
|
+
const refLimitOptions = require('./ref-limit-options.cjs');
|
|
14
15
|
const unsupportedFeatureWarnings = require('./unsupported-feature-warnings.cjs');
|
|
15
16
|
|
|
16
17
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
@@ -25,14 +26,6 @@ function sourceCwd(options) {
|
|
|
25
26
|
const directory = path__default.resolve(cwd === void 0 ? defaultPorts.processCwd() : cwd.toString());
|
|
26
27
|
return node_url.pathToFileURL(path__default.join(directory, path__default.sep));
|
|
27
28
|
}
|
|
28
|
-
function refAccessOf(options, cwd) {
|
|
29
|
-
const { localRefRoot, remoteRefHosts } = options;
|
|
30
|
-
const localRoot = typeof localRefRoot === "string" ? node_url.pathToFileURL(path__default.resolve(node_url.fileURLToPath(cwd), localRefRoot)) : localRefRoot;
|
|
31
|
-
return {
|
|
32
|
-
...localRoot === void 0 ? {} : { localRoot },
|
|
33
|
-
...remoteRefHosts === void 0 ? {} : { remoteHosts: remoteRefHosts }
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
29
|
function callbackOptions(options) {
|
|
37
30
|
return {
|
|
38
31
|
irCallbacks: options.irCallbacks === true,
|
|
@@ -71,7 +64,8 @@ function contextFlags(options) {
|
|
|
71
64
|
}
|
|
72
65
|
function outputFixesOf(options, logger) {
|
|
73
66
|
const names = outputFixes.outputFixNamesOf(options.fix ?? []);
|
|
74
|
-
|
|
67
|
+
const flags = contextFlags(options);
|
|
68
|
+
for (const notice of outputFixes.ineffectiveFixNotices(names, (option) => flags[option])) {
|
|
75
69
|
logger.warn(warnings.warningText(notice, warnings.WARNING_CODES.FIX_NEEDS_OPTION));
|
|
76
70
|
}
|
|
77
71
|
return [...outputFixes.resolveOutputFixes(names)];
|
|
@@ -96,7 +90,7 @@ async function createDocumentRun(source, options, ports) {
|
|
|
96
90
|
source,
|
|
97
91
|
cwd,
|
|
98
92
|
shouldLint: options.lint ?? true,
|
|
99
|
-
refAccess: refAccessOf(options, cwd)
|
|
93
|
+
refAccess: refLimitOptions.refAccessOf(options, cwd)
|
|
100
94
|
});
|
|
101
95
|
warnAboutDocument(schema, fix, logger);
|
|
102
96
|
const ctx = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-run.cjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { RefAccess, SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document, the local files it was read from, and the run's context. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly localFiles: readonly URL[];\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\n/** The `$ref` limits of the options; a relative local root resolves against the cwd. */\nfunction refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n const localRoot =\n typeof localRefRoot === \"string\"\n ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot))\n : localRefRoot;\n return {\n ...(localRoot === undefined ? {} : { localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteRefHosts }),\n };\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n for (const notice of ineffectiveFixNotices(names, (option) => options[option] === true)) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const { document: schema, localFiles } = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, localFiles, ctx };\n}\n"],"names":["path","processCwd","pathToFileURL","fileURLToPath","outputFixNamesOf","ineffectiveFixNotices","warningText","WARNING_CODES","resolveOutputFixes","withStackOverflowReported","warnUnsupportedFeatures","warnDiscriminatorValueConflicts","warnIdenticalPathTemplates","sourceEmptyError","findDiscriminators","resolveDocumentRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-run.cjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport { refAccessOf } from \"./ref-limit-options.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document, the local files it was read from, and the run's context. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly localFiles: readonly URL[];\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n // The options with their defaults: `defaultNonNullable` is on unless set to false.\n const flags = contextFlags(options);\n for (const notice of ineffectiveFixNotices(names, (option) => flags[option])) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const { document: schema, localFiles } = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, localFiles, ctx };\n}\n"],"names":["path","processCwd","pathToFileURL","outputFixNamesOf","ineffectiveFixNotices","warningText","WARNING_CODES","resolveOutputFixes","withStackOverflowReported","warnUnsupportedFeatures","warnDiscriminatorValueConflicts","warnIdenticalPathTemplates","sourceEmptyError","refAccessOf","findDiscriminators","resolveDocumentRef"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { pathToFileURL
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
3
|
import { sourceEmptyError } from '../adapters/redocly-loader/schema-load-errors.mjs';
|
|
4
4
|
import { withStackOverflowReported } from '../application/stack-overflow.mjs';
|
|
5
5
|
import { outputFixNamesOf, ineffectiveFixNotices, resolveOutputFixes } from '../domain/output-fixes.mjs';
|
|
@@ -9,6 +9,7 @@ import { warnDiscriminatorValueConflicts } from './discriminator-conflict-warnin
|
|
|
9
9
|
import { findDiscriminators } from './discriminator-scan.mjs';
|
|
10
10
|
import { resolveDocumentRef } from './document-refs.mjs';
|
|
11
11
|
import { warnIdenticalPathTemplates } from './path-template-warnings.mjs';
|
|
12
|
+
import { refAccessOf } from './ref-limit-options.mjs';
|
|
12
13
|
import { warnUnsupportedFeatures } from './unsupported-feature-warnings.mjs';
|
|
13
14
|
|
|
14
15
|
function sourceCwd(options) {
|
|
@@ -19,14 +20,6 @@ function sourceCwd(options) {
|
|
|
19
20
|
const directory = path.resolve(cwd === void 0 ? processCwd() : cwd.toString());
|
|
20
21
|
return pathToFileURL(path.join(directory, path.sep));
|
|
21
22
|
}
|
|
22
|
-
function refAccessOf(options, cwd) {
|
|
23
|
-
const { localRefRoot, remoteRefHosts } = options;
|
|
24
|
-
const localRoot = typeof localRefRoot === "string" ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot)) : localRefRoot;
|
|
25
|
-
return {
|
|
26
|
-
...localRoot === void 0 ? {} : { localRoot },
|
|
27
|
-
...remoteRefHosts === void 0 ? {} : { remoteHosts: remoteRefHosts }
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
23
|
function callbackOptions(options) {
|
|
31
24
|
return {
|
|
32
25
|
irCallbacks: options.irCallbacks === true,
|
|
@@ -65,7 +58,8 @@ function contextFlags(options) {
|
|
|
65
58
|
}
|
|
66
59
|
function outputFixesOf(options, logger) {
|
|
67
60
|
const names = outputFixNamesOf(options.fix ?? []);
|
|
68
|
-
|
|
61
|
+
const flags = contextFlags(options);
|
|
62
|
+
for (const notice of ineffectiveFixNotices(names, (option) => flags[option])) {
|
|
69
63
|
logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));
|
|
70
64
|
}
|
|
71
65
|
return [...resolveOutputFixes(names)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-run.mjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { RefAccess, SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document, the local files it was read from, and the run's context. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly localFiles: readonly URL[];\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\n/** The `$ref` limits of the options; a relative local root resolves against the cwd. */\nfunction refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n const localRoot =\n typeof localRefRoot === \"string\"\n ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot))\n : localRefRoot;\n return {\n ...(localRoot === undefined ? {} : { localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteRefHosts }),\n };\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n for (const notice of ineffectiveFixNotices(names, (option) => options[option] === true)) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const { document: schema, localFiles } = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, localFiles, ctx };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-run.mjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport { refAccessOf } from \"./ref-limit-options.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document, the local files it was read from, and the run's context. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly localFiles: readonly URL[];\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n // The options with their defaults: `defaultNonNullable` is on unless set to false.\n const flags = contextFlags(options);\n for (const notice of ineffectiveFixNotices(names, (option) => flags[option])) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const { document: schema, localFiles } = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, localFiles, ctx };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/api/openapi-ts.cjs
CHANGED
|
@@ -22,8 +22,7 @@ async function generateDocument(source, options, ports) {
|
|
|
22
22
|
async function generateDeclarations(source, options, ports) {
|
|
23
23
|
return (await generateDocument(source, options, ports)).declarations;
|
|
24
24
|
}
|
|
25
|
-
async function defaultGeneratorPorts(options) {
|
|
26
|
-
const logger = defaultPorts.defaultLogger(options.silent ?? false);
|
|
25
|
+
async function defaultGeneratorPorts(options, logger = defaultPorts.defaultLogger(options.silent ?? false)) {
|
|
27
26
|
const redoc = options.redocly ?? await defaultPorts.defaultRedoclyConfig();
|
|
28
27
|
const loader = redoclySchemaLoader.createRedoclySchemaLoader({
|
|
29
28
|
redoc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-ts.cjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** The declarations of one document, and the local files it was read from. */\nexport interface GeneratedDocument {\n readonly declarations: IrDeclaration[];\n readonly localFiles: readonly URL[];\n}\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function generateDocument(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<GeneratedDocument> {\n const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);\n const startedAt = ports.now();\n const declarations = withStackOverflowReported(\"transform\", () => transformSchema(schema, ctx));\n ports.logger.debug(\n \"Completed AST transformation for entire document\",\n \"ts\",\n ports.now() - startedAt,\n );\n return { declarations, localFiles };\n}\n\n/** As `generateDocument`, the declarations only. */\nexport async function generateDeclarations(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<IrDeclaration[]> {\n return (await generateDocument(source, options, ports)).declarations;\n}\n\n/**\n * The default ports: the terminal logger, Node.js deprecation warnings, the given or default\n * Redocly config, Redocly loading.\n */\nexport async function defaultGeneratorPorts(options: GeneratorOptions
|
|
1
|
+
{"version":3,"file":"openapi-ts.cjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** The declarations of one document, and the local files it was read from. */\nexport interface GeneratedDocument {\n readonly declarations: IrDeclaration[];\n readonly localFiles: readonly URL[];\n}\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function generateDocument(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<GeneratedDocument> {\n const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);\n const startedAt = ports.now();\n const declarations = withStackOverflowReported(\"transform\", () => transformSchema(schema, ctx));\n ports.logger.debug(\n \"Completed AST transformation for entire document\",\n \"ts\",\n ports.now() - startedAt,\n );\n return { declarations, localFiles };\n}\n\n/** As `generateDocument`, the declarations only. */\nexport async function generateDeclarations(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<IrDeclaration[]> {\n return (await generateDocument(source, options, ports)).declarations;\n}\n\n/**\n * The default ports: the terminal logger, Node.js deprecation warnings, the given or default\n * Redocly config, Redocly loading. A given `logger` takes every line, the loader's included.\n */\nexport async function defaultGeneratorPorts(\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): Promise<GeneratorPorts> {\n const redoc = options.redocly ?? (await defaultRedoclyConfig());\n const loader = createRedoclySchemaLoader({\n redoc,\n logger,\n now: monotonicNow,\n remoteRefTimeoutMs: REMOTE_REF_TIMEOUT_MS,\n remoteDocumentLimits: DEFAULT_REMOTE_DOCUMENT_LIMITS,\n });\n return { loader, logger, deprecations: defaultDeprecationReporter(), redoc, now: monotonicNow };\n}\n\n/**\n * Convert an OpenAPI schema to TypeScript declarations (IR nodes; print them with `astToString`)\n * @param {string|URL|object|Readable} source OpenAPI schema source:\n * - YAML: string\n * - JSON: parsed object\n * - URL: URL to a YAML or JSON file (local or remote)\n * - Readable: Readable stream of YAML or JSON\n */\nexport default async function openapiTS(\n source: SchemaSource,\n options: GeneratorOptions = {},\n): Promise<IrDeclaration[]> {\n return generateDeclarations(source, options, await defaultGeneratorPorts(options));\n}\n"],"names":["createDocumentRun","withStackOverflowReported","transformSchema","defaultLogger","defaultRedoclyConfig","createRedoclySchemaLoader","monotonicNow","REMOTE_REF_TIMEOUT_MS","DEFAULT_REMOTE_DOCUMENT_LIMITS","defaultDeprecationReporter"],"mappings":";;;;;;;;;;AA4BA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,QAAQ,UAAA,EAAY,GAAA,KAAQ,MAAMA,6BAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAClF,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,EAAI;AAC5B,EAAA,MAAM,eAAeC,uCAAA,CAA0B,WAAA,EAAa,MAAMC,uBAAA,CAAgB,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC9F,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,IACX,kDAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,CAAM,KAAI,GAAI;AAAA,GAChB;AACA,EAAA,OAAO,EAAE,cAAc,UAAA,EAAW;AACpC;AAGA,eAAsB,oBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,OAAA,CAAQ,MAAM,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,EAAG,YAAA;AAC1D;AAMA,eAAsB,sBACpB,OAAA,EACA,MAAA,GAAiBC,2BAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA,EAC7B;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,IAAY,MAAMC,iCAAA,EAAqB;AAC7D,EAAA,MAAM,SAASC,6CAAA,CAA0B;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAKC,yBAAA;AAAA,IACL,kBAAA,EAAoBC,kCAAA;AAAA,IACpB,oBAAA,EAAsBC;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,YAAA,EAAcC,yCAA2B,EAAG,KAAA,EAAO,KAAKH,yBAAA,EAAa;AAChG;AAUA,eAA8B,SAAA,CAC5B,MAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,OAAO,qBAAqB,MAAA,EAAQ,OAAA,EAAS,MAAM,qBAAA,CAAsB,OAAO,CAAC,CAAA;AACnF;;;;;"}
|
package/dist/api/openapi-ts.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRedoclySchemaLoader } from '../adapters/redocly-loader/redocly-schema-loader.mjs';
|
|
2
2
|
import { withStackOverflowReported } from '../application/stack-overflow.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import { defaultRedoclyConfig, monotonicNow, defaultDeprecationReporter, defaultLogger, DEFAULT_REMOTE_DOCUMENT_LIMITS, REMOTE_REF_TIMEOUT_MS } from './default-ports.mjs';
|
|
4
4
|
import { createDocumentRun } from './document-run.mjs';
|
|
5
5
|
import transformSchema from './transform-schema.mjs';
|
|
6
6
|
|
|
@@ -18,8 +18,7 @@ async function generateDocument(source, options, ports) {
|
|
|
18
18
|
async function generateDeclarations(source, options, ports) {
|
|
19
19
|
return (await generateDocument(source, options, ports)).declarations;
|
|
20
20
|
}
|
|
21
|
-
async function defaultGeneratorPorts(options) {
|
|
22
|
-
const logger = defaultLogger(options.silent ?? false);
|
|
21
|
+
async function defaultGeneratorPorts(options, logger = defaultLogger(options.silent ?? false)) {
|
|
23
22
|
const redoc = options.redocly ?? await defaultRedoclyConfig();
|
|
24
23
|
const loader = createRedoclySchemaLoader({
|
|
25
24
|
redoc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-ts.mjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** The declarations of one document, and the local files it was read from. */\nexport interface GeneratedDocument {\n readonly declarations: IrDeclaration[];\n readonly localFiles: readonly URL[];\n}\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function generateDocument(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<GeneratedDocument> {\n const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);\n const startedAt = ports.now();\n const declarations = withStackOverflowReported(\"transform\", () => transformSchema(schema, ctx));\n ports.logger.debug(\n \"Completed AST transformation for entire document\",\n \"ts\",\n ports.now() - startedAt,\n );\n return { declarations, localFiles };\n}\n\n/** As `generateDocument`, the declarations only. */\nexport async function generateDeclarations(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<IrDeclaration[]> {\n return (await generateDocument(source, options, ports)).declarations;\n}\n\n/**\n * The default ports: the terminal logger, Node.js deprecation warnings, the given or default\n * Redocly config, Redocly loading.\n */\nexport async function defaultGeneratorPorts(options: GeneratorOptions
|
|
1
|
+
{"version":3,"file":"openapi-ts.mjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** The declarations of one document, and the local files it was read from. */\nexport interface GeneratedDocument {\n readonly declarations: IrDeclaration[];\n readonly localFiles: readonly URL[];\n}\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function generateDocument(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<GeneratedDocument> {\n const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);\n const startedAt = ports.now();\n const declarations = withStackOverflowReported(\"transform\", () => transformSchema(schema, ctx));\n ports.logger.debug(\n \"Completed AST transformation for entire document\",\n \"ts\",\n ports.now() - startedAt,\n );\n return { declarations, localFiles };\n}\n\n/** As `generateDocument`, the declarations only. */\nexport async function generateDeclarations(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<IrDeclaration[]> {\n return (await generateDocument(source, options, ports)).declarations;\n}\n\n/**\n * The default ports: the terminal logger, Node.js deprecation warnings, the given or default\n * Redocly config, Redocly loading. A given `logger` takes every line, the loader's included.\n */\nexport async function defaultGeneratorPorts(\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): Promise<GeneratorPorts> {\n const redoc = options.redocly ?? (await defaultRedoclyConfig());\n const loader = createRedoclySchemaLoader({\n redoc,\n logger,\n now: monotonicNow,\n remoteRefTimeoutMs: REMOTE_REF_TIMEOUT_MS,\n remoteDocumentLimits: DEFAULT_REMOTE_DOCUMENT_LIMITS,\n });\n return { loader, logger, deprecations: defaultDeprecationReporter(), redoc, now: monotonicNow };\n}\n\n/**\n * Convert an OpenAPI schema to TypeScript declarations (IR nodes; print them with `astToString`)\n * @param {string|URL|object|Readable} source OpenAPI schema source:\n * - YAML: string\n * - JSON: parsed object\n * - URL: URL to a YAML or JSON file (local or remote)\n * - Readable: Readable stream of YAML or JSON\n */\nexport default async function openapiTS(\n source: SchemaSource,\n options: GeneratorOptions = {},\n): Promise<IrDeclaration[]> {\n return generateDeclarations(source, options, await defaultGeneratorPorts(options));\n}\n"],"names":[],"mappings":";;;;;;AA4BA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,QAAQ,UAAA,EAAY,GAAA,KAAQ,MAAM,iBAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAClF,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,EAAI;AAC5B,EAAA,MAAM,eAAe,yBAAA,CAA0B,WAAA,EAAa,MAAM,eAAA,CAAgB,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC9F,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,IACX,kDAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,CAAM,KAAI,GAAI;AAAA,GAChB;AACA,EAAA,OAAO,EAAE,cAAc,UAAA,EAAW;AACpC;AAGA,eAAsB,oBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,OAAA,CAAQ,MAAM,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,EAAG,YAAA;AAC1D;AAMA,eAAsB,sBACpB,OAAA,EACA,MAAA,GAAiB,cAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA,EAC7B;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,IAAY,MAAM,oBAAA,EAAqB;AAC7D,EAAA,MAAM,SAAS,yBAAA,CAA0B;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAK,YAAA;AAAA,IACL,kBAAA,EAAoB,qBAAA;AAAA,IACpB,oBAAA,EAAsB;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,YAAA,EAAc,4BAA2B,EAAG,KAAA,EAAO,KAAK,YAAA,EAAa;AAChG;AAUA,eAA8B,SAAA,CAC5B,MAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,OAAO,qBAAqB,MAAA,EAAQ,OAAA,EAAS,MAAM,qBAAA,CAAsB,OAAO,CAAC,CAAA;AACnF;;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const node_url = require('node:url');
|
|
5
|
+
const errors = require('../domain/errors.cjs');
|
|
6
|
+
const locationText = require('../domain/location-text.cjs');
|
|
7
|
+
|
|
8
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
9
|
+
|
|
10
|
+
const path__default = /*#__PURE__*/_interopDefaultCompat(path);
|
|
11
|
+
|
|
12
|
+
const FILE_PROTOCOL = "file:";
|
|
13
|
+
function kindOf(value) {
|
|
14
|
+
if (value instanceof URL) {
|
|
15
|
+
return `a ${value.protocol} URL`;
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
return "a list";
|
|
19
|
+
}
|
|
20
|
+
return value === null ? "null" : `a ${typeof value}`;
|
|
21
|
+
}
|
|
22
|
+
function optionInvalid(option, expected, got) {
|
|
23
|
+
return new errors.OpenAPITypesafeError({
|
|
24
|
+
code: errors.ERROR_CODES.OPTION_INVALID,
|
|
25
|
+
message: `The ${option} option must be ${expected}; got ${got}.`,
|
|
26
|
+
details: { option }
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const LOCAL_ROOT_EXPECTED = "a directory path or a file: URL";
|
|
30
|
+
function localRootUrlOf(value, cwd) {
|
|
31
|
+
if (!locationText.hasUrlScheme(value)) {
|
|
32
|
+
return node_url.pathToFileURL(path__default.resolve(node_url.fileURLToPath(cwd), value));
|
|
33
|
+
}
|
|
34
|
+
return URL.parse(value, cwd.href) ?? void 0;
|
|
35
|
+
}
|
|
36
|
+
function localRootOf(value, cwd) {
|
|
37
|
+
const root = typeof value === "string" ? localRootUrlOf(value, cwd) : value;
|
|
38
|
+
if (root instanceof URL && root.protocol === FILE_PROTOCOL) {
|
|
39
|
+
return root;
|
|
40
|
+
}
|
|
41
|
+
const got = root === void 0 ? "a string that is no valid URL" : kindOf(root);
|
|
42
|
+
throw optionInvalid("localRefRoot", LOCAL_ROOT_EXPECTED, got);
|
|
43
|
+
}
|
|
44
|
+
function remoteHostsOf(value) {
|
|
45
|
+
if (!Array.isArray(value)) {
|
|
46
|
+
throw optionInvalid("remoteRefHosts", "a list of hosts", kindOf(value));
|
|
47
|
+
}
|
|
48
|
+
const other = value.find((entry) => typeof entry !== "string");
|
|
49
|
+
if (other !== void 0) {
|
|
50
|
+
throw optionInvalid("remoteRefHosts", "a list of hosts", `a list with ${kindOf(other)}`);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function refAccessOf(options, cwd) {
|
|
55
|
+
const { localRefRoot, remoteRefHosts } = options;
|
|
56
|
+
return {
|
|
57
|
+
...localRefRoot === void 0 ? {} : { localRoot: localRootOf(localRefRoot, cwd) },
|
|
58
|
+
...remoteRefHosts === void 0 ? {} : { remoteHosts: remoteHostsOf(remoteRefHosts) }
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
exports.refAccessOf = refAccessOf;
|
|
63
|
+
//# sourceMappingURL=ref-limit-options.cjs.map
|