@aws/nx-plugin 1.0.0-rc.32 → 1.0.0-rc.34
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/LICENSE-THIRD-PARTY +75 -86
- package/generators.json +27 -0
- package/package.json +10 -10
- package/src/connection/generator.js +12 -1
- package/src/connection/generator.js.map +1 -1
- package/src/connection/supported-connections.d.ts +10 -1
- package/src/connection/supported-connections.js +13 -0
- package/src/connection/supported-connections.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +21 -21
- package/src/infra/app/files/app/src/main.ts.template +1 -1
- package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
- package/src/infra/app/generator.js +3 -1
- package/src/infra/app/generator.js.map +1 -1
- package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +12 -12
- package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +74 -10
- package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +22 -4
- package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +53 -8
- package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +32 -4
- package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
- package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +86 -11
- package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +21 -3
- package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +2 -2
- package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +6 -6
- package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +2 -2
- package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
- package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +4 -4
- package/src/open-api/ts-client/files/client.gen.ts.template +196 -13
- package/src/open-api/ts-client/files/types.gen.ts.template +2 -0
- package/src/open-api/ts-client/generator.js +27 -2
- package/src/open-api/ts-client/generator.js.map +1 -1
- package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +2 -2
- package/src/open-api/ts-hooks/generator.js +5 -1
- package/src/open-api/ts-hooks/generator.js.map +1 -1
- package/src/open-api/utils/codegen-data/languages.js +6 -0
- package/src/open-api/utils/codegen-data/languages.js.map +1 -1
- package/src/open-api/utils/codegen-data/types.d.ts +16 -1
- package/src/open-api/utils/codegen-data/types.js.map +1 -1
- package/src/open-api/utils/codegen-data.js +71 -0
- package/src/open-api/utils/codegen-data.js.map +1 -1
- package/src/open-api/utils/normalise.js +53 -8
- package/src/open-api/utils/normalise.js.map +1 -1
- package/src/open-api/utils/parser.js +48 -15
- package/src/open-api/utils/parser.js.map +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +5 -3
- package/src/preset/generator.d.ts +1 -1
- package/src/preset/generator.js +5 -2
- package/src/preset/generator.js.map +1 -1
- package/src/preset/schema.d.js.map +1 -1
- package/src/preset/schema.d.ts +2 -0
- package/src/preset/schema.json +6 -0
- package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +7 -7
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +8 -8
- package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +89 -3
- package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
- package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +91 -5
- package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2038 -0
- package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +104 -0
- package/src/py/rdb/agent-connection/generator.d.ts +10 -0
- package/src/py/rdb/agent-connection/generator.js +46 -0
- package/src/py/rdb/agent-connection/generator.js.map +1 -0
- package/src/py/rdb/agent-connection/schema.d.js +8 -0
- package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
- package/src/py/rdb/agent-connection/schema.d.ts +15 -0
- package/src/py/rdb/agent-connection/schema.json +27 -0
- package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +44 -0
- package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
- package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
- package/src/py/rdb/fast-api-connection/generator.js +54 -0
- package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
- package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
- package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
- package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
- package/src/py/rdb/fast-api-connection/schema.json +23 -0
- package/src/py/rdb/files/Dockerfile.create-db-user.template +10 -0
- package/src/py/rdb/files/Dockerfile.migration.template +10 -0
- package/src/py/rdb/files/__name__/__init__.py.template +3 -0
- package/src/py/rdb/files/__name__/connection.py.template +55 -0
- package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
- package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
- package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
- package/src/py/rdb/files/__name__/models/example.py.template +8 -0
- package/src/py/rdb/files/__name__/utils.py.template +104 -0
- package/src/py/rdb/files/alembic.ini.template +38 -0
- package/src/py/rdb/files/config.json.template +14 -0
- package/src/py/rdb/files/migrations/env.py.template +80 -0
- package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
- package/src/py/rdb/generator.d.ts +6 -0
- package/src/py/rdb/generator.js +263 -0
- package/src/py/rdb/generator.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +101 -0
- package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/rdb/mcp-server-connection/generator.js +46 -0
- package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
- package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
- package/src/py/rdb/mcp-server-connection/schema.json +27 -0
- package/src/py/rdb/schema.d.js +6 -0
- package/src/py/rdb/schema.d.js.map +1 -0
- package/src/py/rdb/schema.d.ts +16 -0
- package/src/py/rdb/schema.json +77 -0
- package/src/py/rdb/utils.d.ts +6 -0
- package/src/py/rdb/utils.js +16 -0
- package/src/py/rdb/utils.js.map +1 -0
- package/src/sdk/py.d.ts +2 -0
- package/src/sdk/py.js +1 -0
- package/src/sdk/py.js.map +1 -1
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +7 -7
- package/src/smithy/ts/api/files/handler.ts.template +2 -2
- package/src/smithy/ts/api/files/local-server.ts.template +2 -2
- package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
- package/src/smithy/ts/api/files/service.ts.template +3 -3
- package/src/smithy/ts/api/generator.js +3 -1
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
- package/src/trpc/backend/files/src/client/index.ts.template +1 -1
- package/src/trpc/backend/files/src/handler.ts.template +1 -1
- package/src/trpc/backend/files/src/index.ts.template +5 -5
- package/src/trpc/backend/files/src/init.ts.template +1 -1
- package/src/trpc/backend/files/src/local-server.ts.template +1 -1
- package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
- package/src/trpc/backend/files/src/procedures/echo.ts.template +2 -2
- package/src/trpc/backend/files/src/router.ts.template +2 -2
- package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
- package/src/trpc/backend/generator.js +3 -1
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +89 -3
- package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +2 -2
- package/src/ts/agent/a2a-connection/generator.js +3 -1
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/files/a2a/index.ts.template +1 -1
- package/src/ts/agent/files/ag-ui/index.ts.template +1 -1
- package/src/ts/agent/files/http/client.ts.template +2 -2
- package/src/ts/agent/files/http/index.ts.template +2 -2
- package/src/ts/agent/files/http/router.ts.template +3 -3
- package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +2 -2
- package/src/ts/agent/gateway-connection/generator.js +3 -1
- package/src/ts/agent/gateway-connection/generator.js.map +1 -1
- package/src/ts/agent/generator.js +5 -2
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +2 -2
- package/src/ts/agent/mcp-connection/generator.js +3 -1
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +3 -2
- package/src/ts/astro-docs/generator.js +2 -0
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/dynamodb/files/src/client.ts.template +5 -2
- package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
- package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
- package/src/ts/dynamodb/files/src/index.ts.template +2 -2
- package/src/ts/dynamodb/generator.js +3 -1
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/lib/generator.js +7 -1
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/lib/ts-project-utils.js +19 -4
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/types.d.ts +6 -0
- package/src/ts/lib/types.js.map +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +94 -8
- package/src/ts/mcp-server/generator.js +3 -2
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/nx-generator/files/local/generator.ts.template +2 -2
- package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +2 -2
- package/src/ts/nx-generator/generator.js +5 -2
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
- package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
- package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +3 -3
- package/src/ts/nx-plugin/generator.js +3 -1
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/utils.js +7 -4
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +149 -177
- package/src/ts/rdb/files/src/create-db-user-handler.ts.template +2 -2
- package/src/ts/rdb/files/src/index.ts.template +1 -1
- package/src/ts/rdb/files/src/migration-handler.ts.template +1 -1
- package/src/ts/rdb/files/src/prisma.ts.template +7 -4
- package/src/ts/rdb/generator.js +7 -4
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/schema.json +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +45 -45
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
- package/src/utils/agent-chat/agent-chat.js +3 -1
- package/src/utils/agent-chat/agent-chat.js.map +1 -1
- package/src/utils/agent-chat/files/a2a/chat.ts.template +1 -1
- package/src/utils/agent-chat/files/ag-ui/chat.ts.template +1 -1
- package/src/utils/agent-chat/files/http-py/chat.ts.template +2 -2
- package/src/utils/agent-chat/files/http-ts/chat.ts.template +1 -1
- package/src/utils/agent-connection/agent-connection.js +4 -1
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +2 -2
- package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +1 -1
- package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +2 -2
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +2 -2
- package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +1 -1
- package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +1 -1
- package/src/utils/agent-connection/files/core-strands/base/with-session-id-strands.ts.template +1 -1
- package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +1 -1
- package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +1 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -3
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +3 -3
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +4 -4
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +1 -1
- package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +27 -0
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +60 -1
- package/src/utils/api-constructs/api-constructs.js +8 -2
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +8 -8
- package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +8 -8
- package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +3 -3
- package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +32 -20
- package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +1 -1
- package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +4 -4
- package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
- package/src/utils/ast.js +16 -0
- package/src/utils/ast.js.map +1 -1
- package/src/utils/commands.d.ts +1 -1
- package/src/utils/commands.js +4 -1
- package/src/utils/commands.js.map +1 -1
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js +9 -2
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
- package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +3 -3
- package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
- package/src/utils/files/common/constructs/src/core/index.ts.template +4 -4
- package/src/utils/files/common/constructs/src/index.ts.template +2 -2
- package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
- package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
- package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
- package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +1 -1
- package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +1 -1
- package/src/utils/files/common/scripts/src/infra/stage-credentials/run.ts.template +3 -3
- package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
- package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
- package/src/utils/function-constructs/function-constructs.js +3 -1
- package/src/utils/function-constructs/function-constructs.js.map +1 -1
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +2 -2
- package/src/utils/identity-constructs/identity-constructs.js +5 -1
- package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
- package/src/utils/module-format.d.ts +28 -0
- package/src/utils/module-format.js +28 -0
- package/src/utils/module-format.js.map +1 -0
- package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +61 -17
- package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +68 -78
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +88 -8
- package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +5 -32
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +11 -1
- package/src/utils/rdb-constructs/rdb-constructs.js +9 -2
- package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
- package/src/utils/shared-constructs.js +12 -22
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-infra-config.js +3 -1
- package/src/utils/shared-infra-config.js.map +1 -1
- package/src/utils/shared-infra-scripts.js +3 -1
- package/src/utils/shared-infra-scripts.js.map +1 -1
- package/src/utils/shared-rdb-scripts.js +5 -1
- package/src/utils/shared-rdb-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.js +3 -1
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/test.d.ts +2 -0
- package/src/utils/test.js +7 -1
- package/src/utils/test.js.map +1 -1
- package/src/utils/versions.d.ts +73 -69
- package/src/utils/versions.js +71 -67
- package/src/utils/versions.js.map +1 -1
- package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
- package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +2 -2
- package/src/utils/website-constructs/website-constructs.js +9 -2
- package/src/utils/website-constructs/website-constructs.js.map +1 -1
- package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/utils/normalise.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport cloneDeepWith from 'lodash.clonedeepwith';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport {\n camelCase,\n pascalCase,\n toClassName,\n upperFirst,\n} from '../../utils/names';\nimport { STREAMING_CONTENT_TYPES } from './codegen-data/types';\nimport { isRef, resolveIfRef, resolveRef, splitRef } from './refs';\nimport type { Spec } from './types';\n\ninterface SubSchema {\n readonly nameParts: string[];\n readonly schema: OpenAPIV3.SchemaObject;\n readonly propPath: (string | number)[];\n}\n\ninterface SubSchemaRef {\n readonly $ref: string;\n readonly name: string;\n readonly schema: OpenAPIV3.SchemaObject;\n}\n\n/**\n * Normalise schema names to valid TypeScript identifiers.\n * Converts names with hyphens or other invalid characters to PascalCase.\n * Throws an error if normalisation would create a name clash.\n */\nconst normaliseSchemaNames = (spec: Spec): Spec => {\n const schemaNameMapping: { [oldName: string]: string } = {};\n const originalNames = Object.keys(spec.components?.schemas ?? {});\n const existingSchemaNames = new Set(originalNames);\n\n // The name each schema resolves to (its normalised form, or itself when it\n // needs no normalisation). Used to detect two distinct schemas that would\n // collapse onto the same identifier.\n const resolvedNameOwners: { [resolvedName: string]: string } = {};\n\n // Build mapping of old names to new names\n originalNames.forEach((name) => {\n const normalizedName = toClassName(name);\n if (normalizedName !== name) {\n // Check if the normalized name would clash with an existing schema\n if (existingSchemaNames.has(normalizedName)) {\n throw new Error(\n `Schema name normalization conflict: \"${name}\" would be normalized to \"${normalizedName}\", but a schema with that name already exists. Please rename one of these schemas in your OpenAPI specification.`,\n );\n }\n schemaNameMapping[name] = normalizedName;\n }\n\n // Detect two distinct schemas resolving to the same name (e.g. \"Foo-Bar\"\n // and \"Foo.Bar\" both normalise to \"FooBar\"), which would otherwise\n // silently overwrite one another.\n const owner = resolvedNameOwners[normalizedName];\n if (owner !== undefined) {\n throw new Error(\n `Schema name normalization conflict: \"${name}\" and \"${owner}\" both normalize to \"${normalizedName}\". Please rename one of these schemas in your OpenAPI specification.`,\n );\n }\n resolvedNameOwners[normalizedName] = name;\n });\n\n // If no normalization needed, return spec as-is\n if (Object.keys(schemaNameMapping).length === 0) {\n return spec;\n }\n\n // Update all $ref references throughout the spec\n spec = cloneDeepWith(spec, (v) => {\n if (isRef(v)) {\n const parts = splitRef(v.$ref);\n if (\n parts.length === 3 &&\n parts[0] === 'components' &&\n parts[1] === 'schemas'\n ) {\n const oldName = parts[2];\n const newName = schemaNameMapping[oldName];\n if (newName) {\n return { $ref: `#/components/schemas/${newName}` };\n }\n }\n }\n });\n\n // Rename schema keys, recording the original name so downstream code can\n // recover the on-the-wire value (e.g. an implicit discriminator matches on\n // the original schema name, not its normalised identifier).\n Object.entries(schemaNameMapping).forEach(([oldName, newName]) => {\n const schema = spec.components!.schemas![oldName];\n if (schema && !isRef(schema)) {\n (schema as { 'x-aws-nx-original-name'?: string })[\n 'x-aws-nx-original-name'\n ] = oldName;\n }\n spec.components!.schemas![newName] = schema;\n delete spec.components!.schemas![oldName];\n });\n\n return spec;\n};\n\nconst isCompositeSchema = (schema: OpenAPIV3.SchemaObject) =>\n !!schema.allOf || !!schema.anyOf || !!schema.oneOf;\n\n/**\n * The media type whose schema is hoisted for a request/response: prefer\n * `application/json`, falling back to any `+json` vendored type (e.g.\n * `application/problem+json`).\n */\nconst preferredJsonMediaType = (mediaTypes: string[]): string | undefined =>\n mediaTypes.find((mediaType) => mediaType === 'application/json') ??\n mediaTypes.find((mediaType) => mediaType.split(';')[0].endsWith('+json'));\n\nconst hasSubSchemasToVisit = (\n schema?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject,\n): schema is OpenAPIV3.SchemaObject =>\n !!schema &&\n !isRef(schema) &&\n (['object', 'array'].includes(schema.type as any) ||\n isCompositeSchema(schema) ||\n !!schema.not ||\n (schema.type === 'string' && !!schema.enum));\n\nconst filterInlineCompositeSchemas = (\n schemas: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[],\n nameParts: string[],\n namePartPrefix: string,\n propPath: (string | number)[],\n): SubSchema[] => {\n let inlineSchemaIndex = 0;\n return schemas.flatMap((s, i) => {\n if (hasSubSchemasToVisit(s)) {\n const subSchema: SubSchema = {\n nameParts: s.title\n ? [pascalCase(s.title)]\n : [\n ...nameParts,\n `${namePartPrefix}${inlineSchemaIndex === 0 ? '' : inlineSchemaIndex}`,\n ],\n schema: s,\n propPath: [...propPath, i],\n };\n inlineSchemaIndex++;\n return [subSchema];\n }\n return [];\n });\n};\n\n/**\n * Returns a unique model/schema name for any models which we hoist\n */\nconst createUniqueModelName = (\n nameParts: string[],\n seenModelNameCounts: { [name: string]: number },\n): string => {\n // Normalise each part to a class-name form (stripping `_`, hyphens, etc) so\n // the hoisted schema name matches what `toTypeScriptModelName`/`toClassName`\n // later derive — otherwise a part like `store_photos` yields a `Store_photos`\n // schema whose reference (`StorePhotos`) no longer resolves.\n const candidateName = nameParts.map(toClassName).join('');\n\n const seenModelNameCount = seenModelNameCounts[candidateName];\n\n // We have not seen this name so we're free to use it\n if (seenModelNameCount === undefined) {\n seenModelNameCounts[candidateName] = 1;\n return candidateName;\n }\n\n // We have seen the name before, so we must disambiguate\n seenModelNameCounts[candidateName]++;\n return `${candidateName}${seenModelNameCount}`;\n};\n\nconst hoistInlineObjectSubSchemas = (\n nameParts: string[],\n schema: OpenAPIV3.SchemaObject,\n seenModelNameCounts: { [name: string]: number },\n): SubSchemaRef[] => {\n // Find all the inline subschemas we should visit\n const inlineSubSchemas: SubSchema[] = [\n ...(hasSubSchemasToVisit(schema.not)\n ? [\n {\n nameParts: schema.not?.title\n ? [pascalCase(schema.not?.title)]\n : [...nameParts, 'Not'],\n schema: schema.not,\n propPath: ['not'],\n },\n ]\n : []),\n ...(schema.anyOf\n ? filterInlineCompositeSchemas(schema.anyOf, nameParts, 'AnyOf', [\n 'anyOf',\n ])\n : []),\n ...(schema.allOf\n ? filterInlineCompositeSchemas(schema.allOf, nameParts, 'AllOf', [\n 'allOf',\n ])\n : []),\n ...(schema.oneOf\n ? filterInlineCompositeSchemas(schema.oneOf, nameParts, 'OneOf', [\n 'oneOf',\n ])\n : []),\n ...('items' in schema && hasSubSchemasToVisit(schema.items)\n ? [\n {\n nameParts: schema.items?.title\n ? [pascalCase(schema.items?.title)]\n : [...nameParts, 'Item'],\n schema: schema.items,\n propPath: ['items'],\n },\n ]\n : []),\n ...Object.entries(schema.properties ?? {})\n .filter(([, s]) => hasSubSchemasToVisit(s))\n .map(([name, s]) => ({\n nameParts: (s as OpenAPIV3.SchemaObject).title\n ? [pascalCase((s as OpenAPIV3.SchemaObject).title)]\n : [...nameParts, name],\n schema: s as OpenAPIV3.SchemaObject,\n propPath: ['properties', name],\n })),\n ...(typeof schema.additionalProperties !== 'boolean' &&\n hasSubSchemasToVisit(schema.additionalProperties)\n ? [\n {\n nameParts: schema.additionalProperties?.title\n ? [pascalCase(schema.additionalProperties?.title)]\n : [...nameParts, 'Value'],\n schema: schema.additionalProperties,\n propPath: ['additionalProperties'],\n },\n ]\n : []),\n ...Object.entries((schema as any).patternProperties ?? {})\n .filter(([, s]) => hasSubSchemasToVisit(s))\n .map(([pattern, s], i) => ({\n nameParts: (s as OpenAPIV3.SchemaObject).title\n ? [pascalCase((s as OpenAPIV3.SchemaObject).title)]\n : [...nameParts, pascalCase(pattern), `${i}`],\n schema: s as OpenAPIV3.SchemaObject,\n propPath: ['patternProperties', pattern],\n })),\n ];\n\n // Hoist these recursively first (ie depth first search) so that we don't miss refs\n const recursiveRefs = inlineSubSchemas.flatMap((s) =>\n hoistInlineObjectSubSchemas(s.nameParts, s.schema, seenModelNameCounts),\n );\n\n // Clone the object subschemas to build the refs. Note that only objects with \"properties\" are hoisted as these are non-dictionary types\n const refs = inlineSubSchemas\n .filter(\n (s) =>\n (s.schema.type === 'object' && s.schema.properties) ||\n isCompositeSchema(s.schema) ||\n (s.schema.type === 'object' && (s.schema as any).patternProperties) ||\n (s.schema.type === 'string' && s.schema.enum),\n )\n .map((s) => {\n const name = createUniqueModelName(s.nameParts, seenModelNameCounts);\n\n const $ref = `#/components/schemas/${name}`;\n const ref = {\n $ref,\n name,\n schema: structuredClone({\n ...s.schema,\n 'x-aws-nx-hoisted': true,\n }),\n };\n\n // Replace each subschema with a ref in the spec\n const schemaWithPropToReplace = s.propPath\n .slice(0, -1)\n .reduce(\n (resolvedInSchema, pathPart) => resolvedInSchema?.[pathPart],\n schema,\n );\n if (schemaWithPropToReplace) {\n schemaWithPropToReplace[s.propPath[s.propPath.length - 1]] = { $ref };\n }\n\n return ref;\n });\n\n return [...refs, ...recursiveRefs];\n};\n\n/**\n * Rewrites OpenAPI 3.1 `const` schemas to the semantically equivalent `enum`\n * form. FastAPI emits `{type: 'string', const: 'X'}` for `Literal['X']`; the\n * parser understands the enum shape, whereas the const shape would synthesise\n * phantom named references.\n */\nconst rewriteConstToEnum = (spec: Spec): Spec => {\n const rewrite = (v: any): any => {\n if (\n v &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n 'const' in v &&\n !('enum' in v)\n ) {\n const { const: constValue, ...rest } = v;\n // Recurse with the same rewrite so consts nested within a rewritten\n // schema are also rewritten.\n return cloneDeepWith({ ...rest, enum: [constValue] }, rewrite);\n }\n };\n return cloneDeepWith(spec, rewrite);\n};\n\n/**\n * Rewrites a composite schema with sibling `properties`/`required` (a valid\n * JSON Schema conjunction, common in FastAPI/Pydantic output) into an\n * equivalent extra `allOf` member, so the parser sees a pure composite and the\n * sibling fields are neither dropped from the type nor stripped when\n * marshalling.\n */\nconst rewriteCompositeSiblingProperties = (spec: Spec): Spec => {\n const rewrite = (v: any): any => {\n if (\n v &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n Array.isArray(v.allOf) &&\n v.properties\n ) {\n const { properties, required, type: _type, ...rest } = v;\n return cloneDeepWith(\n {\n ...rest,\n allOf: [\n ...v.allOf,\n {\n type: 'object',\n properties,\n ...(required ? { required } : {}),\n },\n ],\n },\n rewrite,\n );\n }\n };\n return cloneDeepWith(spec, rewrite);\n};\n\n/**\n * Rewrites an OpenAPI 3.1 multi-type schema (`type: ['integer', 'string']`)\n * into the equivalent `anyOf` of single-type schemas, dropping `null` from the\n * list and marking the schema nullable instead. This lets the parser render a\n * proper union rather than collapsing to the first declared type.\n */\nconst rewriteMultiTypeToAnyOf = (spec: Spec): Spec => {\n const rewrite = (v: any): any => {\n if (\n v &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n Array.isArray(v.type) &&\n !('anyOf' in v) &&\n !('oneOf' in v) &&\n !('allOf' in v) &&\n !('enum' in v)\n ) {\n const { type, nullable, ...rest } = v;\n const nonNull = (type as string[]).filter((t) => t !== 'null');\n const isNullable = nullable === true || nonNull.length !== type.length;\n // Recurse with the same rewrite so multi-type schemas nested within a\n // rewritten schema (e.g. the items of a nullable array) are also\n // rewritten.\n // A single non-null type is not a union; keep it as a plain typed schema.\n if (nonNull.length <= 1) {\n return cloneDeepWith(\n {\n ...rest,\n ...(nonNull.length === 1 ? { type: nonNull[0] } : {}),\n ...(isNullable ? { nullable: true } : {}),\n },\n rewrite,\n );\n }\n return cloneDeepWith(\n {\n ...rest,\n anyOf: nonNull.map((t) => ({ type: t })),\n ...(isNullable ? { nullable: true } : {}),\n },\n rewrite,\n );\n }\n };\n return cloneDeepWith(spec, rewrite);\n};\n\n/**\n * Inlines `$ref` path items so that every operation is visited by the\n * normalisation below (operationId assignment, schema hoisting). Each path\n * gets its own copy, so paths sharing a path item are normalised\n * independently.\n */\nconst inlinePathItemRefs = (spec: Spec): void => {\n Object.entries(spec.paths ?? {}).forEach(([path, pathItem]) => {\n if (isRef(pathItem)) {\n const { $ref, ...rest } = pathItem;\n spec.paths![path] = {\n ...structuredClone(resolveRef(spec, $ref)),\n ...rest,\n };\n }\n });\n};\n\n/**\n * In order to ensure we generate models consistently whether or not users used refs or inline schemas,\n * we hoist any inline refs to non-primitives\n */\nexport const normaliseOpenApiSpecForCodeGen = (inSpec: Spec): Spec => {\n // Clone the spec so we're free to mutate it\n let spec = cloneDeepWith(inSpec);\n\n inlinePathItemRefs(spec);\n spec = rewriteConstToEnum(spec);\n spec = rewriteMultiTypeToAnyOf(spec);\n spec = rewriteCompositeSiblingProperties(spec);\n\n // Ensure spec has schemas set\n if (!spec?.components?.schemas) {\n spec.components = {\n ...spec.components,\n };\n spec.components.schemas = {\n ...spec.components.schemas,\n };\n }\n\n const seenOperationIds = new Set<string>();\n const duplicatedOperationIds = new Set<string>();\n\n // Make sure all operationIds are camelCase, and find which ones are duplicated\n Object.entries(spec.paths ?? {}).forEach(([path, pathOps]) =>\n Object.entries(pathOps ?? {}).forEach(([method, op]) => {\n const operation = resolveIfRef(spec, op);\n if (operation && typeof operation === 'object') {\n const operationId = camelCase(\n (operation as any).operationId ?? `${method}-${path}`,\n );\n (operation as any).operationId = operationId;\n if (seenOperationIds.has(operationId)) {\n duplicatedOperationIds.add(operationId);\n }\n seenOperationIds.add(operationId);\n }\n }),\n );\n\n // Reset seen operation ids\n seenOperationIds.clear();\n\n const untagged = Symbol('untagged');\n const seenOperationIdsByTag: { [tag: string | symbol]: Set<string> } = {};\n\n // \"Hoist\" inline request and response schemas\n Object.entries(spec.paths ?? {}).forEach(([path, pathOps]) =>\n Object.entries(pathOps ?? {}).forEach(([method, op]) => {\n const operation = resolveIfRef(spec, op);\n if (operation && typeof operation === 'object') {\n const tags: string[] = (operation as any).tags ?? [];\n const operationId = (operation as any).operationId as string;\n\n // Allow operations to have the same id\n let deduplicatedOpId = operationId;\n let deduplicatedDotNotationOpId = operationId;\n\n // Attempt to deduplicate the operationId by its tags\n if (duplicatedOperationIds.has(operationId)) {\n deduplicatedOpId = camelCase(\n tags.map((t) => `${t}-`).join('') + operationId,\n );\n deduplicatedDotNotationOpId =\n tags.map((t) => `${camelCase(t)}.`).join('') +\n camelCase(operationId);\n }\n\n (operation as any)['x-aws-nx-deduplicated-op-id'] = deduplicatedOpId;\n (operation as any)['x-aws-nx-deduplicated-dot-op-id'] =\n deduplicatedDotNotationOpId;\n\n seenOperationIds.add(deduplicatedOpId);\n\n // Throw an error for any duplicated operation ids with the same tag, or untagged\n [...(tags.length === 0 ? [untagged] : tags)].forEach((tag) => {\n if (\n seenOperationIdsByTag[tag] &&\n seenOperationIdsByTag[tag].has(operationId)\n ) {\n throw new Error(\n tag === untagged\n ? `Untagged operations cannot have the same operationId (${operationId})`\n : `Operations with the same tag (${String(tag)}) cannot have the same operationId (${operationId})`,\n );\n }\n\n seenOperationIdsByTag[tag] = new Set([\n ...(seenOperationIdsByTag[tag] ?? []),\n operationId,\n ]);\n });\n\n if ('responses' in operation) {\n Object.entries(operation.responses ?? {}).forEach(([code, res]) => {\n const response = resolveIfRef(spec, res);\n const jsonMediaType = preferredJsonMediaType(\n Object.keys(response?.content ?? {}),\n );\n const jsonResponseSchema = jsonMediaType\n ? response!.content![jsonMediaType].schema\n : undefined;\n if (\n jsonResponseSchema &&\n !isRef(jsonResponseSchema) &&\n (['object', 'array'].includes(jsonResponseSchema.type!) ||\n isCompositeSchema(jsonResponseSchema) ||\n (jsonResponseSchema?.type === 'string' &&\n jsonResponseSchema.enum))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}${code}Response`;\n spec.components!.schemas![schemaName] = jsonResponseSchema;\n response!.content![jsonMediaType!].schema = {\n $ref: `#/components/schemas/${schemaName}`,\n };\n }\n\n // Hoist inline streaming item schemas (OpenAPI 3.2 itemSchema) so\n // each streamed item gets a named model.\n STREAMING_CONTENT_TYPES.forEach((mediaType) => {\n const streamingContent = response?.content?.[mediaType] as\n | { itemSchema?: OpenAPIV3.SchemaObject }\n | undefined;\n const itemSchema = streamingContent?.itemSchema;\n if (\n itemSchema &&\n !isRef(itemSchema) &&\n (['object', 'array'].includes(itemSchema.type!) ||\n isCompositeSchema(itemSchema) ||\n (itemSchema.type === 'string' && itemSchema.enum))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}${code}ResponseItem`;\n spec.components!.schemas![schemaName] = itemSchema;\n streamingContent.itemSchema = {\n $ref: `#/components/schemas/${schemaName}`,\n } as OpenAPIV3.SchemaObject;\n }\n });\n });\n }\n if ('requestBody' in operation) {\n const requestBody = resolveIfRef(spec, operation.requestBody);\n const contentMediaTypes = Object.keys(requestBody?.content ?? {});\n // Hoist the JSON body, falling back to a form-data body (multipart or\n // urlencoded) so an inline form object is fully typed and marshalled\n // rather than left `unknown`.\n const bodyMediaType =\n preferredJsonMediaType(contentMediaTypes) ??\n contentMediaTypes.find((mt) =>\n [\n 'multipart/form-data',\n 'application/x-www-form-urlencoded',\n ].includes(mt.split(';')[0]),\n );\n const bodyRequestSchema = bodyMediaType\n ? requestBody!.content![bodyMediaType].schema\n : undefined;\n if (\n bodyRequestSchema &&\n !isRef(bodyRequestSchema) &&\n (['object', 'array'].includes(bodyRequestSchema.type!) ||\n isCompositeSchema(bodyRequestSchema) ||\n (bodyRequestSchema?.type === 'string' && bodyRequestSchema.enum))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}RequestContent`;\n spec.components!.schemas![schemaName] = bodyRequestSchema;\n requestBody!.content![bodyMediaType!].schema = {\n $ref: `#/components/schemas/${schemaName}`,\n };\n }\n }\n\n // Hoist parameter schemas. Composite and inline-object schemas are\n // hoisted to named models so the parameter is fully typed (e.g. a\n // `deepObject` query param's members are marshalled, not left `unknown`).\n if ('parameters' in operation) {\n (operation.parameters ?? []).forEach((p) => {\n const param = resolveIfRef(spec, p);\n const paramSchema = param?.schema as\n | OpenAPIV3.SchemaObject\n | undefined;\n if (\n paramSchema &&\n !isRef(paramSchema) &&\n (isCompositeSchema(paramSchema) ||\n (paramSchema.type === 'object' && !!paramSchema.properties))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}Request${upperFirst(param.in)}${upperFirst(camelCase(param.name))}`;\n spec.components!.schemas![schemaName] = paramSchema;\n param.schema = { $ref: `#/components/schemas/${schemaName}` };\n }\n });\n }\n }\n }),\n );\n\n // Normalize schema names to valid TypeScript identifiers (e.g., \"Message-Output\" -> \"MessageOutput\")\n spec = normaliseSchemaNames(spec);\n\n // Initialise the models that we have seen with all schemas.\n // This is required to ensure we do not create any clashing models below\n const seenModelNameCounts = Object.fromEntries(\n Object.keys(spec.components?.schemas ?? {}).map((name) => [name, 1]),\n );\n\n // \"Hoist\" any nested object definitions in arrays/maps that aren't already refs, as parseOpenapi will treat the\n // type as \"any\" if they're defined inline (and not a ref)\n Object.entries(spec.components?.schemas ?? {}).forEach(([name, schema]) => {\n if (!isRef(schema)) {\n const refs = hoistInlineObjectSubSchemas(\n [name],\n schema,\n seenModelNameCounts,\n );\n refs.forEach((ref) => {\n spec.components!.schemas![ref.name] = ref.schema;\n });\n }\n });\n\n // \"Inline\" any refs to non objects/enums\n const inlinedRefs: Set<string> = new Set();\n spec = cloneDeepWith(spec, (v) => {\n if (v && typeof v === 'object' && v.$ref) {\n const resolved = resolveRef(spec, v.$ref);\n if (\n resolved &&\n resolved.type &&\n resolved.type !== 'object' &&\n !(resolved.type === 'string' && resolved.enum)\n ) {\n inlinedRefs.add(v.$ref);\n return resolved;\n }\n }\n });\n\n // Delete the non object schemas that were inlined\n [...inlinedRefs].forEach((ref) => {\n const parts = splitRef(ref);\n if (\n parts.length === 3 &&\n parts[0] === 'components' &&\n parts[1] === 'schemas'\n ) {\n delete spec.components!.schemas![parts[2]];\n }\n });\n\n return spec;\n};\n"],"names":["cloneDeepWith","camelCase","pascalCase","toClassName","upperFirst","STREAMING_CONTENT_TYPES","isRef","resolveIfRef","resolveRef","splitRef","normaliseSchemaNames","spec","schemaNameMapping","originalNames","Object","keys","components","schemas","existingSchemaNames","Set","resolvedNameOwners","forEach","name","normalizedName","has","Error","owner","undefined","length","v","parts","$ref","oldName","newName","entries","schema","isCompositeSchema","allOf","anyOf","oneOf","preferredJsonMediaType","mediaTypes","find","mediaType","split","endsWith","hasSubSchemasToVisit","includes","type","not","enum","filterInlineCompositeSchemas","nameParts","namePartPrefix","propPath","inlineSchemaIndex","flatMap","s","i","subSchema","title","createUniqueModelName","seenModelNameCounts","candidateName","map","join","seenModelNameCount","hoistInlineObjectSubSchemas","inlineSubSchemas","items","properties","filter","additionalProperties","patternProperties","pattern","recursiveRefs","refs","ref","structuredClone","schemaWithPropToReplace","slice","reduce","resolvedInSchema","pathPart","rewriteConstToEnum","rewrite","Array","isArray","const","constValue","rest","rewriteCompositeSiblingProperties","required","_type","rewriteMultiTypeToAnyOf","nullable","nonNull","t","isNullable","inlinePathItemRefs","paths","path","pathItem","normaliseOpenApiSpecForCodeGen","inSpec","seenOperationIds","duplicatedOperationIds","pathOps","method","op","operation","operationId","add","clear","untagged","Symbol","seenOperationIdsByTag","tags","deduplicatedOpId","deduplicatedDotNotationOpId","tag","String","responses","code","res","response","jsonMediaType","content","jsonResponseSchema","schemaName","streamingContent","itemSchema","requestBody","contentMediaTypes","bodyMediaType","mt","bodyRequestSchema","parameters","p","param","paramSchema","in","fromEntries","inlinedRefs","resolved"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/utils/normalise.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport cloneDeepWith from 'lodash.clonedeepwith';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport {\n camelCase,\n pascalCase,\n toClassName,\n upperFirst,\n} from '../../utils/names';\nimport { STREAMING_CONTENT_TYPES } from './codegen-data/types';\nimport { isRef, resolveIfRef, resolveRef, splitRef } from './refs';\nimport type { Spec } from './types';\n\ninterface SubSchema {\n readonly nameParts: string[];\n readonly schema: OpenAPIV3.SchemaObject;\n readonly propPath: (string | number)[];\n}\n\ninterface SubSchemaRef {\n readonly $ref: string;\n readonly name: string;\n readonly schema: OpenAPIV3.SchemaObject;\n}\n\n/**\n * Normalise schema names to valid TypeScript identifiers.\n * Converts names with hyphens or other invalid characters to PascalCase.\n * Throws an error if normalisation would create a name clash.\n */\nconst normaliseSchemaNames = (spec: Spec): Spec => {\n const schemaNameMapping: { [oldName: string]: string } = {};\n const originalNames = Object.keys(spec.components?.schemas ?? {});\n const existingSchemaNames = new Set(originalNames);\n\n // The name each schema resolves to (its normalised form, or itself when it\n // needs no normalisation). Used to detect two distinct schemas that would\n // collapse onto the same identifier.\n const resolvedNameOwners: { [resolvedName: string]: string } = {};\n\n // Build mapping of old names to new names\n originalNames.forEach((name) => {\n const normalizedName = toClassName(name);\n if (normalizedName !== name) {\n // Check if the normalized name would clash with an existing schema\n if (existingSchemaNames.has(normalizedName)) {\n throw new Error(\n `Schema name normalization conflict: \"${name}\" would be normalized to \"${normalizedName}\", but a schema with that name already exists. Please rename one of these schemas in your OpenAPI specification.`,\n );\n }\n schemaNameMapping[name] = normalizedName;\n }\n\n // Detect two distinct schemas resolving to the same name (e.g. \"Foo-Bar\"\n // and \"Foo.Bar\" both normalise to \"FooBar\"), which would otherwise\n // silently overwrite one another.\n const owner = resolvedNameOwners[normalizedName];\n if (owner !== undefined) {\n throw new Error(\n `Schema name normalization conflict: \"${name}\" and \"${owner}\" both normalize to \"${normalizedName}\". Please rename one of these schemas in your OpenAPI specification.`,\n );\n }\n resolvedNameOwners[normalizedName] = name;\n });\n\n // If no normalization needed, return spec as-is\n if (Object.keys(schemaNameMapping).length === 0) {\n return spec;\n }\n\n // Update all $ref references throughout the spec\n spec = cloneDeepWith(spec, (v) => {\n if (isRef(v)) {\n const parts = splitRef(v.$ref);\n if (\n parts.length === 3 &&\n parts[0] === 'components' &&\n parts[1] === 'schemas'\n ) {\n const oldName = parts[2];\n const newName = schemaNameMapping[oldName];\n if (newName) {\n return { $ref: `#/components/schemas/${newName}` };\n }\n }\n }\n });\n\n // Rename schema keys, recording the original name so downstream code can\n // recover the on-the-wire value (e.g. an implicit discriminator matches on\n // the original schema name, not its normalised identifier).\n Object.entries(schemaNameMapping).forEach(([oldName, newName]) => {\n const schema = spec.components!.schemas![oldName];\n if (schema && !isRef(schema)) {\n (schema as { 'x-aws-nx-original-name'?: string })[\n 'x-aws-nx-original-name'\n ] = oldName;\n }\n spec.components!.schemas![newName] = schema;\n delete spec.components!.schemas![oldName];\n });\n\n return spec;\n};\n\nconst isCompositeSchema = (schema: OpenAPIV3.SchemaObject) =>\n !!schema.allOf || !!schema.anyOf || !!schema.oneOf;\n\n/**\n * The media type whose schema is hoisted for a request/response: prefer\n * `application/json`, falling back to any `+json` vendored type (e.g.\n * `application/problem+json`).\n */\nconst preferredJsonMediaType = (mediaTypes: string[]): string | undefined =>\n mediaTypes.find((mediaType) => mediaType === 'application/json') ??\n mediaTypes.find((mediaType) => mediaType.split(';')[0].endsWith('+json'));\n\nconst FORM_MEDIA_TYPES = [\n 'multipart/form-data',\n 'application/x-www-form-urlencoded',\n];\n\nconst isFormMediaType = (mediaType: string): boolean =>\n FORM_MEDIA_TYPES.includes(mediaType.split(';')[0]);\n\n/**\n * Whether a `contentMediaType` denotes binary (rather than textual/JSON)\n * content — an octet-stream, image, audio, etc.\n */\nconst isBinaryContentMediaType = (contentMediaType: string): boolean =>\n !(\n contentMediaType.startsWith('text/') ||\n contentMediaType === 'application/json' ||\n contentMediaType.endsWith('+json') ||\n contentMediaType === 'application/xml'\n );\n\n/**\n * Rewrite file string fields of a form body to `format: binary` so the\n * generator types them as `Blob`. FastAPI emits an identical schema\n * (`{type: string, contentMediaType: ...}`) for a multipart file field and for\n * `bytes` in a JSON body; only the enclosing media type distinguishes them, so\n * this promotion is scoped to form bodies. A base64 `contentEncoding` or a\n * textual/JSON `contentMediaType` keeps the field a string. `format: binary` is\n * left untouched (already binary anywhere).\n */\nconst markFormBinaryFields = (schema: OpenAPIV3.SchemaObject): void => {\n Object.values(schema.properties ?? {}).forEach((prop) => {\n if (isRef(prop)) return;\n const s = prop as OpenAPIV3.SchemaObject & {\n contentMediaType?: string;\n contentEncoding?: string;\n };\n if (\n s.type === 'string' &&\n s.format !== 'binary' &&\n s.contentMediaType &&\n !s.contentEncoding &&\n isBinaryContentMediaType(s.contentMediaType)\n ) {\n s.format = 'binary';\n }\n });\n};\n\nconst hasSubSchemasToVisit = (\n schema?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject,\n): schema is OpenAPIV3.SchemaObject =>\n !!schema &&\n !isRef(schema) &&\n (['object', 'array'].includes(schema.type as any) ||\n isCompositeSchema(schema) ||\n !!schema.not ||\n (schema.type === 'string' && !!schema.enum));\n\nconst filterInlineCompositeSchemas = (\n schemas: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[],\n nameParts: string[],\n namePartPrefix: string,\n propPath: (string | number)[],\n): SubSchema[] => {\n let inlineSchemaIndex = 0;\n return schemas.flatMap((s, i) => {\n if (hasSubSchemasToVisit(s)) {\n const subSchema: SubSchema = {\n nameParts: s.title\n ? [pascalCase(s.title)]\n : [\n ...nameParts,\n `${namePartPrefix}${inlineSchemaIndex === 0 ? '' : inlineSchemaIndex}`,\n ],\n schema: s,\n propPath: [...propPath, i],\n };\n inlineSchemaIndex++;\n return [subSchema];\n }\n return [];\n });\n};\n\n/**\n * Returns a unique model/schema name for any models which we hoist\n */\nconst createUniqueModelName = (\n nameParts: string[],\n seenModelNameCounts: { [name: string]: number },\n): string => {\n // Normalise each part to a class-name form (stripping `_`, hyphens, etc) so\n // the hoisted schema name matches what `toTypeScriptModelName`/`toClassName`\n // later derive — otherwise a part like `store_photos` yields a `Store_photos`\n // schema whose reference (`StorePhotos`) no longer resolves.\n const candidateName = nameParts.map(toClassName).join('');\n\n const seenModelNameCount = seenModelNameCounts[candidateName];\n\n // We have not seen this name so we're free to use it\n if (seenModelNameCount === undefined) {\n seenModelNameCounts[candidateName] = 1;\n return candidateName;\n }\n\n // We have seen the name before, so we must disambiguate\n seenModelNameCounts[candidateName]++;\n return `${candidateName}${seenModelNameCount}`;\n};\n\nconst hoistInlineObjectSubSchemas = (\n nameParts: string[],\n schema: OpenAPIV3.SchemaObject,\n seenModelNameCounts: { [name: string]: number },\n): SubSchemaRef[] => {\n // Find all the inline subschemas we should visit\n const inlineSubSchemas: SubSchema[] = [\n ...(hasSubSchemasToVisit(schema.not)\n ? [\n {\n nameParts: schema.not?.title\n ? [pascalCase(schema.not?.title)]\n : [...nameParts, 'Not'],\n schema: schema.not,\n propPath: ['not'],\n },\n ]\n : []),\n ...(schema.anyOf\n ? filterInlineCompositeSchemas(schema.anyOf, nameParts, 'AnyOf', [\n 'anyOf',\n ])\n : []),\n ...(schema.allOf\n ? filterInlineCompositeSchemas(schema.allOf, nameParts, 'AllOf', [\n 'allOf',\n ])\n : []),\n ...(schema.oneOf\n ? filterInlineCompositeSchemas(schema.oneOf, nameParts, 'OneOf', [\n 'oneOf',\n ])\n : []),\n ...('items' in schema && hasSubSchemasToVisit(schema.items)\n ? [\n {\n nameParts: schema.items?.title\n ? [pascalCase(schema.items?.title)]\n : [...nameParts, 'Item'],\n schema: schema.items,\n propPath: ['items'],\n },\n ]\n : []),\n ...(\n (schema as { prefixItems?: OpenAPIV3.SchemaObject[] }).prefixItems ?? []\n ).flatMap((s, i) =>\n hasSubSchemasToVisit(s)\n ? [\n {\n nameParts: s.title\n ? [pascalCase(s.title)]\n : [...nameParts, 'Item', `${i}`],\n schema: s,\n propPath: ['prefixItems', i],\n },\n ]\n : [],\n ),\n ...Object.entries(schema.properties ?? {})\n .filter(([, s]) => hasSubSchemasToVisit(s))\n .map(([name, s]) => ({\n nameParts: (s as OpenAPIV3.SchemaObject).title\n ? [pascalCase((s as OpenAPIV3.SchemaObject).title)]\n : [...nameParts, name],\n schema: s as OpenAPIV3.SchemaObject,\n propPath: ['properties', name],\n })),\n ...(typeof schema.additionalProperties !== 'boolean' &&\n hasSubSchemasToVisit(schema.additionalProperties)\n ? [\n {\n nameParts: schema.additionalProperties?.title\n ? [pascalCase(schema.additionalProperties?.title)]\n : [...nameParts, 'Value'],\n schema: schema.additionalProperties,\n propPath: ['additionalProperties'],\n },\n ]\n : []),\n ...Object.entries((schema as any).patternProperties ?? {})\n .filter(([, s]) => hasSubSchemasToVisit(s))\n .map(([pattern, s], i) => ({\n nameParts: (s as OpenAPIV3.SchemaObject).title\n ? [pascalCase((s as OpenAPIV3.SchemaObject).title)]\n : [...nameParts, pascalCase(pattern), `${i}`],\n schema: s as OpenAPIV3.SchemaObject,\n propPath: ['patternProperties', pattern],\n })),\n ];\n\n // Hoist these recursively first (ie depth first search) so that we don't miss refs\n const recursiveRefs = inlineSubSchemas.flatMap((s) =>\n hoistInlineObjectSubSchemas(s.nameParts, s.schema, seenModelNameCounts),\n );\n\n // Clone the object subschemas to build the refs. Note that only objects with \"properties\" are hoisted as these are non-dictionary types\n const refs = inlineSubSchemas\n .filter(\n (s) =>\n (s.schema.type === 'object' && s.schema.properties) ||\n isCompositeSchema(s.schema) ||\n (s.schema.type === 'object' && (s.schema as any).patternProperties) ||\n (s.schema.type === 'string' && s.schema.enum),\n )\n .map((s) => {\n const name = createUniqueModelName(s.nameParts, seenModelNameCounts);\n\n const $ref = `#/components/schemas/${name}`;\n const ref = {\n $ref,\n name,\n schema: structuredClone({\n ...s.schema,\n 'x-aws-nx-hoisted': true,\n }),\n };\n\n // Replace each subschema with a ref in the spec\n const schemaWithPropToReplace = s.propPath\n .slice(0, -1)\n .reduce(\n (resolvedInSchema, pathPart) => resolvedInSchema?.[pathPart],\n schema,\n );\n if (schemaWithPropToReplace) {\n schemaWithPropToReplace[s.propPath[s.propPath.length - 1]] = { $ref };\n }\n\n return ref;\n });\n\n return [...refs, ...recursiveRefs];\n};\n\n/**\n * Rewrites OpenAPI 3.1 `const` schemas to the semantically equivalent `enum`\n * form. FastAPI emits `{type: 'string', const: 'X'}` for `Literal['X']`; the\n * parser understands the enum shape, whereas the const shape would synthesise\n * phantom named references.\n */\nconst rewriteConstToEnum = (spec: Spec): Spec => {\n const rewrite = (v: any): any => {\n if (\n v &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n 'const' in v &&\n !('enum' in v)\n ) {\n const { const: constValue, ...rest } = v;\n // Recurse with the same rewrite so consts nested within a rewritten\n // schema are also rewritten.\n return cloneDeepWith({ ...rest, enum: [constValue] }, rewrite);\n }\n };\n return cloneDeepWith(spec, rewrite);\n};\n\n/**\n * Rewrites a composite schema with sibling `properties`/`required` (a valid\n * JSON Schema conjunction, common in FastAPI/Pydantic output) into an\n * equivalent extra `allOf` member, so the parser sees a pure composite and the\n * sibling fields are neither dropped from the type nor stripped when\n * marshalling.\n */\nconst rewriteCompositeSiblingProperties = (spec: Spec): Spec => {\n const rewrite = (v: any): any => {\n if (\n v &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n Array.isArray(v.allOf) &&\n v.properties\n ) {\n const { properties, required, type: _type, ...rest } = v;\n return cloneDeepWith(\n {\n ...rest,\n allOf: [\n ...v.allOf,\n {\n type: 'object',\n properties,\n ...(required ? { required } : {}),\n },\n ],\n },\n rewrite,\n );\n }\n };\n return cloneDeepWith(spec, rewrite);\n};\n\n/**\n * Rewrites an OpenAPI 3.1 multi-type schema (`type: ['integer', 'string']`)\n * into the equivalent `anyOf` of single-type schemas, dropping `null` from the\n * list and marking the schema nullable instead. This lets the parser render a\n * proper union rather than collapsing to the first declared type.\n */\nconst rewriteMultiTypeToAnyOf = (spec: Spec): Spec => {\n const rewrite = (v: any): any => {\n if (\n v &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n Array.isArray(v.type) &&\n !('anyOf' in v) &&\n !('oneOf' in v) &&\n !('allOf' in v) &&\n !('enum' in v)\n ) {\n const { type, nullable, ...rest } = v;\n const nonNull = (type as string[]).filter((t) => t !== 'null');\n const isNullable = nullable === true || nonNull.length !== type.length;\n // Recurse with the same rewrite so multi-type schemas nested within a\n // rewritten schema (e.g. the items of a nullable array) are also\n // rewritten.\n // A single non-null type is not a union; keep it as a plain typed schema.\n if (nonNull.length <= 1) {\n return cloneDeepWith(\n {\n ...rest,\n ...(nonNull.length === 1 ? { type: nonNull[0] } : {}),\n ...(isNullable ? { nullable: true } : {}),\n },\n rewrite,\n );\n }\n return cloneDeepWith(\n {\n ...rest,\n anyOf: nonNull.map((t) => ({ type: t })),\n ...(isNullable ? { nullable: true } : {}),\n },\n rewrite,\n );\n }\n };\n return cloneDeepWith(spec, rewrite);\n};\n\n/**\n * Inlines `$ref` path items so that every operation is visited by the\n * normalisation below (operationId assignment, schema hoisting). Each path\n * gets its own copy, so paths sharing a path item are normalised\n * independently.\n */\nconst inlinePathItemRefs = (spec: Spec): void => {\n Object.entries(spec.paths ?? {}).forEach(([path, pathItem]) => {\n if (isRef(pathItem)) {\n const { $ref, ...rest } = pathItem;\n spec.paths![path] = {\n ...structuredClone(resolveRef(spec, $ref)),\n ...rest,\n };\n }\n });\n};\n\n/**\n * In order to ensure we generate models consistently whether or not users used refs or inline schemas,\n * we hoist any inline refs to non-primitives\n */\nexport const normaliseOpenApiSpecForCodeGen = (inSpec: Spec): Spec => {\n // Clone the spec so we're free to mutate it\n let spec = cloneDeepWith(inSpec);\n\n inlinePathItemRefs(spec);\n spec = rewriteConstToEnum(spec);\n spec = rewriteMultiTypeToAnyOf(spec);\n spec = rewriteCompositeSiblingProperties(spec);\n\n // Ensure spec has schemas set\n if (!spec?.components?.schemas) {\n spec.components = {\n ...spec.components,\n };\n spec.components.schemas = {\n ...spec.components.schemas,\n };\n }\n\n const seenOperationIds = new Set<string>();\n const duplicatedOperationIds = new Set<string>();\n\n // Make sure all operationIds are camelCase, and find which ones are duplicated\n Object.entries(spec.paths ?? {}).forEach(([path, pathOps]) =>\n Object.entries(pathOps ?? {}).forEach(([method, op]) => {\n const operation = resolveIfRef(spec, op);\n if (operation && typeof operation === 'object') {\n const operationId = camelCase(\n (operation as any).operationId ?? `${method}-${path}`,\n );\n (operation as any).operationId = operationId;\n if (seenOperationIds.has(operationId)) {\n duplicatedOperationIds.add(operationId);\n }\n seenOperationIds.add(operationId);\n }\n }),\n );\n\n // Reset seen operation ids\n seenOperationIds.clear();\n\n const untagged = Symbol('untagged');\n const seenOperationIdsByTag: { [tag: string | symbol]: Set<string> } = {};\n\n // \"Hoist\" inline request and response schemas\n Object.entries(spec.paths ?? {}).forEach(([path, pathOps]) =>\n Object.entries(pathOps ?? {}).forEach(([method, op]) => {\n const operation = resolveIfRef(spec, op);\n if (operation && typeof operation === 'object') {\n const tags: string[] = (operation as any).tags ?? [];\n const operationId = (operation as any).operationId as string;\n\n // Allow operations to have the same id\n let deduplicatedOpId = operationId;\n let deduplicatedDotNotationOpId = operationId;\n\n // Attempt to deduplicate the operationId by its tags\n if (duplicatedOperationIds.has(operationId)) {\n deduplicatedOpId = camelCase(\n tags.map((t) => `${t}-`).join('') + operationId,\n );\n deduplicatedDotNotationOpId =\n tags.map((t) => `${camelCase(t)}.`).join('') +\n camelCase(operationId);\n }\n\n (operation as any)['x-aws-nx-deduplicated-op-id'] = deduplicatedOpId;\n (operation as any)['x-aws-nx-deduplicated-dot-op-id'] =\n deduplicatedDotNotationOpId;\n\n seenOperationIds.add(deduplicatedOpId);\n\n // Throw an error for any duplicated operation ids with the same tag, or untagged\n [...(tags.length === 0 ? [untagged] : tags)].forEach((tag) => {\n if (\n seenOperationIdsByTag[tag] &&\n seenOperationIdsByTag[tag].has(operationId)\n ) {\n throw new Error(\n tag === untagged\n ? `Untagged operations cannot have the same operationId (${operationId})`\n : `Operations with the same tag (${String(tag)}) cannot have the same operationId (${operationId})`,\n );\n }\n\n seenOperationIdsByTag[tag] = new Set([\n ...(seenOperationIdsByTag[tag] ?? []),\n operationId,\n ]);\n });\n\n if ('responses' in operation) {\n Object.entries(operation.responses ?? {}).forEach(([code, res]) => {\n const response = resolveIfRef(spec, res);\n const jsonMediaType = preferredJsonMediaType(\n Object.keys(response?.content ?? {}),\n );\n const jsonResponseSchema = jsonMediaType\n ? response!.content![jsonMediaType].schema\n : undefined;\n if (\n jsonResponseSchema &&\n !isRef(jsonResponseSchema) &&\n (['object', 'array'].includes(jsonResponseSchema.type!) ||\n isCompositeSchema(jsonResponseSchema) ||\n (jsonResponseSchema?.type === 'string' &&\n jsonResponseSchema.enum))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}${code}Response`;\n spec.components!.schemas![schemaName] = jsonResponseSchema;\n response!.content![jsonMediaType!].schema = {\n $ref: `#/components/schemas/${schemaName}`,\n };\n }\n\n // Hoist inline streaming item schemas (OpenAPI 3.2 itemSchema) so\n // each streamed item gets a named model.\n STREAMING_CONTENT_TYPES.forEach((mediaType) => {\n const streamingContent = response?.content?.[mediaType] as\n | { itemSchema?: OpenAPIV3.SchemaObject }\n | undefined;\n const itemSchema = streamingContent?.itemSchema;\n if (\n itemSchema &&\n !isRef(itemSchema) &&\n (['object', 'array'].includes(itemSchema.type!) ||\n isCompositeSchema(itemSchema) ||\n (itemSchema.type === 'string' && itemSchema.enum))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}${code}ResponseItem`;\n spec.components!.schemas![schemaName] = itemSchema;\n streamingContent.itemSchema = {\n $ref: `#/components/schemas/${schemaName}`,\n } as OpenAPIV3.SchemaObject;\n }\n });\n });\n }\n if ('requestBody' in operation) {\n const requestBody = resolveIfRef(spec, operation.requestBody);\n const contentMediaTypes = Object.keys(requestBody?.content ?? {});\n // Hoist the JSON body, falling back to a form-data body (multipart or\n // urlencoded) so an inline form object is fully typed and marshalled\n // rather than left `unknown`.\n const bodyMediaType =\n preferredJsonMediaType(contentMediaTypes) ??\n contentMediaTypes.find(isFormMediaType);\n const bodyContentSchema = bodyMediaType\n ? requestBody!.content![bodyMediaType].schema\n : undefined;\n // A form body's binary string fields are file uploads (Blob). Mark\n // the resolved schema (inline or $ref target) before hoisting.\n if (bodyMediaType && isFormMediaType(bodyMediaType)) {\n const resolved = resolveIfRef(spec, bodyContentSchema) as\n | OpenAPIV3.SchemaObject\n | undefined;\n if (resolved) markFormBinaryFields(resolved);\n }\n if (\n bodyContentSchema &&\n !isRef(bodyContentSchema) &&\n (['object', 'array'].includes(bodyContentSchema.type!) ||\n isCompositeSchema(bodyContentSchema) ||\n (bodyContentSchema?.type === 'string' && bodyContentSchema.enum))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}RequestContent`;\n spec.components!.schemas![schemaName] = bodyContentSchema;\n requestBody!.content![bodyMediaType!].schema = {\n $ref: `#/components/schemas/${schemaName}`,\n };\n }\n }\n\n // Hoist parameter schemas. Composite and inline-object schemas are\n // hoisted to named models so the parameter is fully typed (e.g. a\n // `deepObject` query param's members are marshalled, not left `unknown`).\n if ('parameters' in operation) {\n (operation.parameters ?? []).forEach((p) => {\n const param = resolveIfRef(spec, p);\n const paramSchema = param?.schema as\n | OpenAPIV3.SchemaObject\n | undefined;\n if (\n paramSchema &&\n !isRef(paramSchema) &&\n (isCompositeSchema(paramSchema) ||\n (paramSchema.type === 'object' && !!paramSchema.properties))\n ) {\n const schemaName = `${upperFirst(deduplicatedOpId)}Request${upperFirst(param.in)}${upperFirst(camelCase(param.name))}`;\n spec.components!.schemas![schemaName] = paramSchema;\n param.schema = { $ref: `#/components/schemas/${schemaName}` };\n }\n });\n }\n }\n }),\n );\n\n // Normalize schema names to valid TypeScript identifiers (e.g., \"Message-Output\" -> \"MessageOutput\")\n spec = normaliseSchemaNames(spec);\n\n // Initialise the models that we have seen with all schemas.\n // This is required to ensure we do not create any clashing models below\n const seenModelNameCounts = Object.fromEntries(\n Object.keys(spec.components?.schemas ?? {}).map((name) => [name, 1]),\n );\n\n // \"Hoist\" any nested object definitions in arrays/maps that aren't already refs, as parseOpenapi will treat the\n // type as \"any\" if they're defined inline (and not a ref)\n Object.entries(spec.components?.schemas ?? {}).forEach(([name, schema]) => {\n if (!isRef(schema)) {\n const refs = hoistInlineObjectSubSchemas(\n [name],\n schema,\n seenModelNameCounts,\n );\n refs.forEach((ref) => {\n spec.components!.schemas![ref.name] = ref.schema;\n });\n }\n });\n\n // \"Inline\" any refs to non objects/enums\n const inlinedRefs: Set<string> = new Set();\n spec = cloneDeepWith(spec, (v) => {\n if (v && typeof v === 'object' && v.$ref) {\n const resolved = resolveRef(spec, v.$ref);\n if (\n resolved &&\n resolved.type &&\n resolved.type !== 'object' &&\n !(resolved.type === 'string' && resolved.enum)\n ) {\n inlinedRefs.add(v.$ref);\n return resolved;\n }\n }\n });\n\n // Delete the non object schemas that were inlined\n [...inlinedRefs].forEach((ref) => {\n const parts = splitRef(ref);\n if (\n parts.length === 3 &&\n parts[0] === 'components' &&\n parts[1] === 'schemas'\n ) {\n delete spec.components!.schemas![parts[2]];\n }\n });\n\n return spec;\n};\n"],"names":["cloneDeepWith","camelCase","pascalCase","toClassName","upperFirst","STREAMING_CONTENT_TYPES","isRef","resolveIfRef","resolveRef","splitRef","normaliseSchemaNames","spec","schemaNameMapping","originalNames","Object","keys","components","schemas","existingSchemaNames","Set","resolvedNameOwners","forEach","name","normalizedName","has","Error","owner","undefined","length","v","parts","$ref","oldName","newName","entries","schema","isCompositeSchema","allOf","anyOf","oneOf","preferredJsonMediaType","mediaTypes","find","mediaType","split","endsWith","FORM_MEDIA_TYPES","isFormMediaType","includes","isBinaryContentMediaType","contentMediaType","startsWith","markFormBinaryFields","values","properties","prop","s","type","format","contentEncoding","hasSubSchemasToVisit","not","enum","filterInlineCompositeSchemas","nameParts","namePartPrefix","propPath","inlineSchemaIndex","flatMap","i","subSchema","title","createUniqueModelName","seenModelNameCounts","candidateName","map","join","seenModelNameCount","hoistInlineObjectSubSchemas","inlineSubSchemas","items","prefixItems","filter","additionalProperties","patternProperties","pattern","recursiveRefs","refs","ref","structuredClone","schemaWithPropToReplace","slice","reduce","resolvedInSchema","pathPart","rewriteConstToEnum","rewrite","Array","isArray","const","constValue","rest","rewriteCompositeSiblingProperties","required","_type","rewriteMultiTypeToAnyOf","nullable","nonNull","t","isNullable","inlinePathItemRefs","paths","path","pathItem","normaliseOpenApiSpecForCodeGen","inSpec","seenOperationIds","duplicatedOperationIds","pathOps","method","op","operation","operationId","add","clear","untagged","Symbol","seenOperationIdsByTag","tags","deduplicatedOpId","deduplicatedDotNotationOpId","tag","String","responses","code","res","response","jsonMediaType","content","jsonResponseSchema","schemaName","streamingContent","itemSchema","requestBody","contentMediaTypes","bodyMediaType","bodyContentSchema","resolved","parameters","p","param","paramSchema","in","fromEntries","inlinedRefs"],"mappings":"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"}
|
|
@@ -53,23 +53,17 @@ const compositeMembers = (schema)=>schema.allOf ?? schema.anyOf ?? schema.oneOf
|
|
|
53
53
|
return !hasProperties && !schema.patternProperties;
|
|
54
54
|
};
|
|
55
55
|
/**
|
|
56
|
-
* The internal primitive type name for a primitive schema.
|
|
56
|
+
* The internal primitive type name for a primitive schema. A `string` field
|
|
57
|
+
* denotes raw binary content (rendered as a `Blob`) only via `format: binary`.
|
|
58
|
+
* The 3.1 `contentMediaType` idiom is ambiguous in isolation — FastAPI emits it
|
|
59
|
+
* both for multipart file fields (binary) and for `bytes` in a JSON body
|
|
60
|
+
* (base64 string) — so `normalise` rewrites it to `format: binary` for form
|
|
61
|
+
* bodies only, and this stays context-free.
|
|
57
62
|
*/ const primitiveType = (schema)=>{
|
|
58
63
|
const type = primaryType(schema);
|
|
59
|
-
if (type === 'string' &&
|
|
64
|
+
if (type === 'string' && schema.format === 'binary') return 'binary';
|
|
60
65
|
return (type && PRIMITIVE_TYPE_MAP[type]) ?? 'unknown';
|
|
61
66
|
};
|
|
62
|
-
/**
|
|
63
|
-
* Whether a `string` schema denotes raw binary content (rendered as a `Blob`).
|
|
64
|
-
* Covers the 3.0 `format: binary` idiom and the 3.1 `contentMediaType` idiom
|
|
65
|
-
* (as emitted by FastAPI for `UploadFile`). A base64 `contentEncoding`, or a
|
|
66
|
-
* textual/JSON media type, keeps the value a string on the wire.
|
|
67
|
-
*/ const isBinaryStringSchema = (schema)=>{
|
|
68
|
-
if (schema.format === 'binary') return true;
|
|
69
|
-
const contentMediaType = schema.contentMediaType;
|
|
70
|
-
if (!contentMediaType || schema.contentEncoding) return false;
|
|
71
|
-
return !(contentMediaType.startsWith('text/') || contentMediaType === 'application/json' || contentMediaType.endsWith('+json') || contentMediaType === 'application/xml');
|
|
72
|
-
};
|
|
73
67
|
/**
|
|
74
68
|
* Prefer application/json, falling back to the first declared media type.
|
|
75
69
|
*/ const preferredMediaType = (content)=>'application/json' in content ? 'application/json' : Object.keys(content)[0];
|
|
@@ -114,7 +108,20 @@ const parseResponseCode = (code)=>/^\d+$/.test(code) ? parseInt(code, 10) : code
|
|
|
114
108
|
}
|
|
115
109
|
const type = primaryType(schema);
|
|
116
110
|
if (type === 'array') {
|
|
111
|
+
// A fixed-length tuple (3.1 `prefixItems`, as emitted by Pydantic for
|
|
112
|
+
// `tuple[A, B]`) models each element positionally in `properties`. An open
|
|
113
|
+
// tuple (additional `items` beyond the prefix) degrades to a plain array.
|
|
114
|
+
const prefixItems = schema.prefixItems;
|
|
117
115
|
const items = schema.items;
|
|
116
|
+
if (prefixItems && prefixItems.length > 0 && !items) {
|
|
117
|
+
const properties = prefixItems.map((member)=>buildInlineModel(spec, member));
|
|
118
|
+
return {
|
|
119
|
+
export: 'tuple',
|
|
120
|
+
type: 'unknown',
|
|
121
|
+
properties,
|
|
122
|
+
imports: collectImports(properties)
|
|
123
|
+
};
|
|
124
|
+
}
|
|
118
125
|
return {
|
|
119
126
|
export: 'array',
|
|
120
127
|
...collectionValue(spec, items)
|
|
@@ -310,12 +317,22 @@ const buildModels = (spec)=>collapseDiscriminators(spec, Object.entries(spec.com
|
|
|
310
317
|
if (!requestBody?.content || Object.keys(requestBody.content).length === 0) return null;
|
|
311
318
|
const mediaType = preferredMediaType(requestBody.content);
|
|
312
319
|
const base = buildInlineModel(spec, requestBody.content[mediaType]?.schema ?? {});
|
|
320
|
+
// The encoding object's per-part content types (multipart/urlencoded bodies)
|
|
321
|
+
const partContentTypes = Object.fromEntries(Object.entries(requestBody.content[mediaType]?.encoding ?? {}).flatMap(([prop, encoding])=>encoding.contentType ? [
|
|
322
|
+
[
|
|
323
|
+
prop,
|
|
324
|
+
encoding.contentType
|
|
325
|
+
]
|
|
326
|
+
] : []));
|
|
313
327
|
return {
|
|
314
328
|
...base,
|
|
315
329
|
name: 'requestBody',
|
|
316
330
|
prop: 'requestBody',
|
|
317
331
|
in: 'body',
|
|
318
332
|
mediaType,
|
|
333
|
+
...Object.keys(partContentTypes).length > 0 ? {
|
|
334
|
+
partContentTypes
|
|
335
|
+
} : {},
|
|
319
336
|
isRequired: !!requestBody.required,
|
|
320
337
|
description: requestBody.description ?? base.description
|
|
321
338
|
};
|
|
@@ -330,14 +347,21 @@ const buildModels = (spec)=>collapseDiscriminators(spec, Object.entries(spec.com
|
|
|
330
347
|
]).flatMap((p)=>{
|
|
331
348
|
const param = resolveIfRef(spec, p);
|
|
332
349
|
if (!param) return [];
|
|
333
|
-
|
|
350
|
+
// A content-based parameter declares `content` (a single media type)
|
|
351
|
+
// instead of `schema`; its value is serialised to that media type.
|
|
352
|
+
const contentMediaType = param.content ? Object.keys(param.content)[0] : undefined;
|
|
353
|
+
if (contentMediaType && contentMediaType !== 'application/json') {
|
|
354
|
+
throw new Error(`Parameter "${param.name}" declares content media type "${contentMediaType}", which is not supported (only application/json content-based parameters can be serialised)`);
|
|
355
|
+
}
|
|
356
|
+
const schema = param.schema ?? param.content?.[contentMediaType]?.schema;
|
|
357
|
+
const base = buildInlineModel(spec, schema ?? {});
|
|
334
358
|
return [
|
|
335
359
|
{
|
|
336
360
|
...base,
|
|
337
361
|
name: param.name,
|
|
338
362
|
prop: param.name,
|
|
339
363
|
in: param.in,
|
|
340
|
-
mediaType: null,
|
|
364
|
+
mediaType: param.schema ? null : contentMediaType ?? null,
|
|
341
365
|
isRequired: !!param.required,
|
|
342
366
|
description: param.description ? param.description : base.description
|
|
343
367
|
}
|
|
@@ -491,6 +515,15 @@ const buildDefaultService = (spec)=>{
|
|
|
491
515
|
linkModel(spec, modelsByName, model.link, schema.items, visited);
|
|
492
516
|
}
|
|
493
517
|
}
|
|
518
|
+
if (model.export === 'tuple' && 'prefixItems' in schema) {
|
|
519
|
+
const memberSchemas = schema.prefixItems ?? [];
|
|
520
|
+
model.properties.forEach((member, i)=>{
|
|
521
|
+
const subSchema = resolveIfRef(spec, memberSchemas[i]);
|
|
522
|
+
if (subSchema && !visited.has(member)) {
|
|
523
|
+
linkModel(spec, modelsByName, member, subSchema, visited);
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
}
|
|
494
527
|
model.properties.filter((p)=>!visited.has(p) && schema.properties?.[trim(p.name, `"'`)]).forEach((property)=>{
|
|
495
528
|
const subSchema = resolveIfRef(spec, schema.properties[trim(property.name, `"'`)]);
|
|
496
529
|
linkModel(spec, modelsByName, property, subSchema, visited);
|