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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"located-node.cjs","sources":["../../../../src/application/transform/ref-pointer/located-node.ts"],"sourcesContent":["import { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\n\n/** Document nodes as the `$ref` pointer walks read them: with their place in the document. */\n\nexport type JsonObject = Readonly<Record<string, unknown>>;\n\n/**\n * A schema node and its JSON Pointer in the document. The generator writes the type of a schema\n * reached by a `$ref` at the target, and the location decides whether a property with a `default`\n * is required (`isInputLocation`). Undefined for a node that is not in the document.\n */\nexport interface LocatedNode {\n readonly node: unknown;\n readonly location: string | undefined;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The schema a node stands for: a `$ref` is followed to its target. */\nexport function followRefs(node: unknown, refs: RefResolver): unknown {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? refs.resolve(node.$ref) : node;\n}\n\n/** `followRefs` with the location: a `$ref` is followed to its target and the target's pointer. */\nexport function followLocated(located: LocatedNode, refs: RefResolver): LocatedNode {\n const { node } = located;\n return isJsonObject(node) && typeof node.$ref === \"string\"\n ? { node: refs.resolve(node.$ref), location: node.$ref }\n : located;\n}\n\n/** The location of a child of a node at `location`, or undefined outside the document. */\nexport function childLocation(location: string | undefined, ...segments: string[]) {\n return location === undefined ? undefined : appendPointer(location, segments);\n}\n"],"names":["appendPointer"],"mappings":";;;;AAiBO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,UAAA,CAAW,MAAe,IAAA,EAA4B;AACpE,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzF;AAGO,SAAS,aAAA,CAAc,SAAsB,IAAA,EAAgC;AAClF,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AACjB,EAAA,OAAO,aAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,SAAS,QAAA,GAC9C,EAAE,IAAA,EAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAI,GAAG,QAAA,EAAU,IAAA,CAAK,MAAK,GACrD,OAAA;AACN;AAGO,SAAS,aAAA,CAAc,aAAiC,QAAA,EAAoB;AACjF,EAAA,OAAO,QAAA,KAAa,MAAA,GAAY,MAAA,GAAYA,yBAAA,CAAc,UAAU,QAAQ,CAAA;AAC9E;;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { appendPointer } from '../../../domain/openapi/json-pointer.mjs';
|
|
2
|
+
|
|
3
|
+
function isJsonObject(value) {
|
|
4
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
function followRefs(node, refs) {
|
|
7
|
+
return isJsonObject(node) && typeof node.$ref === "string" ? refs.resolve(node.$ref) : node;
|
|
8
|
+
}
|
|
9
|
+
function followLocated(located, refs) {
|
|
10
|
+
const { node } = located;
|
|
11
|
+
return isJsonObject(node) && typeof node.$ref === "string" ? { node: refs.resolve(node.$ref), location: node.$ref } : located;
|
|
12
|
+
}
|
|
13
|
+
function childLocation(location, ...segments) {
|
|
14
|
+
return location === void 0 ? void 0 : appendPointer(location, segments);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { childLocation, followLocated, followRefs, isJsonObject };
|
|
18
|
+
//# sourceMappingURL=located-node.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"located-node.mjs","sources":["../../../../src/application/transform/ref-pointer/located-node.ts"],"sourcesContent":["import { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\n\n/** Document nodes as the `$ref` pointer walks read them: with their place in the document. */\n\nexport type JsonObject = Readonly<Record<string, unknown>>;\n\n/**\n * A schema node and its JSON Pointer in the document. The generator writes the type of a schema\n * reached by a `$ref` at the target, and the location decides whether a property with a `default`\n * is required (`isInputLocation`). Undefined for a node that is not in the document.\n */\nexport interface LocatedNode {\n readonly node: unknown;\n readonly location: string | undefined;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The schema a node stands for: a `$ref` is followed to its target. */\nexport function followRefs(node: unknown, refs: RefResolver): unknown {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? refs.resolve(node.$ref) : node;\n}\n\n/** `followRefs` with the location: a `$ref` is followed to its target and the target's pointer. */\nexport function followLocated(located: LocatedNode, refs: RefResolver): LocatedNode {\n const { node } = located;\n return isJsonObject(node) && typeof node.$ref === \"string\"\n ? { node: refs.resolve(node.$ref), location: node.$ref }\n : located;\n}\n\n/** The location of a child of a node at `location`, or undefined outside the document. */\nexport function childLocation(location: string | undefined, ...segments: string[]) {\n return location === undefined ? undefined : appendPointer(location, segments);\n}\n"],"names":[],"mappings":";;AAiBO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,UAAA,CAAW,MAAe,IAAA,EAA4B;AACpE,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzF;AAGO,SAAS,aAAA,CAAc,SAAsB,IAAA,EAAgC;AAClF,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AACjB,EAAA,OAAO,aAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,SAAS,QAAA,GAC9C,EAAE,IAAA,EAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAI,GAAG,QAAA,EAAU,IAAA,CAAK,MAAK,GACrD,OAAA;AACN;AAGO,SAAS,aAAA,CAAc,aAAiC,QAAA,EAAoB;AACjF,EAAA,OAAO,QAAA,KAAa,MAAA,GAAY,MAAA,GAAY,aAAA,CAAc,UAAU,QAAQ,CAAA;AAC9E;;"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const generatedShape = require('./generated-shape.cjs');
|
|
4
|
+
const locatedNode = require('./located-node.cjs');
|
|
4
5
|
const pointerWalk = require('./pointer-walk.cjs');
|
|
5
6
|
|
|
6
7
|
function schemaStep(walk, segment, isLast, input) {
|
|
7
8
|
if (segment === "properties") {
|
|
8
9
|
return { step: "continue", walk };
|
|
9
10
|
}
|
|
10
|
-
const member = generatedShape.generatedMember(walk
|
|
11
|
+
const member = generatedShape.generatedMember(walk, segment, input.options, input.refs);
|
|
11
12
|
if (member.kind === "missing") {
|
|
12
13
|
return { step: "fails", walk };
|
|
13
14
|
}
|
|
@@ -15,41 +16,95 @@ function schemaStep(walk, segment, isLast, input) {
|
|
|
15
16
|
return { step: "compiles", walk };
|
|
16
17
|
}
|
|
17
18
|
const isAbsentValue = member.kind === "index" && member.node === void 0;
|
|
18
|
-
const isUnsafe = member.kind === "property" ? member.isOptional : isAbsentValue;
|
|
19
|
+
const isUnsafe = member.kind === "property" ? member.isOptional || member.isMarked : isAbsentValue;
|
|
19
20
|
return {
|
|
20
21
|
step: isUnsafe && !isLast ? "fails" : "continue",
|
|
21
|
-
walk: { ...walk, node: member.node }
|
|
22
|
+
walk: { ...walk, node: member.node, location: member.location }
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
25
|
function containerStep(walk, index, input) {
|
|
25
26
|
const segment = input.pointer.segments[index];
|
|
26
27
|
const isLast = index === input.pointer.segments.length - 1;
|
|
28
|
+
if (pointerWalk.isExcludedOperation(input.pointer, index, walk.node, input)) {
|
|
29
|
+
return { step: "fails", walk };
|
|
30
|
+
}
|
|
27
31
|
const isOptional = segment === "requestBody" && pointerWalk.isOptionalRequestBody(walk.node, input.refs) || pointerWalk.isOptionalHeader(input.pointer, index, walk.node);
|
|
28
32
|
if (isOptional && !isLast) {
|
|
29
33
|
return { step: "fails", walk };
|
|
30
34
|
}
|
|
31
|
-
const child =
|
|
35
|
+
const child = locatedNode.followLocated(
|
|
36
|
+
{
|
|
37
|
+
node: locatedNode.isJsonObject(walk.node) ? walk.node[segment] : void 0,
|
|
38
|
+
location: locatedNode.childLocation(walk.location, segment)
|
|
39
|
+
},
|
|
40
|
+
input.refs
|
|
41
|
+
);
|
|
32
42
|
return {
|
|
33
|
-
step: child === void 0 ? "compiles" : "continue",
|
|
34
|
-
walk: { ...walk,
|
|
43
|
+
step: child.node === void 0 ? "compiles" : "continue",
|
|
44
|
+
walk: { ...walk, ...child }
|
|
35
45
|
};
|
|
36
46
|
}
|
|
47
|
+
function firstMediaTypeSchema(walk, refs) {
|
|
48
|
+
const content = locatedNode.isJsonObject(walk.node) ? walk.node.content : void 0;
|
|
49
|
+
if (!locatedNode.isJsonObject(content)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const [mediaType] = Object.keys(content);
|
|
53
|
+
if (mediaType === void 0) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const location = locatedNode.childLocation(locatedNode.childLocation(walk.location, "content"), mediaType);
|
|
57
|
+
const entry = locatedNode.followLocated({ node: content[mediaType], location }, refs);
|
|
58
|
+
return ownSchema({ ...entry}, refs);
|
|
59
|
+
}
|
|
60
|
+
function ownSchema(walk, refs) {
|
|
61
|
+
const schema = locatedNode.isJsonObject(walk.node) ? walk.node.schema : void 0;
|
|
62
|
+
const location = locatedNode.childLocation(walk.location, "schema");
|
|
63
|
+
return { ...locatedNode.followLocated({ node: schema, location }, refs), isSchema: true };
|
|
64
|
+
}
|
|
65
|
+
function contentSchema(walk, form, refs) {
|
|
66
|
+
switch (form) {
|
|
67
|
+
case "first-media-type":
|
|
68
|
+
return firstMediaTypeSchema(walk, refs);
|
|
69
|
+
case "schema":
|
|
70
|
+
return ownSchema(walk, refs);
|
|
71
|
+
case "string":
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function contentStep(walk, form, isLast, input) {
|
|
76
|
+
const content = locatedNode.isJsonObject(walk.node) ? walk.node.content : void 0;
|
|
77
|
+
if (form === "media-type-members") {
|
|
78
|
+
const hasMember = locatedNode.isJsonObject(content) && Object.hasOwn(content, "content");
|
|
79
|
+
return { step: hasMember ? "compiles" : "fails", walk };
|
|
80
|
+
}
|
|
81
|
+
const schema = contentSchema(walk, form, input.refs);
|
|
82
|
+
return schema === null ? { step: "fails", walk } : schemaStep(schema, "content", isLast, input);
|
|
83
|
+
}
|
|
84
|
+
function documentStep(walk, index, input) {
|
|
85
|
+
const segment = input.pointer.segments[index];
|
|
86
|
+
const isLast = index === input.pointer.segments.length - 1;
|
|
87
|
+
const form = pointerWalk.headerParameterContentForm(input.pointer, index, walk.node, input.options);
|
|
88
|
+
if (form !== null) {
|
|
89
|
+
return contentStep(walk, form, isLast, input);
|
|
90
|
+
}
|
|
91
|
+
if (pointerWalk.isTypedAsSchema(input.pointer, index) && locatedNode.isJsonObject(walk.node)) {
|
|
92
|
+
return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);
|
|
93
|
+
}
|
|
94
|
+
return containerStep(walk, index, input);
|
|
95
|
+
}
|
|
37
96
|
function originalIndexFails(input) {
|
|
38
97
|
const { segments } = input.pointer;
|
|
39
98
|
let walk = {
|
|
40
|
-
|
|
99
|
+
...pointerWalk.leadingLocated(input.pointer, input.refs),
|
|
41
100
|
isSchema: pointerWalk.startsInSchema(input.pointer)
|
|
42
101
|
};
|
|
43
102
|
for (let index = pointerWalk.leadingSegmentsOf(input.pointer); index < segments.length; index++) {
|
|
44
|
-
const segment = segments[index];
|
|
45
|
-
const isLast = index === segments.length - 1;
|
|
46
103
|
if (!walk.isSchema && pointerWalk.isParameterList(input.pointer, index)) {
|
|
47
104
|
return true;
|
|
48
105
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
const result = walk.isSchema ? schemaStep(walk, segment, isLast, input) : containerStep(walk, index, input);
|
|
106
|
+
const isLast = index === segments.length - 1;
|
|
107
|
+
const result = walk.isSchema ? schemaStep(walk, segments[index], isLast, input) : documentStep(walk, index, input);
|
|
53
108
|
if (result.step !== "continue") {
|
|
54
109
|
return result.step === "fails";
|
|
55
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"original-index.cjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { followRefs, generatedMember, isJsonObject } from \"./generated-shape.js\";\nimport {\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingNode,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure; where the\n * answer depends on a shape it does not model, it answers false, so that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk.node, segment, input.options, input.refs);\n if (member.kind === \"missing\") {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe = member.kind === \"property\" ? member.isOptional : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = isJsonObject(walk.node) ? followRefs(walk.node[segment], input.refs) : undefined;\n return {\n step: (child === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, node: child },\n };\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n node: leadingNode(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n if (!walk.isSchema && isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n walk = { node: followRefs(walk.node.schema, input.refs), isSchema: true };\n }\n const result = walk.isSchema\n ? schemaStep(walk, segment, isLast, input)\n : containerStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":["generatedMember","isOptionalRequestBody","isOptionalHeader","isJsonObject","followRefs","leadingNode","startsInSchema","leadingSegmentsOf","isParameterList","isTypedAsSchema"],"mappings":";;;;;AAiCA,SAAS,UAAA,CAAW,IAAA,EAAoB,OAAA,EAAiB,MAAA,EAAiB,KAAA,EAAkB;AAC1F,EAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAoB,IAAA,EAAK;AAAA,EAC1C;AACA,EAAA,MAAM,MAAA,GAASA,+BAAgB,IAAA,CAAK,IAAA,EAAM,SAAS,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AAC5E,EAAA,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAiB,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAoB,IAAA,EAAK;AAAA,EAC1C;AACA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,KAAS,OAAA,IAAW,OAAO,IAAA,KAAS,MAAA;AACjE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,KAAS,UAAA,GAAa,OAAO,UAAA,GAAa,aAAA;AAClE,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,QAAA,IAAY,CAAC,MAAA,GAAS,OAAA,GAAU,UAAA;AAAA,IACvC,MAAM,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA;AAAK,GACrC;AACF;AAEA,SAAS,aAAA,CAAc,IAAA,EAAoB,KAAA,EAAe,KAAA,EAAkB;AAC1E,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,MAAA,GAAS,CAAA;AACzD,EAAA,MAAM,UAAA,GACH,OAAA,KAAY,aAAA,IAAiBC,iCAAA,CAAsB,KAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA,IACzEC,4BAAA,CAAiB,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,KAAK,IAAI,CAAA;AAClD,EAAA,IAAI,UAAA,IAAc,CAAC,MAAA,EAAQ;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAiB,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,MAAM,KAAA,GAAQC,2BAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAIC,yBAAA,CAAW,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AACrF,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,KAAA,KAAU,MAAA,GAAY,UAAA,GAAa,UAAA;AAAA,IAC1C,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,MAAM,KAAA;AAAM,GAC/B;AACF;AAGO,SAAS,mBAAmB,KAAA,EAA2B;AAC5D,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,KAAA,CAAM,OAAA;AAC3B,EAAA,IAAI,IAAA,GAAqB;AAAA,IACvB,IAAA,EAAMC,uBAAA,CAAY,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AAAA,IAC3C,QAAA,EAAUC,0BAAA,CAAe,KAAA,CAAM,OAAO;AAAA,GACxC;AACA,EAAA,KAAA,IAAS,KAAA,GAAQC,8BAAkB,KAAA,CAAM,OAAO,GAAG,KAAA,GAAQ,QAAA,CAAS,QAAQ,KAAA,EAAA,EAAS;AACnF,IAAA,MAAM,OAAA,GAAU,SAAS,KAAK,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAA,KAAU,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAYC,4BAAgB,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA,EAAG;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAYC,2BAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA,IAAKN,2BAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAEtF,MAAA,IAAA,GAAO,EAAE,IAAA,EAAMC,yBAAA,CAAW,IAAA,CAAK,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAI,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK;AAAA,IAC1E;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,GAChB,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA,GACvC,aAAA,CAAc,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AACpC,IAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,OAAO,OAAO,IAAA,KAAS,OAAA;AAAA,IACzB;AACA,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,KAAA;AACT;;"}
|
|
1
|
+
{"version":3,"file":"original-index.cjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { generatedMember } from \"./generated-shape.js\";\nimport { childLocation, followLocated, isJsonObject } from \"./located-node.js\";\nimport {\n type ContentForm,\n headerParameterContentForm,\n isExcludedOperation,\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingLocated,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure; where the\n * answer depends on a shape it does not model, it answers false, so that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n /** The node's JSON Pointer (`LocatedNode`). */\n readonly location: string | undefined;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk, segment, input.options, input.refs);\n if (member.kind === \"missing\") {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe =\n member.kind === \"property\" ? member.isOptional || member.isMarked : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node, location: member.location },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n if (isExcludedOperation(input.pointer, index, walk.node, input)) {\n return { step: \"fails\" as Step, walk };\n }\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = followLocated(\n {\n node: isJsonObject(walk.node) ? walk.node[segment] : undefined,\n location: childLocation(walk.location, segment),\n },\n input.refs,\n );\n return {\n step: (child.node === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, ...child },\n };\n}\n\n/** The schema of the first media type of a `content` map, `$ref`s followed. */\nfunction firstMediaTypeSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk | null {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (!isJsonObject(content)) {\n return null;\n }\n const [mediaType] = Object.keys(content);\n if (mediaType === undefined) {\n return null;\n }\n const location = childLocation(childLocation(walk.location, \"content\"), mediaType);\n const entry = followLocated({ node: content[mediaType], location }, refs);\n return ownSchema({ ...entry, isSchema: false }, refs);\n}\n\n/** The schema a header or parameter is typed by, `$ref`s followed. */\nfunction ownSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk {\n const schema = isJsonObject(walk.node) ? walk.node.schema : undefined;\n const location = childLocation(walk.location, \"schema\");\n return { ...followLocated({ node: schema, location }, refs), isSchema: true };\n}\n\n/** The schema whose type a header or parameter is, when not its media type members. */\nfunction contentSchema(\n walk: OriginalWalk,\n form: Exclude<ContentForm, \"media-type-members\">,\n refs: RefResolver,\n): OriginalWalk | null {\n switch (form) {\n case \"first-media-type\":\n return firstMediaTypeSchema(walk, refs);\n case \"schema\":\n return ownSchema(walk, refs);\n case \"string\":\n return null;\n }\n}\n\n/**\n * The original indexes the `content` of a header or parameter by name. The media type members\n * have no `content` unless a media type is named so, and `string` and `unknown` (no media type)\n * have none; the schema of the first media type, or the `schema` next to `content`, is walked on.\n */\nfunction contentStep(walk: OriginalWalk, form: ContentForm, isLast: boolean, input: WalkInput) {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (form === \"media-type-members\") {\n const hasMember = isJsonObject(content) && Object.hasOwn(content, \"content\");\n return { step: (hasMember ? \"compiles\" : \"fails\") as Step, walk };\n }\n const schema = contentSchema(walk, form, input.refs);\n return schema === null\n ? { step: \"fails\" as Step, walk }\n : schemaStep(schema, \"content\", isLast, input);\n}\n\n/**\n * A step outside a schema: a header's or parameter's `content`, a schema's container, or another.\n */\nfunction documentStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const form = headerParameterContentForm(input.pointer, index, walk.node, input.options);\n if (form !== null) {\n return contentStep(walk, form, isLast, input);\n }\n if (isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);\n }\n return containerStep(walk, index, input);\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n ...leadingLocated(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n const isLast = index === segments.length - 1;\n const result = walk.isSchema\n ? schemaStep(walk, segments[index] as string, isLast, input)\n : documentStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":["generatedMember","isExcludedOperation","isOptionalRequestBody","isOptionalHeader","followLocated","isJsonObject","childLocation","headerParameterContentForm","isTypedAsSchema","leadingLocated","startsInSchema","leadingSegmentsOf","isParameterList"],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { generatedMember } from './generated-shape.mjs';
|
|
2
|
+
import { isJsonObject, childLocation, followLocated } from './located-node.mjs';
|
|
3
|
+
import { startsInSchema, leadingLocated, leadingSegmentsOf, isParameterList, headerParameterContentForm, isTypedAsSchema, isExcludedOperation, isOptionalRequestBody, isOptionalHeader } from './pointer-walk.mjs';
|
|
3
4
|
|
|
4
5
|
function schemaStep(walk, segment, isLast, input) {
|
|
5
6
|
if (segment === "properties") {
|
|
6
7
|
return { step: "continue", walk };
|
|
7
8
|
}
|
|
8
|
-
const member = generatedMember(walk
|
|
9
|
+
const member = generatedMember(walk, segment, input.options, input.refs);
|
|
9
10
|
if (member.kind === "missing") {
|
|
10
11
|
return { step: "fails", walk };
|
|
11
12
|
}
|
|
@@ -13,41 +14,95 @@ function schemaStep(walk, segment, isLast, input) {
|
|
|
13
14
|
return { step: "compiles", walk };
|
|
14
15
|
}
|
|
15
16
|
const isAbsentValue = member.kind === "index" && member.node === void 0;
|
|
16
|
-
const isUnsafe = member.kind === "property" ? member.isOptional : isAbsentValue;
|
|
17
|
+
const isUnsafe = member.kind === "property" ? member.isOptional || member.isMarked : isAbsentValue;
|
|
17
18
|
return {
|
|
18
19
|
step: isUnsafe && !isLast ? "fails" : "continue",
|
|
19
|
-
walk: { ...walk, node: member.node }
|
|
20
|
+
walk: { ...walk, node: member.node, location: member.location }
|
|
20
21
|
};
|
|
21
22
|
}
|
|
22
23
|
function containerStep(walk, index, input) {
|
|
23
24
|
const segment = input.pointer.segments[index];
|
|
24
25
|
const isLast = index === input.pointer.segments.length - 1;
|
|
26
|
+
if (isExcludedOperation(input.pointer, index, walk.node, input)) {
|
|
27
|
+
return { step: "fails", walk };
|
|
28
|
+
}
|
|
25
29
|
const isOptional = segment === "requestBody" && isOptionalRequestBody(walk.node, input.refs) || isOptionalHeader(input.pointer, index, walk.node);
|
|
26
30
|
if (isOptional && !isLast) {
|
|
27
31
|
return { step: "fails", walk };
|
|
28
32
|
}
|
|
29
|
-
const child =
|
|
33
|
+
const child = followLocated(
|
|
34
|
+
{
|
|
35
|
+
node: isJsonObject(walk.node) ? walk.node[segment] : void 0,
|
|
36
|
+
location: childLocation(walk.location, segment)
|
|
37
|
+
},
|
|
38
|
+
input.refs
|
|
39
|
+
);
|
|
30
40
|
return {
|
|
31
|
-
step: child === void 0 ? "compiles" : "continue",
|
|
32
|
-
walk: { ...walk,
|
|
41
|
+
step: child.node === void 0 ? "compiles" : "continue",
|
|
42
|
+
walk: { ...walk, ...child }
|
|
33
43
|
};
|
|
34
44
|
}
|
|
45
|
+
function firstMediaTypeSchema(walk, refs) {
|
|
46
|
+
const content = isJsonObject(walk.node) ? walk.node.content : void 0;
|
|
47
|
+
if (!isJsonObject(content)) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const [mediaType] = Object.keys(content);
|
|
51
|
+
if (mediaType === void 0) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const location = childLocation(childLocation(walk.location, "content"), mediaType);
|
|
55
|
+
const entry = followLocated({ node: content[mediaType], location }, refs);
|
|
56
|
+
return ownSchema({ ...entry}, refs);
|
|
57
|
+
}
|
|
58
|
+
function ownSchema(walk, refs) {
|
|
59
|
+
const schema = isJsonObject(walk.node) ? walk.node.schema : void 0;
|
|
60
|
+
const location = childLocation(walk.location, "schema");
|
|
61
|
+
return { ...followLocated({ node: schema, location }, refs), isSchema: true };
|
|
62
|
+
}
|
|
63
|
+
function contentSchema(walk, form, refs) {
|
|
64
|
+
switch (form) {
|
|
65
|
+
case "first-media-type":
|
|
66
|
+
return firstMediaTypeSchema(walk, refs);
|
|
67
|
+
case "schema":
|
|
68
|
+
return ownSchema(walk, refs);
|
|
69
|
+
case "string":
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function contentStep(walk, form, isLast, input) {
|
|
74
|
+
const content = isJsonObject(walk.node) ? walk.node.content : void 0;
|
|
75
|
+
if (form === "media-type-members") {
|
|
76
|
+
const hasMember = isJsonObject(content) && Object.hasOwn(content, "content");
|
|
77
|
+
return { step: hasMember ? "compiles" : "fails", walk };
|
|
78
|
+
}
|
|
79
|
+
const schema = contentSchema(walk, form, input.refs);
|
|
80
|
+
return schema === null ? { step: "fails", walk } : schemaStep(schema, "content", isLast, input);
|
|
81
|
+
}
|
|
82
|
+
function documentStep(walk, index, input) {
|
|
83
|
+
const segment = input.pointer.segments[index];
|
|
84
|
+
const isLast = index === input.pointer.segments.length - 1;
|
|
85
|
+
const form = headerParameterContentForm(input.pointer, index, walk.node, input.options);
|
|
86
|
+
if (form !== null) {
|
|
87
|
+
return contentStep(walk, form, isLast, input);
|
|
88
|
+
}
|
|
89
|
+
if (isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {
|
|
90
|
+
return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);
|
|
91
|
+
}
|
|
92
|
+
return containerStep(walk, index, input);
|
|
93
|
+
}
|
|
35
94
|
function originalIndexFails(input) {
|
|
36
95
|
const { segments } = input.pointer;
|
|
37
96
|
let walk = {
|
|
38
|
-
|
|
97
|
+
...leadingLocated(input.pointer, input.refs),
|
|
39
98
|
isSchema: startsInSchema(input.pointer)
|
|
40
99
|
};
|
|
41
100
|
for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {
|
|
42
|
-
const segment = segments[index];
|
|
43
|
-
const isLast = index === segments.length - 1;
|
|
44
101
|
if (!walk.isSchema && isParameterList(input.pointer, index)) {
|
|
45
102
|
return true;
|
|
46
103
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
const result = walk.isSchema ? schemaStep(walk, segment, isLast, input) : containerStep(walk, index, input);
|
|
104
|
+
const isLast = index === segments.length - 1;
|
|
105
|
+
const result = walk.isSchema ? schemaStep(walk, segments[index], isLast, input) : documentStep(walk, index, input);
|
|
51
106
|
if (result.step !== "continue") {
|
|
52
107
|
return result.step === "fails";
|
|
53
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"original-index.mjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { followRefs, generatedMember, isJsonObject } from \"./generated-shape.js\";\nimport {\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingNode,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure; where the\n * answer depends on a shape it does not model, it answers false, so that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk.node, segment, input.options, input.refs);\n if (member.kind === \"missing\") {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe = member.kind === \"property\" ? member.isOptional : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = isJsonObject(walk.node) ? followRefs(walk.node[segment], input.refs) : undefined;\n return {\n step: (child === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, node: child },\n };\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n node: leadingNode(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n if (!walk.isSchema && isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n walk = { node: followRefs(walk.node.schema, input.refs), isSchema: true };\n }\n const result = walk.isSchema\n ? schemaStep(walk, segment, isLast, input)\n : containerStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"original-index.mjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { generatedMember } from \"./generated-shape.js\";\nimport { childLocation, followLocated, isJsonObject } from \"./located-node.js\";\nimport {\n type ContentForm,\n headerParameterContentForm,\n isExcludedOperation,\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingLocated,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure; where the\n * answer depends on a shape it does not model, it answers false, so that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n /** The node's JSON Pointer (`LocatedNode`). */\n readonly location: string | undefined;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk, segment, input.options, input.refs);\n if (member.kind === \"missing\") {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe =\n member.kind === \"property\" ? member.isOptional || member.isMarked : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node, location: member.location },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n if (isExcludedOperation(input.pointer, index, walk.node, input)) {\n return { step: \"fails\" as Step, walk };\n }\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = followLocated(\n {\n node: isJsonObject(walk.node) ? walk.node[segment] : undefined,\n location: childLocation(walk.location, segment),\n },\n input.refs,\n );\n return {\n step: (child.node === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, ...child },\n };\n}\n\n/** The schema of the first media type of a `content` map, `$ref`s followed. */\nfunction firstMediaTypeSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk | null {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (!isJsonObject(content)) {\n return null;\n }\n const [mediaType] = Object.keys(content);\n if (mediaType === undefined) {\n return null;\n }\n const location = childLocation(childLocation(walk.location, \"content\"), mediaType);\n const entry = followLocated({ node: content[mediaType], location }, refs);\n return ownSchema({ ...entry, isSchema: false }, refs);\n}\n\n/** The schema a header or parameter is typed by, `$ref`s followed. */\nfunction ownSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk {\n const schema = isJsonObject(walk.node) ? walk.node.schema : undefined;\n const location = childLocation(walk.location, \"schema\");\n return { ...followLocated({ node: schema, location }, refs), isSchema: true };\n}\n\n/** The schema whose type a header or parameter is, when not its media type members. */\nfunction contentSchema(\n walk: OriginalWalk,\n form: Exclude<ContentForm, \"media-type-members\">,\n refs: RefResolver,\n): OriginalWalk | null {\n switch (form) {\n case \"first-media-type\":\n return firstMediaTypeSchema(walk, refs);\n case \"schema\":\n return ownSchema(walk, refs);\n case \"string\":\n return null;\n }\n}\n\n/**\n * The original indexes the `content` of a header or parameter by name. The media type members\n * have no `content` unless a media type is named so, and `string` and `unknown` (no media type)\n * have none; the schema of the first media type, or the `schema` next to `content`, is walked on.\n */\nfunction contentStep(walk: OriginalWalk, form: ContentForm, isLast: boolean, input: WalkInput) {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (form === \"media-type-members\") {\n const hasMember = isJsonObject(content) && Object.hasOwn(content, \"content\");\n return { step: (hasMember ? \"compiles\" : \"fails\") as Step, walk };\n }\n const schema = contentSchema(walk, form, input.refs);\n return schema === null\n ? { step: \"fails\" as Step, walk }\n : schemaStep(schema, \"content\", isLast, input);\n}\n\n/**\n * A step outside a schema: a header's or parameter's `content`, a schema's container, or another.\n */\nfunction documentStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const form = headerParameterContentForm(input.pointer, index, walk.node, input.options);\n if (form !== null) {\n return contentStep(walk, form, isLast, input);\n }\n if (isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);\n }\n return containerStep(walk, index, input);\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n ...leadingLocated(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n const isLast = index === segments.length - 1;\n const result = walk.isSchema\n ? schemaStep(walk, segments[index] as string, isLast, input)\n : documentStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ const constructors = require('../../../domain/ir/constructors.cjs');
|
|
|
4
4
|
const outputFixes = require('../../../domain/output-fixes.cjs');
|
|
5
5
|
const refType = require('../ref-type.cjs');
|
|
6
6
|
const generatedLocation = require('./generated-location.cjs');
|
|
7
|
-
const generatedShape = require('./generated-shape.cjs');
|
|
8
7
|
const inlineCycles = require('./inline-cycles.cjs');
|
|
8
|
+
const locatedNode = require('./located-node.cjs');
|
|
9
9
|
const originalIndex = require('./original-index.cjs');
|
|
10
10
|
const pointerWalk = require('./pointer-walk.cjs');
|
|
11
11
|
const typedWalk = require('./typed-walk.cjs');
|
|
@@ -19,7 +19,7 @@ function pointerOf(ref) {
|
|
|
19
19
|
}
|
|
20
20
|
function targetType(ref, pointer, request, seen) {
|
|
21
21
|
const target = pointerWalk.pointerNode(pointer, request.context.refs);
|
|
22
|
-
if (
|
|
22
|
+
if (locatedNode.isJsonObject(target) && typeof target.$ref === "string") {
|
|
23
23
|
return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);
|
|
24
24
|
}
|
|
25
25
|
if (target === void 0 || inlineCycles.hasInlineCycle(ref, request.context.options, request.context.refs)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer-type.cjs","sources":["../../../../src/application/transform/ref-pointer/pointer-type.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { InvalidRefError, refType } from \"../ref-type.js\";\nimport type { SchemaRequest } from \"../schema/schema-rule.js\";\nimport { generatedLocationOf } from \"./generated-location.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"pointer-type.cjs","sources":["../../../../src/application/transform/ref-pointer/pointer-type.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { InvalidRefError, refType } from \"../ref-type.js\";\nimport type { SchemaRequest } from \"../schema/schema-rule.js\";\nimport { generatedLocationOf } from \"./generated-location.js\";\nimport { hasInlineCycle } from \"./inline-cycles.js\";\nimport { isJsonObject } from \"./located-node.js\";\nimport { originalIndexFails } from \"./original-index.js\";\nimport { leadingSegmentsOf, pointerNode, type RefPointer, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * The type of a schema `$ref` (ADR-026). The original indexed every segment of the pointer by\n * name (`refType`), also schema keywords the generated types do not have (`[\"schema\"]`,\n * `[\"items\"]`, `[\"allOf\"][\"0\"]`), and did not look through optional or nullable values. Where that\n * type does not compile, the `$ref` now gets the type of what it points at; where it compiles\n * (through an index signature), it stays, and the `ref-pointers` fix gives the right type there.\n */\n\nfunction pointerOf(ref: string): RefPointer {\n const pointer = refPointerOf(ref);\n if (pointer === null) {\n throw new InvalidRefError(ref);\n }\n return pointer;\n}\n\n/** The target of a pointer that crosses a segment with no type: its `$ref`, or its own type. */\nfunction targetType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const target = pointerNode(pointer, request.context.refs);\n if (isJsonObject(target) && typeof target.$ref === \"string\") {\n return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);\n }\n if (target === undefined || hasInlineCycle(ref, request.context.options, request.context.refs)) {\n return null;\n }\n // Typed where the generator types the node, so it shares the node's enum (`--enum`).\n const location = generatedLocationOf(ref, request.context.refs);\n return request.transformNested(\n target as never,\n { path: location.path, schema: target },\n location.isFromAdditionalProperties,\n );\n}\n\nfunction correctedType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer, options, refs });\n return result.kind === \"typed\" ? result.walk.type : targetType(ref, pointer, request, seen);\n}\n\nfunction isCorrected(pointer: RefPointer, request: SchemaRequest): boolean {\n const { options, refs } = request.context;\n return options.fixes.has(FIX.REF_POINTERS) || originalIndexFails({ pointer, options, refs });\n}\n\n/** The type of a schema `$ref`. Throws InvalidRefError when the `$ref` has no pointer. */\nexport function schemaRefType(\n ref: string,\n request: SchemaRequest,\n seen: readonly string[] = [],\n): IrType {\n const pointer = pointerOf(ref);\n if (pointer.segments.length <= leadingSegmentsOf(pointer) || !isCorrected(pointer, request)) {\n return refType(ref);\n }\n return correctedType(ref, pointer, request, seen) ?? refType(ref);\n}\n\n/**\n * The type of a `$ref` that `WithRequired` takes. A `$ref` to an optional or nullable value has\n * no keys (`keyof (T | undefined)` is `never`), so it is wrapped in `NonNullable` (TS2344).\n */\nexport function requirableRefType(ref: string, type: IrType, request: SchemaRequest): IrType {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer: pointerOf(ref), options, refs });\n const isAbsent = result.kind === \"typed\" && result.walk.presence === \"absent\";\n return isAbsent ? irReference(\"NonNullable\", [type]) : type;\n}\n"],"names":["refPointerOf","InvalidRefError","pointerNode","isJsonObject","hasInlineCycle","generatedLocationOf","typedWalk","FIX","originalIndexFails","leadingSegmentsOf","refType","irReference"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { irReference } from '../../../domain/ir/constructors.mjs';
|
|
|
2
2
|
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
3
3
|
import { refType, InvalidRefError } from '../ref-type.mjs';
|
|
4
4
|
import { generatedLocationOf } from './generated-location.mjs';
|
|
5
|
-
import { isJsonObject } from './generated-shape.mjs';
|
|
6
5
|
import { hasInlineCycle } from './inline-cycles.mjs';
|
|
6
|
+
import { isJsonObject } from './located-node.mjs';
|
|
7
7
|
import { originalIndexFails } from './original-index.mjs';
|
|
8
8
|
import { leadingSegmentsOf, refPointerOf, pointerNode } from './pointer-walk.mjs';
|
|
9
9
|
import { typedWalk } from './typed-walk.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer-type.mjs","sources":["../../../../src/application/transform/ref-pointer/pointer-type.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { InvalidRefError, refType } from \"../ref-type.js\";\nimport type { SchemaRequest } from \"../schema/schema-rule.js\";\nimport { generatedLocationOf } from \"./generated-location.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"pointer-type.mjs","sources":["../../../../src/application/transform/ref-pointer/pointer-type.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { InvalidRefError, refType } from \"../ref-type.js\";\nimport type { SchemaRequest } from \"../schema/schema-rule.js\";\nimport { generatedLocationOf } from \"./generated-location.js\";\nimport { hasInlineCycle } from \"./inline-cycles.js\";\nimport { isJsonObject } from \"./located-node.js\";\nimport { originalIndexFails } from \"./original-index.js\";\nimport { leadingSegmentsOf, pointerNode, type RefPointer, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * The type of a schema `$ref` (ADR-026). The original indexed every segment of the pointer by\n * name (`refType`), also schema keywords the generated types do not have (`[\"schema\"]`,\n * `[\"items\"]`, `[\"allOf\"][\"0\"]`), and did not look through optional or nullable values. Where that\n * type does not compile, the `$ref` now gets the type of what it points at; where it compiles\n * (through an index signature), it stays, and the `ref-pointers` fix gives the right type there.\n */\n\nfunction pointerOf(ref: string): RefPointer {\n const pointer = refPointerOf(ref);\n if (pointer === null) {\n throw new InvalidRefError(ref);\n }\n return pointer;\n}\n\n/** The target of a pointer that crosses a segment with no type: its `$ref`, or its own type. */\nfunction targetType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const target = pointerNode(pointer, request.context.refs);\n if (isJsonObject(target) && typeof target.$ref === \"string\") {\n return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);\n }\n if (target === undefined || hasInlineCycle(ref, request.context.options, request.context.refs)) {\n return null;\n }\n // Typed where the generator types the node, so it shares the node's enum (`--enum`).\n const location = generatedLocationOf(ref, request.context.refs);\n return request.transformNested(\n target as never,\n { path: location.path, schema: target },\n location.isFromAdditionalProperties,\n );\n}\n\nfunction correctedType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer, options, refs });\n return result.kind === \"typed\" ? result.walk.type : targetType(ref, pointer, request, seen);\n}\n\nfunction isCorrected(pointer: RefPointer, request: SchemaRequest): boolean {\n const { options, refs } = request.context;\n return options.fixes.has(FIX.REF_POINTERS) || originalIndexFails({ pointer, options, refs });\n}\n\n/** The type of a schema `$ref`. Throws InvalidRefError when the `$ref` has no pointer. */\nexport function schemaRefType(\n ref: string,\n request: SchemaRequest,\n seen: readonly string[] = [],\n): IrType {\n const pointer = pointerOf(ref);\n if (pointer.segments.length <= leadingSegmentsOf(pointer) || !isCorrected(pointer, request)) {\n return refType(ref);\n }\n return correctedType(ref, pointer, request, seen) ?? refType(ref);\n}\n\n/**\n * The type of a `$ref` that `WithRequired` takes. A `$ref` to an optional or nullable value has\n * no keys (`keyof (T | undefined)` is `never`), so it is wrapped in `NonNullable` (TS2344).\n */\nexport function requirableRefType(ref: string, type: IrType, request: SchemaRequest): IrType {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer: pointerOf(ref), options, refs });\n const isAbsent = result.kind === \"typed\" && result.walk.presence === \"absent\";\n return isAbsent ? irReference(\"NonNullable\", [type]) : type;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const documentPlaces = require('../../../domain/openapi/document-places.cjs');
|
|
3
4
|
const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
|
|
4
|
-
const
|
|
5
|
+
const parameterObject = require('../../../domain/openapi/parameter-object.cjs');
|
|
6
|
+
const outputFixes = require('../../../domain/output-fixes.cjs');
|
|
7
|
+
const locatedNode = require('./located-node.cjs');
|
|
5
8
|
|
|
6
9
|
const NAMED_ROOTS = /* @__PURE__ */ new Set(["paths", "webhooks"]);
|
|
7
10
|
function leadingSegmentsOf(pointer) {
|
|
@@ -11,18 +14,23 @@ function refPointerOf(ref) {
|
|
|
11
14
|
const [rootSegment, ...segments] = jsonPointer.parseRefPointer(ref);
|
|
12
15
|
return rootSegment === void 0 ? null : { rootSegment, segments };
|
|
13
16
|
}
|
|
14
|
-
function
|
|
15
|
-
let
|
|
17
|
+
function leadingLocated(pointer, refs) {
|
|
18
|
+
let located = {
|
|
19
|
+
node: refs.resolve(`#/${pointer.rootSegment}`),
|
|
20
|
+
location: locatedNode.childLocation(jsonPointer.ROOT_POINTER, pointer.rootSegment)
|
|
21
|
+
};
|
|
16
22
|
for (const segment of pointer.segments.slice(0, leadingSegmentsOf(pointer))) {
|
|
17
|
-
|
|
23
|
+
const { node, location } = located;
|
|
24
|
+
const child = locatedNode.isJsonObject(node) ? node[segment] : void 0;
|
|
25
|
+
located = locatedNode.followLocated({ node: child, location: locatedNode.childLocation(location, segment) }, refs);
|
|
18
26
|
}
|
|
19
|
-
return
|
|
27
|
+
return located;
|
|
20
28
|
}
|
|
21
29
|
function pointerNode(pointer, refs) {
|
|
22
30
|
let node = refs.resolve(`#/${pointer.rootSegment}`);
|
|
23
31
|
pointer.segments.forEach((segment, index) => {
|
|
24
|
-
const child =
|
|
25
|
-
node = index === pointer.segments.length - 1 ? child :
|
|
32
|
+
const child = locatedNode.isJsonObject(node) || Array.isArray(node) ? node[segment] : void 0;
|
|
33
|
+
node = index === pointer.segments.length - 1 ? child : locatedNode.followRefs(child, refs);
|
|
26
34
|
});
|
|
27
35
|
return node;
|
|
28
36
|
}
|
|
@@ -34,31 +42,64 @@ function isTypedAsSchema(pointer, index) {
|
|
|
34
42
|
const isComponentParameter = pointer.rootSegment === "components" && index === 2 && owner === "parameters";
|
|
35
43
|
return owner === "content" || owner === "headers" || isComponentParameter;
|
|
36
44
|
}
|
|
45
|
+
function headerParameterContentForm(pointer, index, owner, options) {
|
|
46
|
+
const isHeader = pointer.segments[index - 2] === "headers";
|
|
47
|
+
const isComponentParameter = pointer.rootSegment === "components" && index === 2 && pointer.segments[0] === "parameters";
|
|
48
|
+
const isOwnContent = pointer.segments[index] === "content" && (isHeader || isComponentParameter);
|
|
49
|
+
if (!isOwnContent || !locatedNode.isJsonObject(owner)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const isFixed = options.fixes.has(outputFixes.FIX.PARAMETER_HEADER_CONTENT);
|
|
53
|
+
if (isHeader) {
|
|
54
|
+
if (owner.schema) {
|
|
55
|
+
return "schema";
|
|
56
|
+
}
|
|
57
|
+
return isFixed ? "first-media-type" : "media-type-members";
|
|
58
|
+
}
|
|
59
|
+
if (owner.in === parameterObject.QUERYSTRING_LOCATION) {
|
|
60
|
+
return "first-media-type";
|
|
61
|
+
}
|
|
62
|
+
if (owner.schema !== void 0) {
|
|
63
|
+
return "schema";
|
|
64
|
+
}
|
|
65
|
+
return isFixed ? "first-media-type" : "string";
|
|
66
|
+
}
|
|
37
67
|
function isParameterList(pointer, index) {
|
|
38
68
|
const next = pointer.segments[index + 1] ?? "";
|
|
39
69
|
return pointer.segments[index] === "parameters" && /^\d+$/.test(next);
|
|
40
70
|
}
|
|
41
71
|
function isOptionalHeader(pointer, index, headers) {
|
|
42
72
|
const isComponentHeader = pointer.rootSegment === "components" && index === 1;
|
|
43
|
-
if (pointer.segments[index - 1] !== "headers" || isComponentHeader || !
|
|
73
|
+
if (pointer.segments[index - 1] !== "headers" || isComponentHeader || !locatedNode.isJsonObject(headers)) {
|
|
44
74
|
return false;
|
|
45
75
|
}
|
|
46
76
|
const header = headers[pointer.segments[index]];
|
|
47
|
-
return
|
|
77
|
+
return locatedNode.isJsonObject(header) && header.$ref === void 0 && header.required !== true;
|
|
78
|
+
}
|
|
79
|
+
function isExcludedOperation(pointer, index, pathItem, input) {
|
|
80
|
+
const segments = [pointer.rootSegment, ...pointer.segments.slice(0, index + 1)];
|
|
81
|
+
if (!input.options.excludeDeprecated || documentPlaces.placeOf(segments) !== "operation") {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
const segment = pointer.segments[index];
|
|
85
|
+
const operation = locatedNode.isJsonObject(pathItem) ? locatedNode.followRefs(pathItem[segment], input.refs) : void 0;
|
|
86
|
+
return locatedNode.isJsonObject(operation) && Boolean(operation.deprecated);
|
|
48
87
|
}
|
|
49
88
|
function isOptionalRequestBody(container, refs) {
|
|
50
|
-
if (!
|
|
89
|
+
if (!locatedNode.isJsonObject(container) || container.requestBody === void 0) {
|
|
51
90
|
return false;
|
|
52
91
|
}
|
|
53
|
-
const body =
|
|
54
|
-
return !(
|
|
92
|
+
const body = locatedNode.followRefs(container.requestBody, refs);
|
|
93
|
+
return !(locatedNode.isJsonObject(body) && body.required === true);
|
|
55
94
|
}
|
|
56
95
|
|
|
96
|
+
exports.headerParameterContentForm = headerParameterContentForm;
|
|
97
|
+
exports.isExcludedOperation = isExcludedOperation;
|
|
57
98
|
exports.isOptionalHeader = isOptionalHeader;
|
|
58
99
|
exports.isOptionalRequestBody = isOptionalRequestBody;
|
|
59
100
|
exports.isParameterList = isParameterList;
|
|
60
101
|
exports.isTypedAsSchema = isTypedAsSchema;
|
|
61
|
-
exports.
|
|
102
|
+
exports.leadingLocated = leadingLocated;
|
|
62
103
|
exports.leadingSegmentsOf = leadingSegmentsOf;
|
|
63
104
|
exports.pointerNode = pointerNode;
|
|
64
105
|
exports.refPointerOf = refPointerOf;
|