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
|
@@ -3,31 +3,55 @@ import { redactUrlSecrets } from "./url-secrets.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* The `cause` of a typed error is shown wherever the error is: `console.error(error)` and
|
|
5
5
|
* `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the
|
|
6
|
-
* URL it failed on (fetch refuses `https://user:token@host/…` and quotes it),
|
|
7
|
-
*
|
|
6
|
+
* URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), and may keep it in
|
|
7
|
+
* nested objects too (Redocly's parse error holds `originalError.mark.name` and
|
|
8
|
+
* `source.absoluteRef`), so the chain must hide the same secrets as the message (url-secrets.ts)
|
|
9
|
+
* at every depth.
|
|
8
10
|
*/
|
|
9
11
|
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* How deep the walk copies a cause. The data of a cause is shallow (Redocly's deepest URL is three
|
|
14
|
+
* levels below the error); a value below this depth is dropped, so no secret is kept unread.
|
|
15
|
+
*/
|
|
16
|
+
const MAX_CAUSE_DEPTH = 8;
|
|
17
|
+
|
|
18
|
+
interface Walk {
|
|
19
|
+
/** The objects on the way from the cause to the value, so a cycle is cut where it closes. */
|
|
20
|
+
readonly path: ReadonlySet<object>;
|
|
21
|
+
readonly depth: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function deeper(walk: Walk, value: object): Walk {
|
|
25
|
+
return { path: new Set([...walk.path, value]), depth: walk.depth + 1 };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** An array with each item hidden, or the array itself when no item holds a secret. */
|
|
29
|
+
function redactedArray(array: readonly unknown[], walk: Walk): readonly unknown[] {
|
|
30
|
+
const inner = deeper(walk, array);
|
|
31
|
+
const items = array.map((item) => redactedValue(item, inner));
|
|
32
|
+
return items.every((item, index) => item === array[index]) ? array : items;
|
|
13
33
|
}
|
|
14
34
|
|
|
15
35
|
/**
|
|
16
|
-
* A copy of `
|
|
17
|
-
* nested `cause`) with URL secrets hidden, or `
|
|
18
|
-
* property is read through its getter (V8 keeps `stack` behind one) and
|
|
36
|
+
* A copy of `value` with the same prototype, its own properties (`message`, `stack`, `code`,
|
|
37
|
+
* `input`, a nested `cause` or object) with URL secrets hidden, or `value` itself when none of
|
|
38
|
+
* them holds one. Each property is read through its getter (V8 keeps `stack` behind one) and
|
|
39
|
+
* copied as a value.
|
|
19
40
|
*/
|
|
20
|
-
function
|
|
21
|
-
const inner =
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
const copy =
|
|
41
|
+
function redactedObject(value: object, walk: Walk): object {
|
|
42
|
+
const inner = deeper(walk, value);
|
|
43
|
+
// An error is copied as a real error, so `util.inspect` and `util.types.isNativeError` treat
|
|
44
|
+
// the copy as one.
|
|
45
|
+
const copy: object =
|
|
46
|
+
value instanceof Error
|
|
47
|
+
? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value))
|
|
48
|
+
: Object.create(Object.getPrototypeOf(value) as object | null);
|
|
25
49
|
let isChanged = false;
|
|
26
|
-
for (const key of Reflect.ownKeys(
|
|
27
|
-
const
|
|
28
|
-
const shown =
|
|
29
|
-
isChanged ||= shown !==
|
|
30
|
-
const enumerable = Object.getOwnPropertyDescriptor(
|
|
50
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
51
|
+
const property: unknown = Reflect.get(value, key);
|
|
52
|
+
const shown = redactedValue(property, inner);
|
|
53
|
+
isChanged ||= shown !== property;
|
|
54
|
+
const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;
|
|
31
55
|
Object.defineProperty(copy, key, {
|
|
32
56
|
value: shown,
|
|
33
57
|
enumerable,
|
|
@@ -35,18 +59,28 @@ function redactedError(error: Error, seen: ReadonlySet<Error>): Error {
|
|
|
35
59
|
configurable: true,
|
|
36
60
|
});
|
|
37
61
|
}
|
|
38
|
-
return isChanged ? copy :
|
|
62
|
+
return isChanged ? copy : value;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Binary data and functions hold no text to hide, so they are kept as they are. */
|
|
66
|
+
function isOpaque(value: object): boolean {
|
|
67
|
+
return typeof value === "function" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;
|
|
39
68
|
}
|
|
40
69
|
|
|
41
|
-
function
|
|
42
|
-
if (
|
|
43
|
-
return
|
|
70
|
+
function redactedValue(value: unknown, walk: Walk): unknown {
|
|
71
|
+
if (typeof value === "string") {
|
|
72
|
+
return redactUrlSecrets(value);
|
|
73
|
+
}
|
|
74
|
+
if (typeof value !== "object" || value === null || isOpaque(value)) {
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {
|
|
78
|
+
return undefined;
|
|
44
79
|
}
|
|
45
|
-
|
|
46
|
-
return seen.has(cause) ? undefined : redactedError(cause, seen);
|
|
80
|
+
return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);
|
|
47
81
|
}
|
|
48
82
|
|
|
49
83
|
/** The cause of a typed error with the URL secrets of its whole chain hidden. */
|
|
50
84
|
export function redactCauseSecrets(cause: unknown): unknown {
|
|
51
|
-
return
|
|
85
|
+
return redactedValue(cause, { path: new Set(), depth: 0 });
|
|
52
86
|
}
|
package/src/domain/errors.ts
CHANGED
|
@@ -28,8 +28,10 @@ export const ERROR_CODES = {
|
|
|
28
28
|
ENUM_NAME_EMPTY: "ENUM_NAME_EMPTY",
|
|
29
29
|
CALLBACK_RESULT_UNREADABLE: "CALLBACK_RESULT_UNREADABLE",
|
|
30
30
|
OPTION_FIX_UNKNOWN: "OPTION_FIX_UNKNOWN",
|
|
31
|
+
OPTION_INVALID: "OPTION_INVALID",
|
|
31
32
|
TYPESCRIPT_NOT_FOUND: "TYPESCRIPT_NOT_FOUND",
|
|
32
33
|
CLI_FLAG_REMOVED: "CLI_FLAG_REMOVED",
|
|
34
|
+
CLI_FLAG_INVALID: "CLI_FLAG_INVALID",
|
|
33
35
|
CLI_GLOB_UNSUPPORTED: "CLI_GLOB_UNSUPPORTED",
|
|
34
36
|
CLI_CONFIG_NOT_FOUND: "CLI_CONFIG_NOT_FOUND",
|
|
35
37
|
CLI_CONFIG_INVALID: "CLI_CONFIG_INVALID",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** How a location the user writes, as a CLI argument or an option string, is read. */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A scheme of two or more characters (`https:`, `file:`). One letter is a Windows drive (`C:`), so
|
|
5
|
+
* `C:\\specs\\api.yaml` stays a path.
|
|
6
|
+
*/
|
|
7
|
+
const URL_SCHEME = /^[a-z][a-z\d+.-]+:/i;
|
|
8
|
+
|
|
9
|
+
/** Whether the location is written as a URL, not as a file path. */
|
|
10
|
+
export function hasUrlScheme(location: string): boolean {
|
|
11
|
+
return URL_SCHEME.test(location);
|
|
12
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ADDITIONAL_OPERATIONS_KEY, HTTP_METHODS, QUERY_METHOD } from "./path-item-object.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The places of an OpenAPI document that a JSON Pointer passes through, read from the document's
|
|
5
|
+
* structure rather than from the words of the pointer. `named*` places and `callback` are maps
|
|
6
|
+
* whose next segment is a name (a path, a component name, a callback expression). `outside` (a
|
|
7
|
+
* root key that is no document key), `input` (a parameter or a request body) and `other` end the
|
|
8
|
+
* walk.
|
|
9
|
+
*/
|
|
10
|
+
export type DocumentPlace =
|
|
11
|
+
| "root"
|
|
12
|
+
| "outside"
|
|
13
|
+
| "components"
|
|
14
|
+
| "namedPathItems"
|
|
15
|
+
| "namedCallbacks"
|
|
16
|
+
| "callback"
|
|
17
|
+
| "pathItem"
|
|
18
|
+
| "namedOperations"
|
|
19
|
+
| "operation"
|
|
20
|
+
| "input"
|
|
21
|
+
| "other";
|
|
22
|
+
|
|
23
|
+
const OPERATION_KEYS: ReadonlySet<string> = new Set([...HTTP_METHODS, QUERY_METHOD]);
|
|
24
|
+
|
|
25
|
+
/** The place each fixed field leads to; any other field leads to `other`. */
|
|
26
|
+
const FIELDS: Readonly<Partial<Record<DocumentPlace, Readonly<Record<string, DocumentPlace>>>>> = {
|
|
27
|
+
root: {
|
|
28
|
+
paths: "namedPathItems",
|
|
29
|
+
webhooks: "namedPathItems",
|
|
30
|
+
components: "components",
|
|
31
|
+
$defs: "other",
|
|
32
|
+
},
|
|
33
|
+
components: {
|
|
34
|
+
parameters: "input",
|
|
35
|
+
requestBodies: "input",
|
|
36
|
+
pathItems: "namedPathItems",
|
|
37
|
+
callbacks: "namedCallbacks",
|
|
38
|
+
},
|
|
39
|
+
pathItem: { parameters: "input", [ADDITIONAL_OPERATIONS_KEY]: "namedOperations" },
|
|
40
|
+
operation: { parameters: "input", requestBody: "input", callbacks: "namedCallbacks" },
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/** Maps whose every key leads to the same place. */
|
|
44
|
+
const NAMED: Readonly<Partial<Record<DocumentPlace, DocumentPlace>>> = {
|
|
45
|
+
namedPathItems: "pathItem",
|
|
46
|
+
namedCallbacks: "callback",
|
|
47
|
+
callback: "pathItem",
|
|
48
|
+
namedOperations: "operation",
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
function nextPlace(place: DocumentPlace, segment: string): DocumentPlace {
|
|
52
|
+
const named = NAMED[place];
|
|
53
|
+
if (named !== undefined) {
|
|
54
|
+
return named;
|
|
55
|
+
}
|
|
56
|
+
if (place === "pathItem" && OPERATION_KEYS.has(segment)) {
|
|
57
|
+
return "operation";
|
|
58
|
+
}
|
|
59
|
+
const fields = FIELDS[place] ?? {};
|
|
60
|
+
if (Object.hasOwn(fields, segment)) {
|
|
61
|
+
return fields[segment] as DocumentPlace;
|
|
62
|
+
}
|
|
63
|
+
return place === "root" ? "outside" : "other";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const TERMINAL_PLACES: ReadonlySet<DocumentPlace> = new Set(["outside", "input", "other"]);
|
|
67
|
+
|
|
68
|
+
/** The place the segments of a pointer (after `#`) lead to; the walk stops at a terminal place. */
|
|
69
|
+
export function placeOf(segments: Iterable<string>): DocumentPlace {
|
|
70
|
+
let place: DocumentPlace = "root";
|
|
71
|
+
for (const segment of segments) {
|
|
72
|
+
place = nextPlace(place, segment);
|
|
73
|
+
if (TERMINAL_PLACES.has(place)) {
|
|
74
|
+
return place;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return place;
|
|
78
|
+
}
|
|
@@ -21,6 +21,11 @@ export const FIX = {
|
|
|
21
21
|
ARRAY_LENGTH_TUPLES: "array-length-tuples",
|
|
22
22
|
/** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */
|
|
23
23
|
DEDUPE_ENUM_NAMES: "dedupe-enum-names",
|
|
24
|
+
/**
|
|
25
|
+
* `--default-non-nullable` finds parameters and request bodies by the document's structure, not
|
|
26
|
+
* by the words `parameters` and `requestBody` anywhere in a schema's location.
|
|
27
|
+
*/
|
|
28
|
+
DEFAULT_INPUT_LOCATIONS: "default-input-locations",
|
|
24
29
|
/** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */
|
|
25
30
|
DISCRIMINATOR_MEMBER_REQUIRED: "discriminator-member-required",
|
|
26
31
|
/**
|
|
@@ -33,8 +38,8 @@ export const FIX = {
|
|
|
33
38
|
EXPLODED_QUERY_OBJECTS: "exploded-query-objects",
|
|
34
39
|
/** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */
|
|
35
40
|
NULLABLE_ENUMS: "nullable-enums",
|
|
36
|
-
/** A parameter with `content
|
|
37
|
-
|
|
41
|
+
/** A parameter or header with `content`, not `schema`, is typed by its media type's schema. */
|
|
42
|
+
PARAMETER_HEADER_CONTENT: "parameter-header-content",
|
|
38
43
|
/** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */
|
|
39
44
|
PATH_PARAM_TYPE_NAMES: "path-param-type-names",
|
|
40
45
|
/** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */
|
|
@@ -111,6 +116,7 @@ export interface OutputFixRequirement {
|
|
|
111
116
|
readonly option:
|
|
112
117
|
| "arrayLength"
|
|
113
118
|
| "dedupeEnums"
|
|
119
|
+
| "defaultNonNullable"
|
|
114
120
|
| "enum"
|
|
115
121
|
| "pathParamsAsTypes"
|
|
116
122
|
| "rootTypes"
|
|
@@ -129,6 +135,7 @@ const NO_SCHEMA_PREFIX = {
|
|
|
129
135
|
const REQUIREMENTS: Readonly<Partial<Record<OutputFixName, readonly OutputFixRequirement[]>>> = {
|
|
130
136
|
[FIX.ARRAY_LENGTH_TUPLES]: [{ option: "arrayLength", flag: "--array-length" }],
|
|
131
137
|
[FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: "dedupeEnums", flag: "--dedupe-enums" }],
|
|
138
|
+
[FIX.DEFAULT_INPUT_LOCATIONS]: [{ option: "defaultNonNullable", flag: "--default-non-nullable" }],
|
|
132
139
|
[FIX.NULLABLE_ENUMS]: [ENUM],
|
|
133
140
|
[FIX.PATH_PARAM_TYPE_NAMES]: [{ option: "pathParamsAsTypes", flag: "--path-params-as-types" }],
|
|
134
141
|
[FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX],
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text from a document or a project (a path key, an `operationId`, a file name) reaches the
|
|
3
|
+
* terminal and CI job logs. A line break in it starts a new line that CI reads as a command
|
|
4
|
+
* (`::error …` in GitHub Actions, `##vso[…]` in Azure Pipelines), and an escape sequence moves
|
|
5
|
+
* the cursor or erases lines, so it can forge or hide output. Each such character is shown as an
|
|
6
|
+
* escape instead (`\n`, `\u001b`), so one message stays one line and shows what the text holds.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The code points shown as escapes: C0 controls but the tab, DEL and C1 controls, the Unicode
|
|
11
|
+
* line and paragraph separators, and the bidirectional controls, which reorder how a terminal
|
|
12
|
+
* shows the text around them.
|
|
13
|
+
*/
|
|
14
|
+
const CONTROL_RANGES: readonly (readonly [number, number])[] = [
|
|
15
|
+
[0x00, 0x08],
|
|
16
|
+
[0x0a, 0x1f],
|
|
17
|
+
[0x7f, 0x9f],
|
|
18
|
+
[0x2028, 0x2029],
|
|
19
|
+
[0x202a, 0x202e],
|
|
20
|
+
[0x2066, 0x2069],
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const SHORT_ESCAPES: Readonly<Record<string, string>> = { "\n": "\\n", "\r": "\\r" };
|
|
24
|
+
const HEX_DIGITS = 4;
|
|
25
|
+
const HEX_RADIX = 16;
|
|
26
|
+
|
|
27
|
+
function isControl(codePoint: number): boolean {
|
|
28
|
+
return CONTROL_RANGES.some(([first, last]) => codePoint >= first && codePoint <= last);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function escapeOf(character: string, codePoint: number): string {
|
|
32
|
+
const hex = codePoint.toString(HEX_RADIX).padStart(HEX_DIGITS, "0");
|
|
33
|
+
return SHORT_ESCAPES[character] ?? `\\u${hex}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** The text with every control character shown as an escape, so it prints as one plain line. */
|
|
37
|
+
export function terminalSafeText(text: string): string {
|
|
38
|
+
let shown = "";
|
|
39
|
+
for (const character of text) {
|
|
40
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
41
|
+
shown += isControl(codePoint) ? escapeOf(character, codePoint) : character;
|
|
42
|
+
}
|
|
43
|
+
return shown;
|
|
44
|
+
}
|
package/src/domain/warnings.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
/** Every warning code. */
|
|
8
8
|
export const WARNING_CODES = {
|
|
9
9
|
CLI_INPUT_IGNORED: "CLI_INPUT_IGNORED",
|
|
10
|
+
CLI_OUTPUT_IGNORED: "CLI_OUTPUT_IGNORED",
|
|
10
11
|
CONFIG_SETTING_UNKNOWN: "CONFIG_SETTING_UNKNOWN",
|
|
11
12
|
DISCRIMINATOR_MAPPING_INVALID: "DISCRIMINATOR_MAPPING_INVALID",
|
|
12
13
|
DISCRIMINATOR_VALUE_NOT_ALLOWED: "DISCRIMINATOR_VALUE_NOT_ALLOWED",
|