@aws/nx-plugin 1.0.0-rc.35 → 1.0.0-rc.36
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/package.json
CHANGED
|
@@ -49,7 +49,10 @@ const bodyMediaTypeOf = (op) => {
|
|
|
49
49
|
return mediaTypes.find(mt => mt === 'application/json' || mt.endsWith('+json')) || mediaTypes[0];
|
|
50
50
|
};
|
|
51
51
|
const hasMultipartBody = allOperations.some(op => bodyMediaTypeOf(op) === 'multipart/form-data');
|
|
52
|
-
|
|
52
|
+
// A urlencoded body is form-encoded only when its schema is an object; a
|
|
53
|
+
// primitive schema (e.g. a raw pre-encoded string) is sent verbatim below.
|
|
54
|
+
const isUrlEncodedObjectBody = (op) => bodyMediaTypeOf(op) === 'application/x-www-form-urlencoded' && !!op.parametersBody && !op.parametersBody.isPrimitive;
|
|
55
|
+
const hasUrlEncodedBody = allOperations.some(op => isUrlEncodedObjectBody(op));
|
|
53
56
|
// Whether any operation uses matrix/label path styles or allowReserved query
|
|
54
57
|
// params, so the extra $url serialisation logic is only emitted when needed.
|
|
55
58
|
const hasStyledPathParams = allOperations.some(op => (op.parameters || []).some(p => p.in === 'path' && p.pathStyle));
|
|
@@ -751,10 +754,11 @@ export class <%- className %> {
|
|
|
751
754
|
boundary itself (so the Content-Type header is intentionally unset
|
|
752
755
|
above). */ _%>
|
|
753
756
|
const body = <% if (!op.parametersBody.isRequired) { %>input === undefined ? undefined : <% } %>this.$formData(<%- op.explicitRequestBodyParameter ? `$IO.${op.operationIdPascalCase}RequestBodyParameters.toJson(input).${op.explicitRequestBodyParameter.prop}` : renderToJsonValue(op.parametersBody, 'input') %><% if (op.parametersBody.partContentTypes) { %>, <%- JSON.stringify(op.parametersBody.partContentTypes) %><% } %>);
|
|
754
|
-
<%_ } else if (
|
|
755
|
-
<%_ /*
|
|
757
|
+
<%_ } else if (isUrlEncodedObjectBody(op)) { _%>
|
|
758
|
+
<%_ /* An object urlencoded body is sent as `key=value&...` pairs — the JSON
|
|
756
759
|
serialisation the wire type declares would be rejected by the
|
|
757
|
-
server's form parser.
|
|
760
|
+
server's form parser. A primitive urlencoded body (e.g. a raw
|
|
761
|
+
pre-encoded string) falls through to the String(input) branch. */ _%>
|
|
758
762
|
const body = <% if (!op.parametersBody.isRequired) { %>input === undefined ? undefined : <% } %>this.$urlEncodedForm(<%- op.explicitRequestBodyParameter ? `$IO.${op.operationIdPascalCase}RequestBodyParameters.toJson(input).${op.explicitRequestBodyParameter.prop}` : renderToJsonValue(op.parametersBody, 'input') %>).toString();
|
|
759
763
|
<%_ } else if (op.parametersBody.isPrimitive && ['number', 'boolean', 'string'].includes(op.parametersBody.type) && !['array', 'dictionary'].includes(op.parametersBody.export) && !["date", "date-time"].includes(op.parametersBody.format)) { _%>
|
|
760
764
|
const body = <% if (!op.parametersBody.isRequired) { %>input === undefined ? undefined : <% } %>String(input<%- op.explicitRequestBodyParameter ? `.${op.explicitRequestBodyParameter.typescriptName}` : '' %>);
|
|
@@ -36,6 +36,9 @@ import { isRef, resolveIfRef, splitRef } from "./refs.js";
|
|
|
36
36
|
assertNoClashingPropertyNames(model);
|
|
37
37
|
assertNoConflictingUnionMemberMarshalling(model);
|
|
38
38
|
}
|
|
39
|
+
for (const op of allOperations){
|
|
40
|
+
assertEncodableUrlEncodedBody(op);
|
|
41
|
+
}
|
|
39
42
|
data.models = orderBy(data.models, (d)=>d.name);
|
|
40
43
|
// Default service first, then by name.
|
|
41
44
|
data.services = orderBy(data.services, (s)=>s.name === DEFAULT_SERVICE_NAME ? '' : s.name);
|
|
@@ -357,6 +360,28 @@ import { isRef, resolveIfRef, splitRef } from "./refs.js";
|
|
|
357
360
|
}
|
|
358
361
|
}
|
|
359
362
|
};
|
|
363
|
+
/**
|
|
364
|
+
* An `application/x-www-form-urlencoded` body is form-encoded as `key=value`
|
|
365
|
+
* pairs, so the wire form is only defined for a schema with named properties
|
|
366
|
+
* (an object) or a primitive sent verbatim. A top-level array or tuple has no
|
|
367
|
+
* property names to key on — encoding it would emit index keys (`0=a&1=b`) that
|
|
368
|
+
* no form parser can decode — so fail fast rather than generate a client that
|
|
369
|
+
* is silently wrong on the wire.
|
|
370
|
+
*/ const assertEncodableUrlEncodedBody = (op)=>{
|
|
371
|
+
const body = op.parametersBody;
|
|
372
|
+
if (!body?.mediaTypes) return;
|
|
373
|
+
const mediaTypes = Array.isArray(body.mediaTypes) ? body.mediaTypes : [
|
|
374
|
+
body.mediaTypes
|
|
375
|
+
];
|
|
376
|
+
// Match the wire media type the client actually sends: JSON is preferred, so
|
|
377
|
+
// an array body offering both JSON and urlencoded is sent as JSON and is fine.
|
|
378
|
+
const chosenMediaType = mediaTypes.find((mt)=>mt === 'application/json' || mt.endsWith('+json')) ?? mediaTypes[0];
|
|
379
|
+
if (chosenMediaType !== 'application/x-www-form-urlencoded') return;
|
|
380
|
+
if (body.isPrimitive) return;
|
|
381
|
+
if (body.export === 'array' || body.export === 'tuple') {
|
|
382
|
+
throw new Error(`Operation ${op.method} ${op.path} has an application/x-www-form-urlencoded request body whose schema is a ${body.export}, which has no defined form encoding. Use an object schema (its properties become the form fields) or a primitive schema (sent verbatim) in your OpenAPI specification.`);
|
|
383
|
+
}
|
|
384
|
+
};
|
|
360
385
|
/**
|
|
361
386
|
* Group operations by their (camelCased) tags, collecting any untagged
|
|
362
387
|
* operations separately.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/utils/codegen-data.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport orderBy from 'lodash.orderby';\nimport trim from 'lodash.trim';\nimport uniqBy from 'lodash.uniqby';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport {\n camelCase,\n pascalCase,\n snakeCase,\n toClassName,\n upperFirst,\n} from '../../utils/names';\nimport {\n toPythonName,\n toPythonType,\n toTypeScriptModelName,\n toTypeScriptName,\n toTypeScriptType,\n} from './codegen-data/languages';\nimport {\n COLLECTION_TYPES,\n COMPOSED_SCHEMA_TYPES,\n type CodeGenData,\n type CollectionFormat,\n createModel,\n DEFAULT_SERVICE_NAME,\n indexModelsByName,\n type Model,\n type ModelsByName,\n type Operation,\n type PatternPropertyModel,\n PRIMITIVE_TYPES,\n type Service,\n STREAMING_CONTENT_TYPES,\n VENDOR_EXTENSIONS,\n type VendorExtensions,\n} from './codegen-data/types';\nimport { normaliseOpenApiSpecForCodeGen } from './normalise';\nimport {\n buildClientData,\n buildInlineModel,\n compositeMemberSchemas,\n getSpecOperation,\n getSpecParametersByKey,\n getSpecPathParameters,\n linkModel,\n specParameterKey,\n} from './parser';\nimport { isRef, resolveIfRef, splitRef } from './refs';\nimport type { OpenApiSchema, OpenApiSchemaOrRef, Spec } from './types';\n\n/**\n * Build the data structure used to generate code from an OpenAPI spec.\n */\nexport const buildOpenApiCodeGenData = (inSpec: Spec): CodeGenData => {\n const spec = normaliseOpenApiSpecForCodeGen(inSpec);\n const data = buildClientData(spec);\n\n const modelsByName = indexModelsByName(data.models);\n\n for (const service of data.services) {\n augmentService(spec, service, modelsByName);\n }\n\n const allOperations = uniqBy(\n data.services.flatMap((s) => s.operations),\n (o) => o.uniqueName,\n );\n\n // A model per operation request parameter position (query/path/body/...).\n data.models = [\n ...data.models,\n ...allOperations.flatMap((op) =>\n buildRequestParameterModels(op, modelsByName),\n ),\n ];\n\n for (const model of data.models) {\n augmentModel(spec, model, modelsByName);\n }\n for (const model of data.models) {\n model.typescriptName = toTypeScriptModelName(model.name);\n model.typescriptType = model.typescriptName;\n }\n\n for (const model of data.models) {\n assertNoClashingPropertyNames(model);\n assertNoConflictingUnionMemberMarshalling(model);\n }\n\n data.models = orderBy(data.models, (d) => d.name);\n // Default service first, then by name.\n data.services = orderBy(data.services, (s) =>\n s.name === DEFAULT_SERVICE_NAME ? '' : s.name,\n );\n\n const { operationsByTag, untaggedOperations } =\n groupOperationsByTag(allOperations);\n\n return {\n ...data,\n operationsByTag,\n untaggedOperations,\n info: spec.info,\n allOperations,\n vendorExtensions: vendorExtensionsOf(spec),\n className: toClassName(spec.info.title),\n };\n};\n\n/**\n * Augment a service and each of its operations with the data needed for code\n * generation (names, imports, result/request types, behavioural flags), and\n * compute the set of models the service (ie API client) needs to import.\n */\nconst augmentService = (\n spec: Spec,\n service: Service,\n modelsByName: ModelsByName,\n): void => {\n const modelImports = service.operations.flatMap((op) =>\n augmentOperation(spec, op, modelsByName),\n );\n\n service.operations = orderBy(service.operations, (op) => op.uniqueName);\n service.modelImports = orderBy(\n uniqBy([...service.imports, ...modelImports], (x) => x),\n );\n service.className = `${service.name}Api`;\n service.nameSnakeCase = snakeCase(service.name);\n};\n\n/**\n * Augment a single operation with all the data the templates need, returning\n * the names of the models it references (for the service's import list).\n */\nconst augmentOperation = (\n spec: Spec,\n op: Operation,\n modelsByName: ModelsByName,\n): string[] => {\n const specOp = getSpecOperation(spec, op);\n\n assignOperationNames(op, specOp);\n\n op.vendorExtensions = vendorExtensionsOf(specOp);\n\n const modelImports = [\n ...(specOp ? augmentResponses(spec, op, specOp, modelsByName) : []),\n ...augmentParameters(spec, op, specOp, modelsByName),\n ];\n\n op.responses.forEach(addLanguageTypes);\n op.responses = orderBy(op.responses, (r) => r.code);\n\n // Result is the lowest successful response, otherwise the 2XX or default.\n op.result =\n op.responses.find(\n (r) => typeof r.code === 'number' && r.code >= 200 && r.code < 300,\n ) ?? op.responses.find((r) => r.code === '2XX' || r.code === 'default');\n\n op.operationIdPascalCase = pascalCase(op.uniqueName);\n op.operationIdSnakeCase = toPythonName('operation', op.uniqueName);\n\n if (op.parameters.length > 0) {\n const baseRequestTypeName = `${op.operationIdPascalCase}Request`;\n // Use the OperationRequest suffix when the standard Request name clashes\n // with an existing schema.\n op.requestTypeName = spec.components?.schemas?.[baseRequestTypeName]\n ? `${op.operationIdPascalCase}OperationRequest`\n : baseRequestTypeName;\n }\n\n augmentOperationBehaviour(op);\n\n return modelImports;\n};\n\n/**\n * Set an operation's name and its deduplicated variants from the vendor\n * extensions the normaliser added.\n */\nconst assignOperationNames = (\n op: Operation,\n specOp: OpenAPIV3.OperationObject | undefined,\n): void => {\n const deduplicatedOpId = specOp?.['x-aws-nx-deduplicated-op-id'] as\n | string\n | undefined;\n const dotNotationOpId = specOp?.['x-aws-nx-deduplicated-dot-op-id'] as\n | string\n | undefined;\n\n op.name = op.id ?? op.name;\n op.uniqueName = deduplicatedOpId ?? op.name;\n if (dotNotationOpId) {\n op.dotNotationName = dotNotationOpId;\n }\n};\n\n/**\n * Augment an operation's response models with schema-derived data, resolving\n * void responses and streaming item schemas. Returns the response model names\n * to import.\n */\nconst augmentResponses = (\n spec: Spec,\n op: Operation,\n specOp: OpenAPIV3.OperationObject,\n modelsByName: ModelsByName,\n): string[] => {\n const modelImports = op.responses\n .filter((r) => r.export === 'reference')\n .map((r) => r.type);\n\n for (const response of op.responses) {\n // We cannot distinguish a composite of primitives at runtime (it all comes\n // back as text), so validate this away.\n if (\n response.export === 'reference' &&\n COMPOSED_SCHEMA_TYPES.has(modelsByName[response.type]?.export)\n ) {\n const composedPrimitives = (\n modelsByName[response.type].composedPrimitives ?? []\n ).filter((p) => !COLLECTION_TYPES.has(p.export));\n if (composedPrimitives.length > 0) {\n throw new Error(\n `Operation \"${op.method} ${op.path}\" returns a composite schema of primitives with ${camelCase(modelsByName[response.type].export)}, which cannot be distinguished at runtime`,\n );\n }\n }\n\n const matchingSpecResponse = specOp.responses[`${response.code}`];\n if (!matchingSpecResponse) continue;\n\n const specResponse = resolveIfRef(spec, matchingSpecResponse);\n\n // When there's no content, the response type is 'void'\n if (!specResponse.content) {\n response.type = 'void';\n continue;\n }\n\n const mediaTypes = Object.keys(specResponse.content);\n response.mediaTypes = mediaTypes;\n\n for (const mediaType of mediaTypes) {\n const responseContent = specResponse.content[mediaType];\n const responseSchema = resolveIfRef(spec, responseContent.schema);\n if (responseSchema) {\n augmentModelFromSchema(spec, response, responseSchema, modelsByName);\n }\n if (\n STREAMING_CONTENT_TYPES.has(mediaType) &&\n 'itemSchema' in responseContent\n ) {\n response.isJsonlStreaming = true;\n response.itemSchemaModel = buildOrReferenceModel(\n spec,\n modelsByName,\n responseContent.itemSchema as OpenApiSchemaOrRef,\n );\n }\n }\n }\n\n return modelImports;\n};\n\n/**\n * Augment an operation's parameter models with schema-derived data, resolving\n * request bodies and query/header collection formats. Returns the parameter\n * model names to import.\n */\nconst augmentParameters = (\n spec: Spec,\n op: Operation,\n specOp: OpenAPIV3.OperationObject | undefined,\n modelsByName: ModelsByName,\n): string[] => {\n const specParametersByKey = getSpecParametersByKey(\n spec,\n specOp,\n getSpecPathParameters(spec, op),\n );\n\n const modelImports: string[] = [];\n\n for (const parameter of op.parameters) {\n if (parameter.export === 'reference') {\n modelImports.push(parameter.type);\n }\n\n const specParameter =\n specParametersByKey[\n specParameterKey({ in: parameter.in, name: parameter.prop })\n ];\n const specParameterSchema = resolveIfRef(spec, specParameter?.schema);\n if (specParameterSchema) {\n augmentModelFromSchema(\n spec,\n parameter,\n specParameterSchema,\n modelsByName,\n );\n }\n\n if (parameter.in === 'body') {\n augmentBodyParameter(spec, parameter, specOp, modelsByName);\n } else if (\n (parameter.in === 'query' || parameter.in === 'header') &&\n specParameter\n ) {\n parameter.collectionFormat = getCollectionFormat(\n parameter.in,\n specParameter,\n );\n if (parameter.in === 'query' && specParameter.allowReserved) {\n parameter.allowReserved = true;\n }\n } else if (parameter.in === 'path' && specParameter) {\n const style = specParameter.style;\n if (style === 'matrix' || style === 'label') {\n parameter.pathStyle = style;\n parameter.pathExplode = !!specParameter.explode;\n }\n }\n\n addLanguageTypes(parameter);\n }\n\n return modelImports;\n};\n\n/**\n * Augment a request body parameter with its schema (the body is not in the\n * spec's `parameters`, so it is resolved from `requestBody` here) and record\n * its acceptable media types.\n */\nconst augmentBodyParameter = (\n spec: Spec,\n parameter: Model,\n specOp: OpenAPIV3.OperationObject | undefined,\n modelsByName: ModelsByName,\n): void => {\n // The request body parameter is named 'body' downstream.\n parameter.name = 'body';\n parameter.prop = 'body';\n\n const specBody = resolveIfRef(spec, specOp?.requestBody);\n if (!specBody) return;\n\n if (parameter.mediaType) {\n const bodySchema = resolveIfRef(\n spec,\n specBody.content?.[parameter.mediaType]?.schema,\n );\n if (bodySchema) {\n augmentModelFromSchema(spec, parameter, bodySchema, modelsByName);\n }\n }\n // Track all the media types that can be accepted in the request body\n parameter.mediaTypes = Object.keys(specBody.content);\n};\n\n/**\n * Translate an OpenAPI v3 parameter's style/explode into a v2-style\n * collectionFormat used when serialising array parameters.\n * @see https://spec.openapis.org/oas/v3.0.3.html#style-values\n */\nconst getCollectionFormat = (\n position: 'query' | 'header',\n specParameter: OpenAPIV3.ParameterObject,\n): CollectionFormat => {\n const style =\n specParameter.style ?? (position === 'query' ? 'form' : 'simple');\n const explode = specParameter.explode ?? style === 'form';\n\n if (position === 'header') {\n return explode ? 'multi' : 'csv';\n }\n // `deepObject` serialises an object as `key[prop]=value` pairs regardless of\n // explode; the object shape (not array collection) drives its serialisation.\n if (style === 'deepObject') {\n return 'deepObject';\n }\n return explode\n ? 'multi'\n : ((\n {\n spaceDelimited: 'ssv',\n pipeDelimited: 'pipes',\n simple: 'csv',\n form: 'csv',\n } as const\n )[style] ?? 'multi');\n};\n\n/**\n * Build the request parameter models for an operation — one model per parameter\n * position (query/path/header/cookie/body), named e.g.\n * `FooRequestQueryParameters`. Request bodies that can be represented directly\n * (the sole parameter, or a non-clashing object reference) are inlined rather\n * than given a wrapper model, and recorded on `op.explicitRequestBodyParameter`.\n */\nconst buildRequestParameterModels = (\n op: Operation,\n modelsByName: ModelsByName,\n): Model[] => {\n if (!op.parameters || op.parameters.length === 0) {\n return [];\n }\n\n // Whether the request body can be represented directly, without a wrapper\n // model (ie the request will be the body itself).\n const canInlineBody = (body: Model): boolean => {\n // If the body is the only parameter, we can inline it no matter the type\n if (op.parameters.length === 1) {\n return true;\n }\n // We inline object bodies, so long as they aren't dictionaries (as\n // dictionary keys could clash with other parameters), and so long as they\n // don't have a property name that clashes with another parameter\n const hasClashingPropertyName = (\n modelsByName?.[body.type]?.properties ?? []\n ).some((prop) => op.parameters.some((param) => param.name === prop.name));\n return (\n body.export === 'reference' &&\n modelsByName?.[body.type]?.export !== 'dictionary' &&\n !hasClashingPropertyName\n );\n };\n\n // Group parameters by their position (`in`: query/path/header/cookie/body),\n // dropping any body that can be inlined.\n const parametersByPosition = op.parameters\n .filter((p) => !(p.in === 'body' && canInlineBody(p)))\n .reduce<{ [position: string]: Model[] }>(\n (acc, p) => ({ ...acc, [p.in]: [...(acc[p.in] ?? []), p] }),\n {},\n );\n\n // The body parameter was already renamed to \"body\" by augmentBodyParameter.\n op.explicitRequestBodyParameter = parametersByPosition['body']?.[0];\n\n return Object.entries(parametersByPosition).map(([position, parameters]) => {\n const name = `${op.operationIdPascalCase}Request${upperFirst(position)}Parameters`;\n return createModel({\n description: op.description,\n export: 'interface',\n name,\n properties: parameters,\n type: name,\n isRequired: true,\n });\n });\n};\n\n/**\n * Augment a single model with schema-derived data (from its matching spec\n * schema, if any) and language-specific names and types.\n */\nconst augmentModel = (\n spec: Spec,\n model: Model,\n modelsByName: ModelsByName,\n): void => {\n model.nameSnakeCase = toPythonName('model', model.name);\n\n const matchingSpecModel = spec?.components?.schemas?.[model.name];\n if (matchingSpecModel) {\n const specModel = resolveIfRef(spec, matchingSpecModel);\n\n augmentModelFromSchema(spec, model, specModel, modelsByName);\n\n for (const property of model.properties) {\n const matchingSpecProperty = specModel.properties?.[property.name];\n if (matchingSpecProperty) {\n const specProperty = resolveIfRef(spec, matchingSpecProperty);\n augmentModelFromSchema(spec, property, specProperty, modelsByName);\n }\n }\n }\n\n model.properties.forEach(addLanguageTypes);\n\n // Resolve the discriminator's TypeScript property name for marshalling.\n if (model.discriminator) {\n model.discriminator.typescriptPropertyName = toTypeScriptName(\n model.discriminator.propertyName,\n );\n }\n};\n\n/**\n * Ensure no two properties/parameters of an object model collapse onto the same\n * TypeScript identifier (e.g. `foo-bar` and `foo_bar` both camelCase to\n * `fooBar`, or a query and header parameter sharing a name within one request\n * position). Such a clash would emit a type with duplicate members that does\n * not compile, so fail fast with an actionable error instead.\n */\nconst assertNoClashingPropertyNames = (model: Model): void => {\n const seen = new Map<string, string>();\n for (const property of model.properties) {\n // Composite members are unnamed (their names are empty); skip them.\n if (!property.name) continue;\n const existing = seen.get(property.typescriptName!);\n if (existing !== undefined && existing !== property.name) {\n throw new Error(\n `Property name conflict in \"${model.name}\": \"${existing}\" and \"${property.name}\" both map to the TypeScript name \"${property.typescriptName}\". Please rename one of these in your OpenAPI specification.`,\n );\n }\n seen.set(property.typescriptName!, property.name);\n }\n};\n\n/**\n * The marshalling semantics of a property — two properties with the same key\n * convert identically on the wire (so either branch's conversion is safe).\n */\nconst marshallingKey = (m: Model): string => {\n if (['date', 'date-time'].includes(m.format ?? '')) return 'date';\n if (m.type === 'binary') return 'binary';\n // Enums serialise as their bare primitive (no conversion).\n if (m.isEnum || m.export === 'enum') return 'plain';\n if (COLLECTION_TYPES.has(m.export)) {\n return `${m.export}<${m.link ? marshallingKey(m.link) : 'plain'}>`;\n }\n if (m.export === 'tuple') {\n return `tuple<${m.properties.map(marshallingKey).join(',')}>`;\n }\n if (m.export === 'reference' && !PRIMITIVE_TYPES.has(m.type)) {\n return `ref:${m.type}`;\n }\n return 'plain';\n};\n\n/**\n * A non-discriminated `oneOf`/`anyOf` of object members marshals by composing\n * every member, taking only the properties present on the value. That is sound\n * exactly when no wire property is claimed by two members with different\n * marshalling (e.g. a `date-time` in one and a plain string in another) —\n * otherwise the branch cannot be determined without guessing, so fail fast and\n * ask for a discriminator rather than corrupt data at runtime.\n */\nconst assertNoConflictingUnionMemberMarshalling = (model: Model): void => {\n if (\n (model.export !== 'one-of' && model.export !== 'any-of') ||\n model.discriminator\n ) {\n return;\n }\n const seen = new Map<string, { memberName: string; key: string }>();\n for (const member of model.composedModels ?? []) {\n for (const property of member.properties) {\n if (!property.name) continue;\n const key = marshallingKey(property);\n const existing = seen.get(property.name);\n if (existing && existing.key !== key) {\n throw new Error(\n `Schema \"${model.name}\" is a non-discriminated ${camelCase(model.export)} of \"${existing.memberName}\" and \"${member.name}\", which both declare a property \"${property.name}\" with different types, so the correct conversion cannot be determined. Add a discriminator to the union in your OpenAPI specification (e.g. with Pydantic, Field(discriminator=...)).`,\n );\n }\n if (!existing) {\n seen.set(property.name, { memberName: member.name, key });\n }\n }\n }\n};\n\n/**\n * Group operations by their (camelCased) tags, collecting any untagged\n * operations separately.\n */\nconst groupOperationsByTag = (\n allOperations: Operation[],\n): {\n operationsByTag: { [tag: string]: Operation[] };\n untaggedOperations: Operation[];\n} => {\n const isTagged = (op: Operation): boolean => !!op.tags && op.tags.length > 0;\n\n const operationsByTag = allOperations\n .filter(isTagged)\n .flatMap((op) => op.tags!.map((tag) => [camelCase(tag), op] as const))\n .reduce<{ [tag: string]: Operation[] }>(\n (acc, [tag, op]) => ({ ...acc, [tag]: [...(acc[tag] ?? []), op] }),\n {},\n );\n\n return {\n operationsByTag,\n untaggedOperations: allOperations.filter((op) => !isTagged(op)),\n };\n};\n\n/**\n * Resolve a schema to its model: an existing named model for a `$ref`, or a\n * freshly built-and-augmented model for an inline (nested value) schema.\n */\nconst buildOrReferenceModel = (\n spec: Spec,\n modelsByName: ModelsByName,\n schema: OpenApiSchemaOrRef,\n): Model => {\n if (isRef(schema)) {\n const name = splitRef(schema.$ref)[2];\n return modelsByName[name];\n }\n const model = buildInlineModel(spec, schema);\n linkModel(spec, modelsByName, model, schema);\n augmentModelFromSchema(spec, model, schema, modelsByName);\n return model;\n};\n\n/**\n * The `x-*` vendor extensions declared on an object.\n */\nconst vendorExtensionsOf = (object: object | undefined): VendorExtensions =>\n Object.fromEntries(\n Object.entries(object ?? {}).filter(([key]) => key.startsWith('x-')),\n );\n\nconst augmentModelFromSchema = (\n spec: Spec,\n model: Model,\n schema: OpenApiSchema,\n modelsByName: ModelsByName,\n visited: Set<Model> = new Set(),\n) => {\n model.format = schema.format;\n model.deprecated = !!schema.deprecated;\n model.openapiType = schema.type;\n model.isEnum = !!schema.enum && schema.enum.length > 0;\n model.vendorExtensions = vendorExtensionsOf(schema);\n\n // A \"dictionary\" has only additional properties; an \"interface\" may mix\n // explicit and additional properties.\n if (schema.additionalProperties) {\n const additionalPropertiesModel = buildOrReferenceModel(\n spec,\n modelsByName,\n schema.additionalProperties === true ? {} : schema.additionalProperties,\n );\n\n if (model.export === 'dictionary') {\n // A dictionary carries a self-referential property; the rest are explicit\n const explicitProperties = model.properties.filter(\n (p) => !(p.export === 'dictionary' && p.name === model.name),\n );\n\n // Explicit properties make this an interface rather than a dictionary\n if (explicitProperties.length > 0 || schema.patternProperties) {\n model.export = 'interface';\n model.hasAdditionalProperties = true;\n model.additionalPropertiesModel = additionalPropertiesModel;\n model.properties = explicitProperties;\n }\n } else {\n model.hasAdditionalProperties = true;\n model.additionalPropertiesModel = additionalPropertiesModel;\n }\n }\n\n // Pattern properties can have different value types per pattern, so the model\n // is an interface rather than a dictionary.\n if (schema.patternProperties) {\n const patternProperties = resolveIfRef(spec, schema.patternProperties);\n\n if (model.export === 'dictionary') {\n model.export = 'interface';\n }\n\n model.hasPatternProperties = true;\n model.patternPropertiesModels = Object.entries(patternProperties)\n .map(([pattern, patternProperty]) => ({\n pattern,\n model: buildOrReferenceModel(spec, modelsByName, patternProperty),\n }))\n .filter((entry): entry is PatternPropertyModel => !!entry.model);\n }\n\n addLanguageTypes(model);\n\n visited.add(model);\n\n const recurse = (target: Model, subSchema: OpenApiSchema): void =>\n augmentModelFromSchema(spec, target, subSchema, modelsByName, visited);\n\n // Array element type.\n if (\n model.export === 'array' &&\n model.link &&\n 'items' in schema &&\n schema.items &&\n !visited.has(model.link)\n ) {\n recurse(model.link, resolveIfRef(spec, schema.items));\n }\n\n // Dictionary value type (additionalProperties may be `true` rather than a\n // schema).\n if (\n model.export === 'dictionary' &&\n model.link &&\n 'additionalProperties' in schema &&\n schema.additionalProperties &&\n !visited.has(model.link)\n ) {\n const subSchema = resolveIfRef(spec, schema.additionalProperties);\n if (subSchema !== true) {\n recurse(model.link, subSchema);\n }\n }\n\n // Tuple element types (3.1 `prefixItems`), positionally.\n if (model.export === 'tuple' && 'prefixItems' in schema) {\n const memberSchemas =\n (schema as { prefixItems?: OpenApiSchemaOrRef[] }).prefixItems ?? [];\n model.properties.forEach((member, i) => {\n const subSchema = resolveIfRef(spec, memberSchemas[i]);\n if (subSchema && !visited.has(member)) {\n recurse(member, subSchema);\n }\n });\n }\n\n model.properties\n .filter((p) => !visited.has(p) && schema.properties?.[trim(p.name, `\"'`)])\n .forEach((property) =>\n recurse(\n property,\n resolveIfRef(spec, schema.properties![trim(property.name, `\"'`)]),\n ),\n );\n\n if (COMPOSED_SCHEMA_TYPES.has(model.export)) {\n const memberSchemas = compositeMemberSchemas(schema, model.export);\n model.properties.forEach((property, i) => {\n const subSchema = resolveIfRef(spec, memberSchemas[i]);\n if (subSchema) {\n recurse(property, subSchema);\n }\n });\n }\n};\n\nconst addLanguageTypes = (model: Model) => {\n model.name = trim(model.name, `\"'`);\n model.typescriptName = toTypeScriptName(model.name);\n model.typescriptType = toTypeScriptType(model);\n model.pythonName = toPythonName('property', model.name);\n model.pythonType = toPythonType(model);\n model.isPrimitive =\n PRIMITIVE_TYPES.has(model.type) &&\n !COMPOSED_SCHEMA_TYPES.has(model.export) &&\n !COLLECTION_TYPES.has(model.export);\n};\n\nconst isOperationMutation = (op: Operation): boolean => {\n // x-mutation/x-query override the HTTP-method default.\n const { vendorExtensions } = op;\n if (vendorExtensions?.[VENDOR_EXTENSIONS.MUTATION]) {\n return true;\n } else if (vendorExtensions?.[VENDOR_EXTENSIONS.QUERY]) {\n return false;\n }\n return ['PATCH', 'POST', 'PUT', 'DELETE'].includes(op.method);\n};\n\nconst augmentInfiniteQuery = (op: Operation) => {\n const { paginationDisabled, cursorPropertyName } = getCursorOptions(op);\n\n const cursorProperty = op.parameters.find(\n (p) => p.name === cursorPropertyName,\n );\n\n // An infinite query is a paginated operation that accepts the cursor parameter\n op.isInfiniteQuery = !paginationDisabled && !!cursorProperty;\n if (op.isInfiniteQuery) {\n op.infiniteQueryCursorProperty = cursorProperty;\n }\n};\n\n/**\n * Resolve the pagination cursor options from an operation's `x-cursor` vendor\n * extension. Accepted forms (object variants exist because Smithy vendor\n * extensions must be objects):\n *\n * - `'property'` / `{ inputToken: 'property' }` — the input property to page on\n * - `false` / `{ enabled: false }` — disable pagination\n */\nconst getCursorOptions = (\n op: Operation,\n): { paginationDisabled: boolean; cursorPropertyName: string } => {\n const cursor = op.vendorExtensions?.[VENDOR_EXTENSIONS.CURSOR];\n\n // Defaults: pagination enabled, paging on a property named 'cursor'.\n if (cursor === false) {\n return { paginationDisabled: true, cursorPropertyName: 'cursor' };\n }\n if (typeof cursor === 'string') {\n return { paginationDisabled: false, cursorPropertyName: cursor };\n }\n const options = (cursor ?? {}) as { enabled?: boolean; inputToken?: unknown };\n return {\n paginationDisabled: options.enabled === false,\n cursorPropertyName:\n typeof options.inputToken === 'string' ? options.inputToken : 'cursor',\n };\n};\n\n/**\n * Add query/mutation, streaming and infinite-query flags to an operation.\n */\nconst augmentOperationBehaviour = (op: Operation) => {\n const isMutation = isOperationMutation(op);\n op.isMutation = isMutation;\n op.isQuery = !isMutation;\n\n op.isStreaming =\n !!op.vendorExtensions?.[VENDOR_EXTENSIONS.STREAMING] ||\n op.responses.some((res) => res.isJsonlStreaming);\n\n // For JSON-lines streaming, the result is each streamed item, so the client\n // method returns AsyncIterableIterator<itemSchemaModel>. Named (hoisted)\n // item schemas become references; inline primitives keep their own type.\n const jsonlResponse = op.responses.find((res) => res.isJsonlStreaming);\n if (jsonlResponse) {\n const itemSchemaModel = jsonlResponse.itemSchemaModel;\n const result = op.result;\n if (result && itemSchemaModel) {\n if (itemSchemaModel.name) {\n result.type = itemSchemaModel.name;\n result.typescriptType = itemSchemaModel.name;\n result.export = 'reference';\n } else {\n result.type = itemSchemaModel.type;\n result.typescriptType = itemSchemaModel.typescriptType;\n result.export = itemSchemaModel.export;\n result.format = itemSchemaModel.format;\n result.link = itemSchemaModel.link;\n result.isPrimitive = itemSchemaModel.isPrimitive;\n }\n }\n }\n\n // Add infinite query details if applicable\n if (!isMutation) {\n augmentInfiniteQuery(op);\n }\n};\n"],"names":["orderBy","trim","uniqBy","camelCase","pascalCase","snakeCase","toClassName","upperFirst","toPythonName","toPythonType","toTypeScriptModelName","toTypeScriptName","toTypeScriptType","COLLECTION_TYPES","COMPOSED_SCHEMA_TYPES","createModel","DEFAULT_SERVICE_NAME","indexModelsByName","PRIMITIVE_TYPES","STREAMING_CONTENT_TYPES","VENDOR_EXTENSIONS","normaliseOpenApiSpecForCodeGen","buildClientData","buildInlineModel","compositeMemberSchemas","getSpecOperation","getSpecParametersByKey","getSpecPathParameters","linkModel","specParameterKey","isRef","resolveIfRef","splitRef","buildOpenApiCodeGenData","inSpec","spec","data","modelsByName","models","service","services","augmentService","allOperations","flatMap","s","operations","o","uniqueName","op","buildRequestParameterModels","model","augmentModel","typescriptName","name","typescriptType","assertNoClashingPropertyNames","assertNoConflictingUnionMemberMarshalling","d","operationsByTag","untaggedOperations","groupOperationsByTag","info","vendorExtensions","vendorExtensionsOf","className","title","modelImports","augmentOperation","imports","x","nameSnakeCase","specOp","assignOperationNames","augmentResponses","augmentParameters","responses","forEach","addLanguageTypes","r","code","result","find","operationIdPascalCase","operationIdSnakeCase","parameters","length","baseRequestTypeName","requestTypeName","components","schemas","augmentOperationBehaviour","deduplicatedOpId","dotNotationOpId","id","dotNotationName","filter","export","map","type","response","has","composedPrimitives","p","Error","method","path","matchingSpecResponse","specResponse","content","mediaTypes","Object","keys","mediaType","responseContent","responseSchema","schema","augmentModelFromSchema","isJsonlStreaming","itemSchemaModel","buildOrReferenceModel","itemSchema","specParametersByKey","parameter","push","specParameter","in","prop","specParameterSchema","augmentBodyParameter","collectionFormat","getCollectionFormat","allowReserved","style","pathStyle","pathExplode","explode","specBody","requestBody","bodySchema","position","spaceDelimited","pipeDelimited","simple","form","canInlineBody","body","hasClashingPropertyName","properties","some","param","parametersByPosition","reduce","acc","explicitRequestBodyParameter","entries","description","isRequired","matchingSpecModel","specModel","property","matchingSpecProperty","specProperty","discriminator","typescriptPropertyName","propertyName","seen","Map","existing","get","undefined","set","marshallingKey","m","includes","format","isEnum","link","join","member","composedModels","key","memberName","isTagged","tags","tag","$ref","object","fromEntries","startsWith","visited","Set","deprecated","openapiType","enum","additionalProperties","additionalPropertiesModel","explicitProperties","patternProperties","hasAdditionalProperties","hasPatternProperties","patternPropertiesModels","pattern","patternProperty","entry","add","recurse","target","subSchema","items","memberSchemas","prefixItems","i","pythonName","pythonType","isPrimitive","isOperationMutation","MUTATION","QUERY","augmentInfiniteQuery","paginationDisabled","cursorPropertyName","getCursorOptions","cursorProperty","isInfiniteQuery","infiniteQueryCursorProperty","cursor","CURSOR","options","enabled","inputToken","isMutation","isQuery","isStreaming","STREAMING","res","jsonlResponse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/utils/codegen-data.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport orderBy from 'lodash.orderby';\nimport trim from 'lodash.trim';\nimport uniqBy from 'lodash.uniqby';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport {\n camelCase,\n pascalCase,\n snakeCase,\n toClassName,\n upperFirst,\n} from '../../utils/names';\nimport {\n toPythonName,\n toPythonType,\n toTypeScriptModelName,\n toTypeScriptName,\n toTypeScriptType,\n} from './codegen-data/languages';\nimport {\n COLLECTION_TYPES,\n COMPOSED_SCHEMA_TYPES,\n type CodeGenData,\n type CollectionFormat,\n createModel,\n DEFAULT_SERVICE_NAME,\n indexModelsByName,\n type Model,\n type ModelsByName,\n type Operation,\n type PatternPropertyModel,\n PRIMITIVE_TYPES,\n type Service,\n STREAMING_CONTENT_TYPES,\n VENDOR_EXTENSIONS,\n type VendorExtensions,\n} from './codegen-data/types';\nimport { normaliseOpenApiSpecForCodeGen } from './normalise';\nimport {\n buildClientData,\n buildInlineModel,\n compositeMemberSchemas,\n getSpecOperation,\n getSpecParametersByKey,\n getSpecPathParameters,\n linkModel,\n specParameterKey,\n} from './parser';\nimport { isRef, resolveIfRef, splitRef } from './refs';\nimport type { OpenApiSchema, OpenApiSchemaOrRef, Spec } from './types';\n\n/**\n * Build the data structure used to generate code from an OpenAPI spec.\n */\nexport const buildOpenApiCodeGenData = (inSpec: Spec): CodeGenData => {\n const spec = normaliseOpenApiSpecForCodeGen(inSpec);\n const data = buildClientData(spec);\n\n const modelsByName = indexModelsByName(data.models);\n\n for (const service of data.services) {\n augmentService(spec, service, modelsByName);\n }\n\n const allOperations = uniqBy(\n data.services.flatMap((s) => s.operations),\n (o) => o.uniqueName,\n );\n\n // A model per operation request parameter position (query/path/body/...).\n data.models = [\n ...data.models,\n ...allOperations.flatMap((op) =>\n buildRequestParameterModels(op, modelsByName),\n ),\n ];\n\n for (const model of data.models) {\n augmentModel(spec, model, modelsByName);\n }\n for (const model of data.models) {\n model.typescriptName = toTypeScriptModelName(model.name);\n model.typescriptType = model.typescriptName;\n }\n\n for (const model of data.models) {\n assertNoClashingPropertyNames(model);\n assertNoConflictingUnionMemberMarshalling(model);\n }\n\n for (const op of allOperations) {\n assertEncodableUrlEncodedBody(op);\n }\n\n data.models = orderBy(data.models, (d) => d.name);\n // Default service first, then by name.\n data.services = orderBy(data.services, (s) =>\n s.name === DEFAULT_SERVICE_NAME ? '' : s.name,\n );\n\n const { operationsByTag, untaggedOperations } =\n groupOperationsByTag(allOperations);\n\n return {\n ...data,\n operationsByTag,\n untaggedOperations,\n info: spec.info,\n allOperations,\n vendorExtensions: vendorExtensionsOf(spec),\n className: toClassName(spec.info.title),\n };\n};\n\n/**\n * Augment a service and each of its operations with the data needed for code\n * generation (names, imports, result/request types, behavioural flags), and\n * compute the set of models the service (ie API client) needs to import.\n */\nconst augmentService = (\n spec: Spec,\n service: Service,\n modelsByName: ModelsByName,\n): void => {\n const modelImports = service.operations.flatMap((op) =>\n augmentOperation(spec, op, modelsByName),\n );\n\n service.operations = orderBy(service.operations, (op) => op.uniqueName);\n service.modelImports = orderBy(\n uniqBy([...service.imports, ...modelImports], (x) => x),\n );\n service.className = `${service.name}Api`;\n service.nameSnakeCase = snakeCase(service.name);\n};\n\n/**\n * Augment a single operation with all the data the templates need, returning\n * the names of the models it references (for the service's import list).\n */\nconst augmentOperation = (\n spec: Spec,\n op: Operation,\n modelsByName: ModelsByName,\n): string[] => {\n const specOp = getSpecOperation(spec, op);\n\n assignOperationNames(op, specOp);\n\n op.vendorExtensions = vendorExtensionsOf(specOp);\n\n const modelImports = [\n ...(specOp ? augmentResponses(spec, op, specOp, modelsByName) : []),\n ...augmentParameters(spec, op, specOp, modelsByName),\n ];\n\n op.responses.forEach(addLanguageTypes);\n op.responses = orderBy(op.responses, (r) => r.code);\n\n // Result is the lowest successful response, otherwise the 2XX or default.\n op.result =\n op.responses.find(\n (r) => typeof r.code === 'number' && r.code >= 200 && r.code < 300,\n ) ?? op.responses.find((r) => r.code === '2XX' || r.code === 'default');\n\n op.operationIdPascalCase = pascalCase(op.uniqueName);\n op.operationIdSnakeCase = toPythonName('operation', op.uniqueName);\n\n if (op.parameters.length > 0) {\n const baseRequestTypeName = `${op.operationIdPascalCase}Request`;\n // Use the OperationRequest suffix when the standard Request name clashes\n // with an existing schema.\n op.requestTypeName = spec.components?.schemas?.[baseRequestTypeName]\n ? `${op.operationIdPascalCase}OperationRequest`\n : baseRequestTypeName;\n }\n\n augmentOperationBehaviour(op);\n\n return modelImports;\n};\n\n/**\n * Set an operation's name and its deduplicated variants from the vendor\n * extensions the normaliser added.\n */\nconst assignOperationNames = (\n op: Operation,\n specOp: OpenAPIV3.OperationObject | undefined,\n): void => {\n const deduplicatedOpId = specOp?.['x-aws-nx-deduplicated-op-id'] as\n | string\n | undefined;\n const dotNotationOpId = specOp?.['x-aws-nx-deduplicated-dot-op-id'] as\n | string\n | undefined;\n\n op.name = op.id ?? op.name;\n op.uniqueName = deduplicatedOpId ?? op.name;\n if (dotNotationOpId) {\n op.dotNotationName = dotNotationOpId;\n }\n};\n\n/**\n * Augment an operation's response models with schema-derived data, resolving\n * void responses and streaming item schemas. Returns the response model names\n * to import.\n */\nconst augmentResponses = (\n spec: Spec,\n op: Operation,\n specOp: OpenAPIV3.OperationObject,\n modelsByName: ModelsByName,\n): string[] => {\n const modelImports = op.responses\n .filter((r) => r.export === 'reference')\n .map((r) => r.type);\n\n for (const response of op.responses) {\n // We cannot distinguish a composite of primitives at runtime (it all comes\n // back as text), so validate this away.\n if (\n response.export === 'reference' &&\n COMPOSED_SCHEMA_TYPES.has(modelsByName[response.type]?.export)\n ) {\n const composedPrimitives = (\n modelsByName[response.type].composedPrimitives ?? []\n ).filter((p) => !COLLECTION_TYPES.has(p.export));\n if (composedPrimitives.length > 0) {\n throw new Error(\n `Operation \"${op.method} ${op.path}\" returns a composite schema of primitives with ${camelCase(modelsByName[response.type].export)}, which cannot be distinguished at runtime`,\n );\n }\n }\n\n const matchingSpecResponse = specOp.responses[`${response.code}`];\n if (!matchingSpecResponse) continue;\n\n const specResponse = resolveIfRef(spec, matchingSpecResponse);\n\n // When there's no content, the response type is 'void'\n if (!specResponse.content) {\n response.type = 'void';\n continue;\n }\n\n const mediaTypes = Object.keys(specResponse.content);\n response.mediaTypes = mediaTypes;\n\n for (const mediaType of mediaTypes) {\n const responseContent = specResponse.content[mediaType];\n const responseSchema = resolveIfRef(spec, responseContent.schema);\n if (responseSchema) {\n augmentModelFromSchema(spec, response, responseSchema, modelsByName);\n }\n if (\n STREAMING_CONTENT_TYPES.has(mediaType) &&\n 'itemSchema' in responseContent\n ) {\n response.isJsonlStreaming = true;\n response.itemSchemaModel = buildOrReferenceModel(\n spec,\n modelsByName,\n responseContent.itemSchema as OpenApiSchemaOrRef,\n );\n }\n }\n }\n\n return modelImports;\n};\n\n/**\n * Augment an operation's parameter models with schema-derived data, resolving\n * request bodies and query/header collection formats. Returns the parameter\n * model names to import.\n */\nconst augmentParameters = (\n spec: Spec,\n op: Operation,\n specOp: OpenAPIV3.OperationObject | undefined,\n modelsByName: ModelsByName,\n): string[] => {\n const specParametersByKey = getSpecParametersByKey(\n spec,\n specOp,\n getSpecPathParameters(spec, op),\n );\n\n const modelImports: string[] = [];\n\n for (const parameter of op.parameters) {\n if (parameter.export === 'reference') {\n modelImports.push(parameter.type);\n }\n\n const specParameter =\n specParametersByKey[\n specParameterKey({ in: parameter.in, name: parameter.prop })\n ];\n const specParameterSchema = resolveIfRef(spec, specParameter?.schema);\n if (specParameterSchema) {\n augmentModelFromSchema(\n spec,\n parameter,\n specParameterSchema,\n modelsByName,\n );\n }\n\n if (parameter.in === 'body') {\n augmentBodyParameter(spec, parameter, specOp, modelsByName);\n } else if (\n (parameter.in === 'query' || parameter.in === 'header') &&\n specParameter\n ) {\n parameter.collectionFormat = getCollectionFormat(\n parameter.in,\n specParameter,\n );\n if (parameter.in === 'query' && specParameter.allowReserved) {\n parameter.allowReserved = true;\n }\n } else if (parameter.in === 'path' && specParameter) {\n const style = specParameter.style;\n if (style === 'matrix' || style === 'label') {\n parameter.pathStyle = style;\n parameter.pathExplode = !!specParameter.explode;\n }\n }\n\n addLanguageTypes(parameter);\n }\n\n return modelImports;\n};\n\n/**\n * Augment a request body parameter with its schema (the body is not in the\n * spec's `parameters`, so it is resolved from `requestBody` here) and record\n * its acceptable media types.\n */\nconst augmentBodyParameter = (\n spec: Spec,\n parameter: Model,\n specOp: OpenAPIV3.OperationObject | undefined,\n modelsByName: ModelsByName,\n): void => {\n // The request body parameter is named 'body' downstream.\n parameter.name = 'body';\n parameter.prop = 'body';\n\n const specBody = resolveIfRef(spec, specOp?.requestBody);\n if (!specBody) return;\n\n if (parameter.mediaType) {\n const bodySchema = resolveIfRef(\n spec,\n specBody.content?.[parameter.mediaType]?.schema,\n );\n if (bodySchema) {\n augmentModelFromSchema(spec, parameter, bodySchema, modelsByName);\n }\n }\n // Track all the media types that can be accepted in the request body\n parameter.mediaTypes = Object.keys(specBody.content);\n};\n\n/**\n * Translate an OpenAPI v3 parameter's style/explode into a v2-style\n * collectionFormat used when serialising array parameters.\n * @see https://spec.openapis.org/oas/v3.0.3.html#style-values\n */\nconst getCollectionFormat = (\n position: 'query' | 'header',\n specParameter: OpenAPIV3.ParameterObject,\n): CollectionFormat => {\n const style =\n specParameter.style ?? (position === 'query' ? 'form' : 'simple');\n const explode = specParameter.explode ?? style === 'form';\n\n if (position === 'header') {\n return explode ? 'multi' : 'csv';\n }\n // `deepObject` serialises an object as `key[prop]=value` pairs regardless of\n // explode; the object shape (not array collection) drives its serialisation.\n if (style === 'deepObject') {\n return 'deepObject';\n }\n return explode\n ? 'multi'\n : ((\n {\n spaceDelimited: 'ssv',\n pipeDelimited: 'pipes',\n simple: 'csv',\n form: 'csv',\n } as const\n )[style] ?? 'multi');\n};\n\n/**\n * Build the request parameter models for an operation — one model per parameter\n * position (query/path/header/cookie/body), named e.g.\n * `FooRequestQueryParameters`. Request bodies that can be represented directly\n * (the sole parameter, or a non-clashing object reference) are inlined rather\n * than given a wrapper model, and recorded on `op.explicitRequestBodyParameter`.\n */\nconst buildRequestParameterModels = (\n op: Operation,\n modelsByName: ModelsByName,\n): Model[] => {\n if (!op.parameters || op.parameters.length === 0) {\n return [];\n }\n\n // Whether the request body can be represented directly, without a wrapper\n // model (ie the request will be the body itself).\n const canInlineBody = (body: Model): boolean => {\n // If the body is the only parameter, we can inline it no matter the type\n if (op.parameters.length === 1) {\n return true;\n }\n // We inline object bodies, so long as they aren't dictionaries (as\n // dictionary keys could clash with other parameters), and so long as they\n // don't have a property name that clashes with another parameter\n const hasClashingPropertyName = (\n modelsByName?.[body.type]?.properties ?? []\n ).some((prop) => op.parameters.some((param) => param.name === prop.name));\n return (\n body.export === 'reference' &&\n modelsByName?.[body.type]?.export !== 'dictionary' &&\n !hasClashingPropertyName\n );\n };\n\n // Group parameters by their position (`in`: query/path/header/cookie/body),\n // dropping any body that can be inlined.\n const parametersByPosition = op.parameters\n .filter((p) => !(p.in === 'body' && canInlineBody(p)))\n .reduce<{ [position: string]: Model[] }>(\n (acc, p) => ({ ...acc, [p.in]: [...(acc[p.in] ?? []), p] }),\n {},\n );\n\n // The body parameter was already renamed to \"body\" by augmentBodyParameter.\n op.explicitRequestBodyParameter = parametersByPosition['body']?.[0];\n\n return Object.entries(parametersByPosition).map(([position, parameters]) => {\n const name = `${op.operationIdPascalCase}Request${upperFirst(position)}Parameters`;\n return createModel({\n description: op.description,\n export: 'interface',\n name,\n properties: parameters,\n type: name,\n isRequired: true,\n });\n });\n};\n\n/**\n * Augment a single model with schema-derived data (from its matching spec\n * schema, if any) and language-specific names and types.\n */\nconst augmentModel = (\n spec: Spec,\n model: Model,\n modelsByName: ModelsByName,\n): void => {\n model.nameSnakeCase = toPythonName('model', model.name);\n\n const matchingSpecModel = spec?.components?.schemas?.[model.name];\n if (matchingSpecModel) {\n const specModel = resolveIfRef(spec, matchingSpecModel);\n\n augmentModelFromSchema(spec, model, specModel, modelsByName);\n\n for (const property of model.properties) {\n const matchingSpecProperty = specModel.properties?.[property.name];\n if (matchingSpecProperty) {\n const specProperty = resolveIfRef(spec, matchingSpecProperty);\n augmentModelFromSchema(spec, property, specProperty, modelsByName);\n }\n }\n }\n\n model.properties.forEach(addLanguageTypes);\n\n // Resolve the discriminator's TypeScript property name for marshalling.\n if (model.discriminator) {\n model.discriminator.typescriptPropertyName = toTypeScriptName(\n model.discriminator.propertyName,\n );\n }\n};\n\n/**\n * Ensure no two properties/parameters of an object model collapse onto the same\n * TypeScript identifier (e.g. `foo-bar` and `foo_bar` both camelCase to\n * `fooBar`, or a query and header parameter sharing a name within one request\n * position). Such a clash would emit a type with duplicate members that does\n * not compile, so fail fast with an actionable error instead.\n */\nconst assertNoClashingPropertyNames = (model: Model): void => {\n const seen = new Map<string, string>();\n for (const property of model.properties) {\n // Composite members are unnamed (their names are empty); skip them.\n if (!property.name) continue;\n const existing = seen.get(property.typescriptName!);\n if (existing !== undefined && existing !== property.name) {\n throw new Error(\n `Property name conflict in \"${model.name}\": \"${existing}\" and \"${property.name}\" both map to the TypeScript name \"${property.typescriptName}\". Please rename one of these in your OpenAPI specification.`,\n );\n }\n seen.set(property.typescriptName!, property.name);\n }\n};\n\n/**\n * The marshalling semantics of a property — two properties with the same key\n * convert identically on the wire (so either branch's conversion is safe).\n */\nconst marshallingKey = (m: Model): string => {\n if (['date', 'date-time'].includes(m.format ?? '')) return 'date';\n if (m.type === 'binary') return 'binary';\n // Enums serialise as their bare primitive (no conversion).\n if (m.isEnum || m.export === 'enum') return 'plain';\n if (COLLECTION_TYPES.has(m.export)) {\n return `${m.export}<${m.link ? marshallingKey(m.link) : 'plain'}>`;\n }\n if (m.export === 'tuple') {\n return `tuple<${m.properties.map(marshallingKey).join(',')}>`;\n }\n if (m.export === 'reference' && !PRIMITIVE_TYPES.has(m.type)) {\n return `ref:${m.type}`;\n }\n return 'plain';\n};\n\n/**\n * A non-discriminated `oneOf`/`anyOf` of object members marshals by composing\n * every member, taking only the properties present on the value. That is sound\n * exactly when no wire property is claimed by two members with different\n * marshalling (e.g. a `date-time` in one and a plain string in another) —\n * otherwise the branch cannot be determined without guessing, so fail fast and\n * ask for a discriminator rather than corrupt data at runtime.\n */\nconst assertNoConflictingUnionMemberMarshalling = (model: Model): void => {\n if (\n (model.export !== 'one-of' && model.export !== 'any-of') ||\n model.discriminator\n ) {\n return;\n }\n const seen = new Map<string, { memberName: string; key: string }>();\n for (const member of model.composedModels ?? []) {\n for (const property of member.properties) {\n if (!property.name) continue;\n const key = marshallingKey(property);\n const existing = seen.get(property.name);\n if (existing && existing.key !== key) {\n throw new Error(\n `Schema \"${model.name}\" is a non-discriminated ${camelCase(model.export)} of \"${existing.memberName}\" and \"${member.name}\", which both declare a property \"${property.name}\" with different types, so the correct conversion cannot be determined. Add a discriminator to the union in your OpenAPI specification (e.g. with Pydantic, Field(discriminator=...)).`,\n );\n }\n if (!existing) {\n seen.set(property.name, { memberName: member.name, key });\n }\n }\n }\n};\n\n/**\n * An `application/x-www-form-urlencoded` body is form-encoded as `key=value`\n * pairs, so the wire form is only defined for a schema with named properties\n * (an object) or a primitive sent verbatim. A top-level array or tuple has no\n * property names to key on — encoding it would emit index keys (`0=a&1=b`) that\n * no form parser can decode — so fail fast rather than generate a client that\n * is silently wrong on the wire.\n */\nconst assertEncodableUrlEncodedBody = (op: Operation): void => {\n const body = op.parametersBody;\n if (!body?.mediaTypes) return;\n const mediaTypes = Array.isArray(body.mediaTypes)\n ? body.mediaTypes\n : [body.mediaTypes];\n // Match the wire media type the client actually sends: JSON is preferred, so\n // an array body offering both JSON and urlencoded is sent as JSON and is fine.\n const chosenMediaType =\n mediaTypes.find(\n (mt) => mt === 'application/json' || mt.endsWith('+json'),\n ) ?? mediaTypes[0];\n if (chosenMediaType !== 'application/x-www-form-urlencoded') return;\n if (body.isPrimitive) return;\n if (body.export === 'array' || body.export === 'tuple') {\n throw new Error(\n `Operation ${op.method} ${op.path} has an application/x-www-form-urlencoded request body whose schema is a ${body.export}, which has no defined form encoding. Use an object schema (its properties become the form fields) or a primitive schema (sent verbatim) in your OpenAPI specification.`,\n );\n }\n};\n\n/**\n * Group operations by their (camelCased) tags, collecting any untagged\n * operations separately.\n */\nconst groupOperationsByTag = (\n allOperations: Operation[],\n): {\n operationsByTag: { [tag: string]: Operation[] };\n untaggedOperations: Operation[];\n} => {\n const isTagged = (op: Operation): boolean => !!op.tags && op.tags.length > 0;\n\n const operationsByTag = allOperations\n .filter(isTagged)\n .flatMap((op) => op.tags!.map((tag) => [camelCase(tag), op] as const))\n .reduce<{ [tag: string]: Operation[] }>(\n (acc, [tag, op]) => ({ ...acc, [tag]: [...(acc[tag] ?? []), op] }),\n {},\n );\n\n return {\n operationsByTag,\n untaggedOperations: allOperations.filter((op) => !isTagged(op)),\n };\n};\n\n/**\n * Resolve a schema to its model: an existing named model for a `$ref`, or a\n * freshly built-and-augmented model for an inline (nested value) schema.\n */\nconst buildOrReferenceModel = (\n spec: Spec,\n modelsByName: ModelsByName,\n schema: OpenApiSchemaOrRef,\n): Model => {\n if (isRef(schema)) {\n const name = splitRef(schema.$ref)[2];\n return modelsByName[name];\n }\n const model = buildInlineModel(spec, schema);\n linkModel(spec, modelsByName, model, schema);\n augmentModelFromSchema(spec, model, schema, modelsByName);\n return model;\n};\n\n/**\n * The `x-*` vendor extensions declared on an object.\n */\nconst vendorExtensionsOf = (object: object | undefined): VendorExtensions =>\n Object.fromEntries(\n Object.entries(object ?? {}).filter(([key]) => key.startsWith('x-')),\n );\n\nconst augmentModelFromSchema = (\n spec: Spec,\n model: Model,\n schema: OpenApiSchema,\n modelsByName: ModelsByName,\n visited: Set<Model> = new Set(),\n) => {\n model.format = schema.format;\n model.deprecated = !!schema.deprecated;\n model.openapiType = schema.type;\n model.isEnum = !!schema.enum && schema.enum.length > 0;\n model.vendorExtensions = vendorExtensionsOf(schema);\n\n // A \"dictionary\" has only additional properties; an \"interface\" may mix\n // explicit and additional properties.\n if (schema.additionalProperties) {\n const additionalPropertiesModel = buildOrReferenceModel(\n spec,\n modelsByName,\n schema.additionalProperties === true ? {} : schema.additionalProperties,\n );\n\n if (model.export === 'dictionary') {\n // A dictionary carries a self-referential property; the rest are explicit\n const explicitProperties = model.properties.filter(\n (p) => !(p.export === 'dictionary' && p.name === model.name),\n );\n\n // Explicit properties make this an interface rather than a dictionary\n if (explicitProperties.length > 0 || schema.patternProperties) {\n model.export = 'interface';\n model.hasAdditionalProperties = true;\n model.additionalPropertiesModel = additionalPropertiesModel;\n model.properties = explicitProperties;\n }\n } else {\n model.hasAdditionalProperties = true;\n model.additionalPropertiesModel = additionalPropertiesModel;\n }\n }\n\n // Pattern properties can have different value types per pattern, so the model\n // is an interface rather than a dictionary.\n if (schema.patternProperties) {\n const patternProperties = resolveIfRef(spec, schema.patternProperties);\n\n if (model.export === 'dictionary') {\n model.export = 'interface';\n }\n\n model.hasPatternProperties = true;\n model.patternPropertiesModels = Object.entries(patternProperties)\n .map(([pattern, patternProperty]) => ({\n pattern,\n model: buildOrReferenceModel(spec, modelsByName, patternProperty),\n }))\n .filter((entry): entry is PatternPropertyModel => !!entry.model);\n }\n\n addLanguageTypes(model);\n\n visited.add(model);\n\n const recurse = (target: Model, subSchema: OpenApiSchema): void =>\n augmentModelFromSchema(spec, target, subSchema, modelsByName, visited);\n\n // Array element type.\n if (\n model.export === 'array' &&\n model.link &&\n 'items' in schema &&\n schema.items &&\n !visited.has(model.link)\n ) {\n recurse(model.link, resolveIfRef(spec, schema.items));\n }\n\n // Dictionary value type (additionalProperties may be `true` rather than a\n // schema).\n if (\n model.export === 'dictionary' &&\n model.link &&\n 'additionalProperties' in schema &&\n schema.additionalProperties &&\n !visited.has(model.link)\n ) {\n const subSchema = resolveIfRef(spec, schema.additionalProperties);\n if (subSchema !== true) {\n recurse(model.link, subSchema);\n }\n }\n\n // Tuple element types (3.1 `prefixItems`), positionally.\n if (model.export === 'tuple' && 'prefixItems' in schema) {\n const memberSchemas =\n (schema as { prefixItems?: OpenApiSchemaOrRef[] }).prefixItems ?? [];\n model.properties.forEach((member, i) => {\n const subSchema = resolveIfRef(spec, memberSchemas[i]);\n if (subSchema && !visited.has(member)) {\n recurse(member, subSchema);\n }\n });\n }\n\n model.properties\n .filter((p) => !visited.has(p) && schema.properties?.[trim(p.name, `\"'`)])\n .forEach((property) =>\n recurse(\n property,\n resolveIfRef(spec, schema.properties![trim(property.name, `\"'`)]),\n ),\n );\n\n if (COMPOSED_SCHEMA_TYPES.has(model.export)) {\n const memberSchemas = compositeMemberSchemas(schema, model.export);\n model.properties.forEach((property, i) => {\n const subSchema = resolveIfRef(spec, memberSchemas[i]);\n if (subSchema) {\n recurse(property, subSchema);\n }\n });\n }\n};\n\nconst addLanguageTypes = (model: Model) => {\n model.name = trim(model.name, `\"'`);\n model.typescriptName = toTypeScriptName(model.name);\n model.typescriptType = toTypeScriptType(model);\n model.pythonName = toPythonName('property', model.name);\n model.pythonType = toPythonType(model);\n model.isPrimitive =\n PRIMITIVE_TYPES.has(model.type) &&\n !COMPOSED_SCHEMA_TYPES.has(model.export) &&\n !COLLECTION_TYPES.has(model.export);\n};\n\nconst isOperationMutation = (op: Operation): boolean => {\n // x-mutation/x-query override the HTTP-method default.\n const { vendorExtensions } = op;\n if (vendorExtensions?.[VENDOR_EXTENSIONS.MUTATION]) {\n return true;\n } else if (vendorExtensions?.[VENDOR_EXTENSIONS.QUERY]) {\n return false;\n }\n return ['PATCH', 'POST', 'PUT', 'DELETE'].includes(op.method);\n};\n\nconst augmentInfiniteQuery = (op: Operation) => {\n const { paginationDisabled, cursorPropertyName } = getCursorOptions(op);\n\n const cursorProperty = op.parameters.find(\n (p) => p.name === cursorPropertyName,\n );\n\n // An infinite query is a paginated operation that accepts the cursor parameter\n op.isInfiniteQuery = !paginationDisabled && !!cursorProperty;\n if (op.isInfiniteQuery) {\n op.infiniteQueryCursorProperty = cursorProperty;\n }\n};\n\n/**\n * Resolve the pagination cursor options from an operation's `x-cursor` vendor\n * extension. Accepted forms (object variants exist because Smithy vendor\n * extensions must be objects):\n *\n * - `'property'` / `{ inputToken: 'property' }` — the input property to page on\n * - `false` / `{ enabled: false }` — disable pagination\n */\nconst getCursorOptions = (\n op: Operation,\n): { paginationDisabled: boolean; cursorPropertyName: string } => {\n const cursor = op.vendorExtensions?.[VENDOR_EXTENSIONS.CURSOR];\n\n // Defaults: pagination enabled, paging on a property named 'cursor'.\n if (cursor === false) {\n return { paginationDisabled: true, cursorPropertyName: 'cursor' };\n }\n if (typeof cursor === 'string') {\n return { paginationDisabled: false, cursorPropertyName: cursor };\n }\n const options = (cursor ?? {}) as { enabled?: boolean; inputToken?: unknown };\n return {\n paginationDisabled: options.enabled === false,\n cursorPropertyName:\n typeof options.inputToken === 'string' ? options.inputToken : 'cursor',\n };\n};\n\n/**\n * Add query/mutation, streaming and infinite-query flags to an operation.\n */\nconst augmentOperationBehaviour = (op: Operation) => {\n const isMutation = isOperationMutation(op);\n op.isMutation = isMutation;\n op.isQuery = !isMutation;\n\n op.isStreaming =\n !!op.vendorExtensions?.[VENDOR_EXTENSIONS.STREAMING] ||\n op.responses.some((res) => res.isJsonlStreaming);\n\n // For JSON-lines streaming, the result is each streamed item, so the client\n // method returns AsyncIterableIterator<itemSchemaModel>. Named (hoisted)\n // item schemas become references; inline primitives keep their own type.\n const jsonlResponse = op.responses.find((res) => res.isJsonlStreaming);\n if (jsonlResponse) {\n const itemSchemaModel = jsonlResponse.itemSchemaModel;\n const result = op.result;\n if (result && itemSchemaModel) {\n if (itemSchemaModel.name) {\n result.type = itemSchemaModel.name;\n result.typescriptType = itemSchemaModel.name;\n result.export = 'reference';\n } else {\n result.type = itemSchemaModel.type;\n result.typescriptType = itemSchemaModel.typescriptType;\n result.export = itemSchemaModel.export;\n result.format = itemSchemaModel.format;\n result.link = itemSchemaModel.link;\n result.isPrimitive = itemSchemaModel.isPrimitive;\n }\n }\n }\n\n // Add infinite query details if applicable\n if (!isMutation) {\n augmentInfiniteQuery(op);\n }\n};\n"],"names":["orderBy","trim","uniqBy","camelCase","pascalCase","snakeCase","toClassName","upperFirst","toPythonName","toPythonType","toTypeScriptModelName","toTypeScriptName","toTypeScriptType","COLLECTION_TYPES","COMPOSED_SCHEMA_TYPES","createModel","DEFAULT_SERVICE_NAME","indexModelsByName","PRIMITIVE_TYPES","STREAMING_CONTENT_TYPES","VENDOR_EXTENSIONS","normaliseOpenApiSpecForCodeGen","buildClientData","buildInlineModel","compositeMemberSchemas","getSpecOperation","getSpecParametersByKey","getSpecPathParameters","linkModel","specParameterKey","isRef","resolveIfRef","splitRef","buildOpenApiCodeGenData","inSpec","spec","data","modelsByName","models","service","services","augmentService","allOperations","flatMap","s","operations","o","uniqueName","op","buildRequestParameterModels","model","augmentModel","typescriptName","name","typescriptType","assertNoClashingPropertyNames","assertNoConflictingUnionMemberMarshalling","assertEncodableUrlEncodedBody","d","operationsByTag","untaggedOperations","groupOperationsByTag","info","vendorExtensions","vendorExtensionsOf","className","title","modelImports","augmentOperation","imports","x","nameSnakeCase","specOp","assignOperationNames","augmentResponses","augmentParameters","responses","forEach","addLanguageTypes","r","code","result","find","operationIdPascalCase","operationIdSnakeCase","parameters","length","baseRequestTypeName","requestTypeName","components","schemas","augmentOperationBehaviour","deduplicatedOpId","dotNotationOpId","id","dotNotationName","filter","export","map","type","response","has","composedPrimitives","p","Error","method","path","matchingSpecResponse","specResponse","content","mediaTypes","Object","keys","mediaType","responseContent","responseSchema","schema","augmentModelFromSchema","isJsonlStreaming","itemSchemaModel","buildOrReferenceModel","itemSchema","specParametersByKey","parameter","push","specParameter","in","prop","specParameterSchema","augmentBodyParameter","collectionFormat","getCollectionFormat","allowReserved","style","pathStyle","pathExplode","explode","specBody","requestBody","bodySchema","position","spaceDelimited","pipeDelimited","simple","form","canInlineBody","body","hasClashingPropertyName","properties","some","param","parametersByPosition","reduce","acc","explicitRequestBodyParameter","entries","description","isRequired","matchingSpecModel","specModel","property","matchingSpecProperty","specProperty","discriminator","typescriptPropertyName","propertyName","seen","Map","existing","get","undefined","set","marshallingKey","m","includes","format","isEnum","link","join","member","composedModels","key","memberName","parametersBody","Array","isArray","chosenMediaType","mt","endsWith","isPrimitive","isTagged","tags","tag","$ref","object","fromEntries","startsWith","visited","Set","deprecated","openapiType","enum","additionalProperties","additionalPropertiesModel","explicitProperties","patternProperties","hasAdditionalProperties","hasPatternProperties","patternPropertiesModels","pattern","patternProperty","entry","add","recurse","target","subSchema","items","memberSchemas","prefixItems","i","pythonName","pythonType","isOperationMutation","MUTATION","QUERY","augmentInfiniteQuery","paginationDisabled","cursorPropertyName","getCursorOptions","cursorProperty","isInfiniteQuery","infiniteQueryCursorProperty","cursor","CURSOR","options","enabled","inputToken","isMutation","isQuery","isStreaming","STREAMING","res","jsonlResponse"],"mappings":"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"}
|