@rexeus/typeweaver-openapi 0.11.0
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/README.md +97 -0
- package/dist/LICENSE +202 -0
- package/dist/NOTICE +4 -0
- package/dist/index.cjs +1317 -0
- package/dist/index.d.cts +130 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +130 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1294 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["isJsonSchema"],"sources":["../src/internal/zodIntrospection.ts","../src/internal/bodyContent.ts","../src/internal/jsonPointer.ts","../src/internal/openApiPath.ts","../src/internal/operationContext.ts","../src/internal/openApiSchemaNormalization.ts","../src/internal/schemaConversion.ts","../src/internal/parameterContainer.ts","../src/internal/parameters.ts","../src/internal/headerObjects.ts","../src/internal/schemaRebasing.ts","../src/internal/responseHeaderMerge.ts","../src/internal/responses.ts","../src/internal/schemaRegistry.ts","../src/buildOpenApiDocument.ts","../src/OpenApiPlugin.ts"],"sourcesContent":["import type { z } from \"zod\";\n\nexport type ZodSchema = z.core.$ZodType;\n\nexport type ZodDefinition = {\n readonly type?: string;\n readonly innerType?: ZodSchema;\n readonly out?: ZodSchema;\n readonly schema?: ZodSchema;\n};\n\nexport type ZodTransparentWrapperType =\n | \"optional\"\n | \"nullable\"\n | \"default\"\n | \"catch\"\n | \"prefault\"\n | \"readonly\"\n | \"nonoptional\";\n\nconst TRANSPARENT_WRAPPER_TYPES: ReadonlySet<string> = new Set([\n \"optional\",\n \"nullable\",\n \"default\",\n \"catch\",\n \"prefault\",\n \"readonly\",\n \"nonoptional\",\n]);\n\nexport function getSchemaDefinition(\n schema: ZodSchema | undefined\n): ZodDefinition | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n const schemaWithDefinition = schema as ZodSchema & {\n readonly def?: ZodDefinition;\n readonly _def?: ZodDefinition;\n };\n\n return (\n (schemaWithDefinition._zod?.def as ZodDefinition | undefined) ??\n schemaWithDefinition.def ??\n schemaWithDefinition._def\n );\n}\n\nexport function getSchemaType(schema: ZodSchema): string;\nexport function getSchemaType(\n schema: ZodSchema | undefined\n): string | undefined;\nexport function getSchemaType(\n schema: ZodSchema | undefined\n): string | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n return getSchemaDefinition(schema)?.type ?? \"unknown\";\n}\n\nexport function isZodTransparentWrapperType(\n schemaType: string | undefined,\n transparentWrapperTypes: ReadonlySet<string> = TRANSPARENT_WRAPPER_TYPES\n): schemaType is ZodTransparentWrapperType {\n return schemaType !== undefined && transparentWrapperTypes.has(schemaType);\n}\n","import type { NormalizedHttpBody } from \"@rexeus/typeweaver-gen\";\nimport type { JsonSchema } from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport {\n getSchemaDefinition,\n getSchemaType,\n isZodTransparentWrapperType,\n} from \"./zodIntrospection.js\";\nimport type { ZodTransparentWrapperType } from \"./zodIntrospection.js\";\nimport type { z } from \"zod\";\n\nexport type OpenApiBodySchemaResolution<TWarning> = {\n readonly schema: JsonSchema;\n readonly schemaKey: string;\n readonly warnings: readonly TWarning[];\n};\n\nconst OPEN_API_BINARY_SCHEMA = {\n type: \"string\",\n format: \"binary\",\n} satisfies JsonSchema;\nconst RAW_BODY_TRANSPARENT_WRAPPER_TYPES: ReadonlySet<ZodTransparentWrapperType> =\n new Set([\n \"optional\",\n \"nullable\",\n \"default\",\n \"catch\",\n \"prefault\",\n \"readonly\",\n \"nonoptional\",\n ]);\n\nexport function resolveOpenApiBodySchema<TWarning>(\n body: NormalizedHttpBody,\n registerSchema: () => OpenApiBodySchemaResolution<TWarning>\n): OpenApiBodySchemaResolution<TWarning> {\n return shouldUseBinarySchema(body)\n ? {\n schema: OPEN_API_BINARY_SCHEMA,\n schemaKey: \"openapi-binary\",\n warnings: [],\n }\n : registerSchema();\n}\n\nfunction shouldUseBinarySchema(body: NormalizedHttpBody): boolean {\n return (\n body.transport === \"raw\" &&\n mediaTypeEssence(body.mediaType) === \"application/octet-stream\" &&\n (body.mediaTypeSource === \"raw-fallback\" ||\n isAmbiguousRawSchema(body.schema))\n );\n}\n\nfunction mediaTypeEssence(mediaType: string): string {\n return mediaType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n}\n\nfunction isAmbiguousRawSchema(schema: z.core.$ZodType): boolean {\n const schemaType = getSchemaType(unwrapTransparentSchema(schema));\n\n return schemaType === \"any\" || schemaType === \"unknown\";\n}\n\nfunction unwrapTransparentSchema(\n schema: z.core.$ZodType\n): z.core.$ZodType | undefined {\n const visitedSchemas = new Set<z.core.$ZodType>();\n let current: z.core.$ZodType | undefined = schema;\n\n while (current !== undefined && !visitedSchemas.has(current)) {\n visitedSchemas.add(current);\n\n const definition = getSchemaDefinition(current);\n const schemaType = definition?.type;\n\n if (\n isZodTransparentWrapperType(\n schemaType,\n RAW_BODY_TRANSPARENT_WRAPPER_TYPES\n )\n ) {\n current = definition?.innerType;\n continue;\n }\n\n if (schemaType === \"pipe\") {\n const outputType = getSchemaType(definition?.out);\n\n if (outputType === undefined || outputType === \"transform\") {\n return undefined;\n }\n\n current = definition?.out;\n continue;\n }\n\n if (schemaType === \"effects\") {\n current = definition?.schema;\n continue;\n }\n\n return current;\n }\n\n return current;\n}\n","export function jsonPointer(segments: readonly string[]): string {\n if (segments.length === 0) {\n return \"\";\n }\n\n return `/${segments.map(escapeJsonPointerSegment).join(\"/\")}`;\n}\n\nexport function appendJsonPointer(base: string, suffix: string): string {\n if (suffix === \"\") {\n return base;\n }\n\n if (base === \"\") {\n return suffix;\n }\n\n return `${base}${suffix}`;\n}\n\nexport function isJsonPointerAtOrBelow(path: string, prefix: string): boolean {\n return path === prefix || path.startsWith(`${prefix}/`);\n}\n\nexport function escapeJsonPointerSegment(segment: string): string {\n return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n}\n","export function toOpenApiPath(path: string): string {\n const segments = normalizePathSegments(path).map(segment =>\n segment.replaceAll(pathParameterPattern, \"{$1}\")\n );\n\n return `/${segments.join(\"/\")}`;\n}\n\nexport function getPathParameterNames(path: string): readonly string[] {\n return normalizePathSegments(path).flatMap(segment =>\n Array.from(segment.matchAll(pathParameterPattern), match => match[1] ?? \"\")\n );\n}\n\nconst pathParameterPattern = /:([A-Za-z0-9_]+)/g;\n\nfunction normalizePathSegments(path: string): readonly string[] {\n return path.split(\"/\").filter(segment => segment.length > 0);\n}\n","import type { NormalizedOperation } from \"@rexeus/typeweaver-gen\";\nimport type { OpenApiWarningLocation } from \"../types.js\";\n\nexport type OperationContext = {\n readonly resourceName: string;\n readonly operation: Pick<\n NormalizedOperation,\n \"operationId\" | \"path\" | \"request\"\n > & { readonly method: string };\n readonly openApiPath: string;\n readonly method: string;\n};\n\nexport function createOperationLocation(options: {\n readonly context: OperationContext;\n readonly part: string;\n readonly parameterName?: string;\n readonly responseName?: string;\n readonly statusCode?: string;\n}): OpenApiWarningLocation {\n const isComponentResponseLocation =\n options.context.resourceName === \"components.responses\";\n\n return {\n resourceName: options.context.resourceName,\n operationId: options.context.operation.operationId,\n ...(isComponentResponseLocation\n ? {}\n : {\n method: options.context.operation.method,\n path: options.context.operation.path,\n }),\n openApiPath: options.context.openApiPath,\n part: options.part,\n parameterName: options.parameterName,\n responseName: options.responseName,\n statusCode: options.statusCode,\n };\n}\n","import type {\n JsonSchema,\n JsonSchemaValue,\n} from \"@rexeus/typeweaver-zod-to-json-schema\";\n\nconst SCHEMA_CHILD_KEYS: ReadonlySet<string> = new Set([\n \"items\",\n \"additionalProperties\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n \"contains\",\n \"propertyNames\",\n]);\n\nconst SCHEMA_CHILD_MAP_KEYS: ReadonlySet<string> = new Set([\n \"properties\",\n \"patternProperties\",\n \"$defs\",\n \"definitions\",\n \"dependentSchemas\",\n]);\n\nconst SCHEMA_CHILD_ARRAY_KEYS: ReadonlySet<string> = new Set([\n \"prefixItems\",\n \"allOf\",\n \"anyOf\",\n \"oneOf\",\n]);\n\nexport function normalizeOpenApiSchema(schema: JsonSchema): JsonSchema {\n const hasConst = hasOwnSchemaKeyword(schema, \"const\");\n const normalizedEntries = Object.entries(schema)\n .filter(([key]) => key !== \"const\")\n .map(([key, value]) => [key, normalizeSchemaKeyword(key, value)]);\n const constValue = schema.const;\n\n if (hasConst && constValue !== undefined) {\n normalizedEntries.push([\"enum\", [constValue]]);\n }\n\n return Object.fromEntries(normalizedEntries) as JsonSchema;\n}\n\nfunction normalizeSchemaKeyword(\n key: string,\n value: JsonSchemaValue\n): JsonSchemaValue {\n if (SCHEMA_CHILD_KEYS.has(key) && isJsonSchema(value)) {\n return normalizeOpenApiSchema(value);\n }\n\n if (SCHEMA_CHILD_MAP_KEYS.has(key) && isJsonSchema(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([childKey, childValue]) => [\n childKey,\n isJsonSchema(childValue)\n ? normalizeOpenApiSchema(childValue)\n : childValue,\n ])\n );\n }\n\n if (SCHEMA_CHILD_ARRAY_KEYS.has(key) && Array.isArray(value)) {\n return value.map(entry =>\n isJsonSchema(entry) ? normalizeOpenApiSchema(entry) : entry\n );\n }\n\n return value;\n}\n\nfunction isJsonSchema(value: JsonSchemaValue): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwnSchemaKeyword(schema: JsonSchema, keyword: string): boolean {\n return Object.prototype.hasOwnProperty.call(schema, keyword);\n}\n","import { fromZod } from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport type {\n JsonSchema,\n JsonSchemaValue,\n} from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport { z } from \"zod\";\nimport { appendJsonPointer, escapeJsonPointerSegment } from \"./jsonPointer.js\";\nimport { normalizeOpenApiSchema } from \"./openApiSchemaNormalization.js\";\nimport { getSchemaDefinition } from \"./zodIntrospection.js\";\nimport type {\n OpenApiSchemaConversionWarning,\n OpenApiWarningLocation,\n} from \"../types.js\";\n\nexport type SchemaConversionResult = {\n readonly schema: JsonSchema;\n readonly warnings: readonly OpenApiSchemaConversionWarning[];\n};\n\nexport type OptionalSchemaResult = {\n readonly schema: z.core.$ZodType;\n readonly isOptional: boolean;\n};\n\nexport type ConvertSchemaOptions = {\n readonly rebaseLocalRefs?: boolean;\n};\n\nexport function convertSchema(\n schema: z.core.$ZodType,\n documentPath: string,\n location: OpenApiWarningLocation,\n options: ConvertSchemaOptions = {}\n): SchemaConversionResult {\n const result = fromZod(schema);\n const shouldRebaseLocalRefs = options.rebaseLocalRefs ?? true;\n const openApiSchema = normalizeOpenApiSchema(result.schema);\n\n return {\n schema: shouldRebaseLocalRefs\n ? rebaseLocalJsonSchemaRefs(openApiSchema, documentPath)\n : openApiSchema,\n warnings: result.warnings.map(warning => ({\n origin: \"schema-conversion\",\n code: warning.code,\n message: warning.message,\n schemaType: warning.schemaType,\n schemaPath: warning.path,\n documentPath: appendJsonPointer(documentPath, warning.path),\n location,\n })),\n };\n}\n\nexport function rebaseLocalJsonSchemaRefs(\n schema: JsonSchema,\n documentPath: string\n): JsonSchema {\n return rebaseJsonSchemaValue(schema, documentPath) as JsonSchema;\n}\n\nexport function unwrapRootOptional(\n schema: z.core.$ZodType\n): OptionalSchemaResult {\n return {\n schema: unwrapRootSchema(schema),\n isOptional: omittedInputResult(schema) !== \"rejects\",\n };\n}\n\nfunction unwrapRootSchema(schema: z.core.$ZodType): z.core.$ZodType {\n const visitedSchemas = new Set<z.core.$ZodType>();\n let current = schema;\n\n while (!visitedSchemas.has(current)) {\n visitedSchemas.add(current);\n\n const definition = getSchemaDefinition(current);\n const schemaType = definition?.type;\n\n if (schemaType === \"nullable\") {\n return current;\n }\n\n if (\n schemaType === \"optional\" ||\n schemaType === \"default\" ||\n schemaType === \"catch\" ||\n schemaType === \"prefault\" ||\n schemaType === \"readonly\" ||\n schemaType === \"nonoptional\"\n ) {\n const innerType = definition?.innerType;\n\n if (innerType === undefined) {\n return current;\n }\n\n current = innerType;\n continue;\n }\n\n return current;\n }\n\n return current;\n}\n\ntype OmittedInputResult = \"rejects\" | \"accepts-defined\" | \"accepts-undefined\";\n\nfunction omittedInputResult(schema: z.core.$ZodType): OmittedInputResult {\n const visitedSchemas = new Set<z.core.$ZodType>();\n let current = schema;\n\n while (!visitedSchemas.has(current)) {\n visitedSchemas.add(current);\n\n const definition = getSchemaDefinition(current);\n const schemaType = definition?.type;\n\n if (schemaType === \"optional\") {\n return \"accepts-undefined\";\n }\n\n if (schemaType === \"default\" || schemaType === \"prefault\") {\n return \"accepts-defined\";\n }\n\n if (schemaType === \"catch\") {\n const innerType = definition?.innerType;\n\n if (innerType === undefined) {\n return \"accepts-defined\";\n }\n\n const innerResult = omittedInputResult(innerType);\n\n return innerResult === \"rejects\" ? \"accepts-defined\" : innerResult;\n }\n\n if (schemaType === \"nonoptional\") {\n const innerType = definition?.innerType;\n\n if (innerType === undefined) {\n return \"rejects\";\n }\n\n return omittedInputResult(innerType) === \"accepts-defined\"\n ? \"accepts-defined\"\n : \"rejects\";\n }\n\n if (schemaType === \"nullable\" || schemaType === \"readonly\") {\n const innerType = definition?.innerType;\n\n if (innerType === undefined) {\n return \"rejects\";\n }\n\n current = innerType;\n continue;\n }\n\n return \"rejects\";\n }\n\n return \"rejects\";\n}\n\nexport function getObjectProperties(\n schema: JsonSchema\n): Record<string, JsonSchema> {\n const properties = schema.properties;\n\n if (!isJsonSchema(properties)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(properties).filter((entry): entry is [string, JsonSchema] =>\n isJsonSchema(entry[1])\n )\n );\n}\n\nexport function preserveReferencedRootDefinitions(\n schema: JsonSchema,\n rootSchema: JsonSchema\n): JsonSchema {\n return [\"$defs\", \"definitions\"].reduce(\n (selfContainedSchema, definitionKey) =>\n preserveReferencedRootDefinitionKeyword({\n schema: selfContainedSchema,\n sourceSchema: selfContainedSchema,\n rootSchema,\n definitionKey,\n }),\n schema\n );\n}\n\nexport function getRequiredNames(schema: JsonSchema): ReadonlySet<string> {\n if (!Array.isArray(schema.required)) {\n return new Set();\n }\n\n return new Set(\n schema.required.filter(\n (entry): entry is string => typeof entry === \"string\"\n )\n );\n}\n\nexport function hasUnrepresentableAdditionalProperties(\n schema: JsonSchema\n): boolean {\n return (\n Object.prototype.hasOwnProperty.call(schema, \"additionalProperties\") &&\n schema.additionalProperties !== false\n );\n}\n\nexport function isJsonSchema(value: unknown): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction rebaseJsonSchemaValue(\n value: JsonSchemaValue,\n documentPath: string\n): JsonSchemaValue {\n if (Array.isArray(value)) {\n return value.map(item => rebaseJsonSchemaValue(item, documentPath));\n }\n\n if (!isJsonSchema(value)) {\n return value;\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n key === \"$ref\" && typeof child === \"string\"\n ? rebaseLocalJsonSchemaRef(child, documentPath)\n : rebaseJsonSchemaValue(child, documentPath),\n ])\n ) as JsonSchema;\n}\n\nfunction rebaseLocalJsonSchemaRef(ref: string, documentPath: string): string {\n if (ref === \"#\") {\n return `#${documentPath}`;\n }\n\n if (ref.startsWith(\"#/\")) {\n return `#${appendJsonPointer(documentPath, ref.slice(1))}`;\n }\n\n return ref;\n}\n\nfunction preserveReferencedRootDefinitionKeyword(options: {\n readonly schema: JsonSchema;\n readonly sourceSchema: JsonSchema;\n readonly rootSchema: JsonSchema;\n readonly definitionKey: string;\n}): JsonSchema {\n const rootDefinitions = options.rootSchema[options.definitionKey];\n\n if (!isJsonSchema(rootDefinitions)) {\n return options.schema;\n }\n\n const referencedDefinitions = collectReferencedRootDefinitions({\n schema: options.sourceSchema,\n rootDefinitions,\n definitionKey: options.definitionKey,\n });\n\n if (Object.keys(referencedDefinitions).length === 0) {\n return options.schema;\n }\n\n const existingDefinitions = options.schema[options.definitionKey];\n\n return {\n ...options.schema,\n [options.definitionKey]: {\n ...(isJsonSchema(existingDefinitions) ? existingDefinitions : {}),\n ...referencedDefinitions,\n },\n };\n}\n\nfunction collectReferencedRootDefinitions(options: {\n readonly schema: JsonSchema;\n readonly rootDefinitions: JsonSchema;\n readonly definitionKey: string;\n}): JsonSchema {\n const referencedNames = collectReferencedDefinitionNames(\n options.schema,\n options.definitionKey\n );\n const pendingNames = [...referencedNames];\n const copiedDefinitions: Record<string, JsonSchemaValue> = {};\n\n for (const name of pendingNames) {\n if (Object.prototype.hasOwnProperty.call(copiedDefinitions, name)) {\n continue;\n }\n\n const definition = options.rootDefinitions[name];\n\n if (definition === undefined) {\n continue;\n }\n\n copiedDefinitions[name] = definition;\n\n if (!isJsonSchema(definition)) {\n continue;\n }\n\n for (const transitiveName of collectReferencedDefinitionNames(\n definition,\n options.definitionKey\n )) {\n if (\n !Object.prototype.hasOwnProperty.call(copiedDefinitions, transitiveName)\n ) {\n pendingNames.push(transitiveName);\n }\n }\n }\n\n return copiedDefinitions;\n}\n\nfunction collectReferencedDefinitionNames(\n value: JsonSchemaValue,\n definitionKey: string\n): ReadonlySet<string> {\n const names = new Set<string>();\n\n collectReferencedDefinitionNamesFromValue(value, definitionKey, names);\n\n return names;\n}\n\nfunction collectReferencedDefinitionNamesFromValue(\n value: JsonSchemaValue,\n definitionKey: string,\n names: Set<string>\n): void {\n if (Array.isArray(value)) {\n value.forEach(item =>\n collectReferencedDefinitionNamesFromValue(item, definitionKey, names)\n );\n return;\n }\n\n if (!isJsonSchema(value)) {\n return;\n }\n\n Object.entries(value).forEach(([key, child]) => {\n if (key === \"$ref\" && typeof child === \"string\") {\n const definitionName = getReferencedRootDefinitionName(\n child,\n definitionKey\n );\n\n if (definitionName !== undefined) {\n names.add(definitionName);\n }\n\n return;\n }\n\n collectReferencedDefinitionNamesFromValue(child, definitionKey, names);\n });\n}\n\nfunction getReferencedRootDefinitionName(\n ref: string,\n definitionKey: string\n): string | undefined {\n const prefix = `#/${escapeJsonPointerSegment(definitionKey)}/`;\n\n if (!ref.startsWith(prefix)) {\n return undefined;\n }\n\n const [encodedName] = ref.slice(prefix.length).split(\"/\");\n\n if (encodedName === undefined || encodedName === \"\") {\n return undefined;\n }\n\n return unescapeJsonPointerSegment(encodedName);\n}\n\nfunction unescapeJsonPointerSegment(segment: string): string {\n return segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n}\n","import type { JsonSchema } from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport { createOperationLocation } from \"./operationContext.js\";\nimport {\n convertSchema,\n getObjectProperties,\n getRequiredNames,\n hasUnrepresentableAdditionalProperties,\n preserveReferencedRootDefinitions,\n unwrapRootOptional,\n} from \"./schemaConversion.js\";\nimport type {\n OpenApiBuildWarning,\n OpenApiDiagnosticWarning,\n} from \"../types.js\";\nimport type { OperationContext } from \"./operationContext.js\";\nimport type { z } from \"zod\";\n\nexport type ParameterContainerResult = {\n readonly properties: Record<string, JsonSchema>;\n readonly requiredNames: ReadonlySet<string>;\n readonly warnings: readonly OpenApiBuildWarning[];\n readonly isRootOptional: boolean;\n};\n\nexport function extractParameterContainer(options: {\n readonly schema: z.core.$ZodType | undefined;\n readonly context: OperationContext;\n readonly part: string;\n readonly containerPointer: string;\n readonly responseName?: string;\n readonly statusCode?: string;\n}): ParameterContainerResult {\n if (options.schema === undefined) {\n return {\n properties: {},\n requiredNames: new Set(),\n warnings: [],\n isRootOptional: false,\n };\n }\n\n const optionalSchema = unwrapRootOptional(options.schema);\n const converted = convertSchema(\n optionalSchema.schema,\n options.containerPointer,\n createOperationLocation({\n context: options.context,\n part: options.part,\n responseName: options.responseName,\n statusCode: options.statusCode,\n }),\n { rebaseLocalRefs: false }\n );\n const properties = Object.fromEntries(\n Object.entries(getObjectProperties(converted.schema)).map(\n ([name, schema]) => [\n name,\n preserveReferencedRootDefinitions(schema, converted.schema),\n ]\n )\n );\n const warnings: OpenApiBuildWarning[] = [...converted.warnings];\n const hasFiniteProperties = Object.keys(properties).length > 0;\n\n if (converted.schema.type !== \"object\") {\n warnings.push(\n createContainerWarning({\n code: \"unrepresentable-parameter-container\",\n message: `${options.part} must be a finite object schema to become OpenAPI parameters.`,\n documentPath: options.containerPointer,\n context: options.context,\n part: options.part,\n responseName: options.responseName,\n statusCode: options.statusCode,\n })\n );\n } else if (\n !hasFiniteProperties &&\n hasUnrepresentableAdditionalProperties(converted.schema)\n ) {\n warnings.push(\n createContainerWarning({\n code: \"unrepresentable-parameter-container\",\n message: `${options.part} record entries cannot be represented as finite OpenAPI parameters.`,\n documentPath: options.containerPointer,\n context: options.context,\n part: options.part,\n responseName: options.responseName,\n statusCode: options.statusCode,\n })\n );\n } else if (hasUnrepresentableAdditionalProperties(converted.schema)) {\n warnings.push(\n createContainerWarning({\n code: \"unrepresentable-parameter-additional-properties\",\n message: `${options.part} additional properties cannot be represented as OpenAPI parameters.`,\n documentPath: options.containerPointer,\n context: options.context,\n part: options.part,\n responseName: options.responseName,\n statusCode: options.statusCode,\n })\n );\n }\n\n return {\n properties,\n requiredNames: getRequiredNames(converted.schema),\n warnings,\n isRootOptional: optionalSchema.isOptional,\n };\n}\n\nfunction createContainerWarning(options: {\n readonly code: OpenApiDiagnosticWarning[\"code\"];\n readonly message: string;\n readonly documentPath: string;\n readonly context: OperationContext;\n readonly part: string;\n readonly responseName?: string;\n readonly statusCode?: string;\n}): OpenApiDiagnosticWarning {\n return {\n origin: \"openapi-builder\",\n code: options.code,\n message: options.message,\n documentPath: options.documentPath,\n location: createOperationLocation(options),\n };\n}\n","import {\n escapeJsonPointerSegment,\n isJsonPointerAtOrBelow,\n jsonPointer,\n} from \"./jsonPointer.js\";\nimport { getPathParameterNames } from \"./openApiPath.js\";\nimport { createOperationLocation } from \"./operationContext.js\";\nimport { extractParameterContainer } from \"./parameterContainer.js\";\nimport { rebaseLocalJsonSchemaRefs } from \"./schemaConversion.js\";\nimport type {\n OpenApiBuildWarning,\n OpenApiDiagnosticWarning,\n OpenApiParameterObject,\n} from \"../types.js\";\nimport type { OperationContext } from \"./operationContext.js\";\nimport type { z } from \"zod\";\n\nexport type RequestParameterResult = {\n readonly parameters: readonly OpenApiParameterObject[];\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\nexport function buildRequestParameters(\n context: OperationContext\n): RequestParameterResult {\n const operationPointer = jsonPointer([\n \"paths\",\n context.openApiPath,\n context.method,\n \"parameters\",\n ]);\n const pathParameters = buildPathParameters(context, operationPointer);\n const queryParameters = buildParametersFromContainer({\n schema: context.operation.request?.query,\n parameterIn: \"query\",\n part: \"request.query\",\n context,\n startIndex: pathParameters.parameters.length,\n parametersPointer: operationPointer,\n });\n const headerParameters = buildParametersFromContainer({\n schema: context.operation.request?.header,\n parameterIn: \"header\",\n part: \"request.header\",\n context,\n startIndex:\n pathParameters.parameters.length + queryParameters.parameters.length,\n parametersPointer: operationPointer,\n });\n const parameters = [\n ...pathParameters.parameters,\n ...queryParameters.parameters,\n ...headerParameters.parameters,\n ];\n\n return {\n parameters,\n warnings: [\n ...pathParameters.warnings,\n ...queryParameters.warnings,\n ...headerParameters.warnings,\n ],\n };\n}\n\nfunction buildPathParameters(\n context: OperationContext,\n parametersPointer: string\n): RequestParameterResult {\n const pathNames = getPathParameterNames(context.operation.path);\n const container = extractParameterContainer({\n schema: context.operation.request?.param,\n context,\n part: \"request.path\",\n containerPointer: parametersPointer,\n });\n const pathNameSet = new Set(pathNames);\n const missingWarnings: OpenApiDiagnosticWarning[] = [];\n const unusedWarnings = Object.keys(container.properties)\n .filter(name => !pathNameSet.has(name))\n .map(name =>\n createParameterWarning({\n code: \"unused-path-parameter-schema\",\n message: `Path parameter schema '${name}' is not used by '${context.operation.path}'.`,\n documentPath: parametersPointer,\n context,\n part: \"request.path\",\n parameterName: name,\n })\n );\n const parameters = pathNames.map((name, index) => {\n const schema = container.properties[name];\n const parameterPointer = jsonPointer([\n \"paths\",\n context.openApiPath,\n context.method,\n \"parameters\",\n String(index),\n ]);\n\n if (schema === undefined) {\n missingWarnings.push(\n createParameterWarning({\n code: \"missing-path-parameter-schema\",\n message: `Path parameter '${name}' is missing a schema.`,\n documentPath: `${parameterPointer}/schema`,\n context,\n part: \"request.path\",\n parameterName: name,\n })\n );\n }\n\n return {\n name,\n in: \"path\" as const,\n required: true,\n schema:\n schema === undefined\n ? {}\n : rebaseLocalJsonSchemaRefs(schema, `${parameterPointer}/schema`),\n };\n });\n\n return {\n parameters,\n warnings: [\n ...rebaseParameterSchemaWarnings({\n warnings: container.warnings,\n context,\n parameterNames: pathNames,\n startIndex: 0,\n }),\n ...unusedWarnings,\n ...missingWarnings,\n ],\n };\n}\n\nfunction buildParametersFromContainer(options: {\n readonly schema: z.core.$ZodType | undefined;\n readonly parameterIn: \"query\" | \"header\";\n readonly part: string;\n readonly context: OperationContext;\n readonly startIndex: number;\n readonly parametersPointer: string;\n}): RequestParameterResult {\n const container = extractParameterContainer({\n schema: options.schema,\n context: options.context,\n part: options.part,\n containerPointer: options.parametersPointer,\n });\n const parameters = Object.entries(container.properties).map(\n ([name, schema], index) => ({\n name,\n in: options.parameterIn,\n required: !container.isRootOptional && container.requiredNames.has(name),\n schema: rebaseLocalJsonSchemaRefs(\n schema,\n `${options.parametersPointer}/${options.startIndex + index}/schema`\n ),\n })\n );\n const rebasedWarnings = rebaseParameterSchemaWarnings({\n warnings: container.warnings,\n context: options.context,\n parameterNames: Object.keys(container.properties),\n startIndex: options.startIndex,\n });\n\n return { parameters, warnings: rebasedWarnings };\n}\n\nfunction rebaseParameterSchemaWarnings(options: {\n readonly warnings: readonly OpenApiBuildWarning[];\n readonly context: OperationContext;\n readonly parameterNames: readonly string[];\n readonly startIndex: number;\n}): readonly OpenApiBuildWarning[] {\n return options.warnings.map(warning => {\n if (warning.origin !== \"schema-conversion\") {\n return warning;\n }\n\n const parameterIndex = options.parameterNames.findIndex(name =>\n isJsonPointerAtOrBelow(\n warning.schemaPath,\n `/properties/${escapeJsonPointerSegment(name)}`\n )\n );\n\n if (parameterIndex === -1) {\n return warning;\n }\n\n const parameterName = options.parameterNames[parameterIndex];\n\n if (parameterName === undefined) {\n return warning;\n }\n\n const schemaPath = `/properties/${escapeJsonPointerSegment(parameterName)}`;\n const suffix = warning.schemaPath.slice(schemaPath.length);\n const documentPath = `${jsonPointer([\n \"paths\",\n options.context.openApiPath,\n options.context.method,\n \"parameters\",\n String(options.startIndex + parameterIndex),\n \"schema\",\n ])}${suffix}`;\n\n return {\n ...warning,\n documentPath,\n location: {\n ...warning.location,\n parameterName,\n },\n };\n });\n}\n\nfunction createParameterWarning(options: {\n readonly code: OpenApiDiagnosticWarning[\"code\"];\n readonly message: string;\n readonly documentPath: string;\n readonly context: OperationContext;\n readonly part: string;\n readonly parameterName: string;\n}): OpenApiDiagnosticWarning {\n return {\n origin: \"openapi-builder\",\n code: options.code,\n message: options.message,\n documentPath: options.documentPath,\n location: createOperationLocation(options),\n };\n}\n","import type { JsonSchema } from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport {\n escapeJsonPointerSegment,\n isJsonPointerAtOrBelow,\n} from \"./jsonPointer.js\";\nimport { extractParameterContainer } from \"./parameterContainer.js\";\nimport { rebaseLocalJsonSchemaRefs } from \"./schemaConversion.js\";\nimport type { OpenApiBuildWarning, OpenApiHeaderObject } from \"../types.js\";\nimport type { OperationContext } from \"./operationContext.js\";\nimport type { z } from \"zod\";\n\nexport type HeaderObjectResult = {\n readonly headers: Record<string, OpenApiHeaderObject>;\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\nexport function buildHeaderObjects(\n schema: z.core.$ZodType | undefined,\n context: OperationContext,\n responseContext: {\n readonly responseName?: string;\n readonly statusCode: string;\n readonly part: string;\n readonly headersPointer: string;\n }\n): HeaderObjectResult {\n const container = extractParameterContainer({\n schema,\n context,\n part: responseContext.part,\n containerPointer: responseContext.headersPointer,\n responseName: responseContext.responseName,\n statusCode: responseContext.statusCode,\n });\n const headers = Object.fromEntries(\n Object.entries(container.properties).map(([name, headerSchema]) => {\n const headerPointer = `${responseContext.headersPointer}/${escapeJsonPointerSegment(\n name\n )}/schema`;\n const description = headerDescription(headerSchema);\n\n return [\n name,\n {\n ...(description === undefined ? {} : { description }),\n required:\n !container.isRootOptional && container.requiredNames.has(name),\n schema: rebaseLocalJsonSchemaRefs(\n schemaWithoutDescription(headerSchema),\n headerPointer\n ),\n },\n ];\n })\n );\n\n return {\n headers,\n warnings: rebaseHeaderSchemaWarnings(\n container.warnings,\n Object.keys(container.properties),\n responseContext.headersPointer\n ),\n };\n}\n\nfunction headerDescription(schema: JsonSchema): string | undefined {\n return typeof schema.description === \"string\" &&\n schema.description.trim() !== \"\"\n ? schema.description\n : undefined;\n}\n\nfunction schemaWithoutDescription(schema: JsonSchema): JsonSchema {\n return Object.fromEntries(\n Object.entries(schema).filter(([key]) => key !== \"description\")\n ) as JsonSchema;\n}\n\nfunction rebaseHeaderSchemaWarnings(\n warnings: readonly OpenApiBuildWarning[],\n headerNames: readonly string[],\n headersPointer: string\n): readonly OpenApiBuildWarning[] {\n return warnings.map(warning => {\n if (warning.origin !== \"schema-conversion\") {\n return warning;\n }\n\n const headerName = headerNames.find(name =>\n isJsonPointerAtOrBelow(\n warning.schemaPath,\n `/properties/${escapeJsonPointerSegment(name)}`\n )\n );\n\n if (headerName === undefined) {\n return warning;\n }\n\n const schemaPath = `/properties/${escapeJsonPointerSegment(headerName)}`;\n const suffix = warning.schemaPath.slice(schemaPath.length);\n\n return {\n ...warning,\n documentPath: `${headersPointer}/${escapeJsonPointerSegment(\n headerName\n )}/schema${suffix}`,\n location: {\n ...warning.location,\n parameterName: headerName,\n },\n };\n });\n}\n","import type {\n JsonSchema,\n JsonSchemaValue,\n} from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport { isJsonPointerAtOrBelow } from \"./jsonPointer.js\";\nimport type { OpenApiBuildWarning } from \"../types.js\";\n\nexport function rebaseSchemaDocumentRefs(\n schema: JsonSchema,\n fromPointer: string,\n toPointer: string\n): JsonSchema {\n return rebaseSchemaValueDocumentRefs(\n schema,\n fromPointer,\n toPointer\n ) as JsonSchema;\n}\n\nexport function rebaseWarningDocumentPath(\n warning: OpenApiBuildWarning,\n fromPointer: string,\n toPointer: string\n): OpenApiBuildWarning {\n if (\n warning.origin !== \"schema-conversion\" ||\n !isJsonPointerAtOrBelow(warning.documentPath, fromPointer)\n ) {\n return warning;\n }\n\n return {\n ...warning,\n documentPath: `${toPointer}${warning.documentPath.slice(\n fromPointer.length\n )}`,\n };\n}\n\nexport function isWarningDocumentPathAtOrBelow(\n warning: OpenApiBuildWarning,\n pointer: string\n): boolean {\n return isJsonPointerAtOrBelow(warning.documentPath, pointer);\n}\n\nfunction rebaseSchemaValueDocumentRefs(\n value: JsonSchemaValue,\n fromPointer: string,\n toPointer: string\n): JsonSchemaValue {\n if (Array.isArray(value)) {\n return value.map(item =>\n rebaseSchemaValueDocumentRefs(item, fromPointer, toPointer)\n );\n }\n\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n key === \"$ref\" && typeof child === \"string\"\n ? rebaseDocumentRef(child, fromPointer, toPointer)\n : rebaseSchemaValueDocumentRefs(child, fromPointer, toPointer),\n ])\n ) as JsonSchema;\n}\n\nfunction rebaseDocumentRef(\n ref: string,\n fromPointer: string,\n toPointer: string\n): string {\n if (!ref.startsWith(\"#\")) {\n return ref;\n }\n\n const documentPath = ref.slice(1);\n\n if (!isJsonPointerAtOrBelow(documentPath, fromPointer)) {\n return ref;\n }\n\n return `#${toPointer}${documentPath.slice(fromPointer.length)}`;\n}\n","import type {\n NormalizedResponse,\n NormalizedResponseUsage,\n} from \"@rexeus/typeweaver-gen\";\nimport type {\n JsonSchema,\n JsonSchemaValue,\n} from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport { buildHeaderObjects } from \"./headerObjects.js\";\nimport { escapeJsonPointerSegment } from \"./jsonPointer.js\";\nimport {\n isWarningDocumentPathAtOrBelow,\n rebaseSchemaDocumentRefs,\n rebaseWarningDocumentPath,\n} from \"./schemaRebasing.js\";\nimport type { OpenApiBuildWarning, OpenApiHeaderObject } from \"../types.js\";\nimport type { OperationContext } from \"./operationContext.js\";\n\nexport type ResponseHeaderMergeVariant = {\n readonly response: Pick<NormalizedResponse, \"header\">;\n readonly usage: Pick<NormalizedResponseUsage, \"responseName\">;\n};\n\ntype VariantHeaders = {\n readonly responseName: string;\n readonly headers: Record<string, OpenApiHeaderObject>;\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\ntype HeaderAppearance = {\n readonly variantIndex: number;\n readonly responseName: string;\n readonly header: OpenApiHeaderObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n readonly schemaKey: string;\n};\n\ntype MergedHeader = {\n readonly name: string;\n readonly header: OpenApiHeaderObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\nexport function buildMergedHeaders(\n variants: readonly ResponseHeaderMergeVariant[],\n options: {\n readonly context: OperationContext;\n readonly statusCode: string;\n readonly responsePointer: string;\n }\n): {\n readonly headers: Record<string, OpenApiHeaderObject>;\n readonly warnings: readonly OpenApiBuildWarning[];\n} {\n const variantHeaders = variants.map(variant =>\n buildVariantHeaders(variant, options)\n );\n const mergedHeaders = headerNamesFrom(variantHeaders).map(name =>\n mergeHeader(name, variantHeaders, options.responsePointer)\n );\n\n return {\n headers: Object.fromEntries(\n mergedHeaders.map(merged => [merged.name, merged.header])\n ),\n warnings: [\n ...warningsOutsideMergedHeaderSchemas(\n variantHeaders,\n options.responsePointer\n ),\n ...mergedHeaders.flatMap(merged => merged.warnings),\n ],\n };\n}\n\nfunction buildVariantHeaders(\n variant: ResponseHeaderMergeVariant,\n options: {\n readonly context: OperationContext;\n readonly statusCode: string;\n readonly responsePointer: string;\n }\n): VariantHeaders {\n const built = buildHeaderObjects(variant.response.header, options.context, {\n responseName: variant.usage.responseName,\n statusCode: options.statusCode,\n part: \"response.header\",\n headersPointer: `${options.responsePointer}/headers`,\n });\n\n return {\n responseName: variant.usage.responseName,\n headers: built.headers,\n warnings: built.warnings,\n };\n}\n\nfunction warningsOutsideMergedHeaderSchemas(\n variants: readonly VariantHeaders[],\n responsePointer: string\n): readonly OpenApiBuildWarning[] {\n return variants.flatMap(variant => {\n const headerSchemaPointers = Object.keys(variant.headers).map(name =>\n headerSchemaPointer(responsePointer, name)\n );\n\n return variant.warnings.filter(\n warning =>\n !headerSchemaPointers.some(pointer =>\n isWarningDocumentPathAtOrBelow(warning, pointer)\n )\n );\n });\n}\n\nfunction headerNamesFrom(\n variants: readonly VariantHeaders[]\n): readonly string[] {\n const namesByLowercase = new Map<string, string>();\n\n for (const variant of variants) {\n for (const name of Object.keys(variant.headers)) {\n const lowercaseName = name.toLowerCase();\n\n if (!namesByLowercase.has(lowercaseName)) {\n namesByLowercase.set(lowercaseName, name);\n }\n }\n }\n\n return [...namesByLowercase.values()];\n}\n\nfunction mergeHeader(\n name: string,\n variants: readonly VariantHeaders[],\n responsePointer: string\n): MergedHeader {\n const schemaPointer = headerSchemaPointer(responsePointer, name);\n const appearances = headerAppearancesFor(\n name,\n variants,\n responsePointer,\n schemaPointer\n );\n const distinctSchemaAppearances =\n distinctHeaderSchemaAppearances(appearances);\n const schema = mergedHeaderSchema(distinctSchemaAppearances, schemaPointer);\n const warnings = mergedHeaderSchemaWarnings({\n appearances,\n distinctSchemaAppearances,\n schemaPointer,\n });\n const description = mergedHeaderDescription(appearances);\n\n if (schema === undefined) {\n return {\n name,\n header: { required: false, schema: {} },\n warnings,\n };\n }\n\n return {\n name,\n header: {\n ...(description === undefined ? {} : { description }),\n required:\n variants.every((_, index) =>\n appearances.some(appearance => appearance.variantIndex === index)\n ) && appearances.every(appearance => appearance.header.required),\n schema,\n },\n warnings,\n };\n}\n\nfunction headerAppearancesFor(\n name: string,\n variants: readonly VariantHeaders[],\n responsePointer: string,\n schemaPointer: string\n): readonly HeaderAppearance[] {\n return variants.flatMap((variant, variantIndex) => {\n const headerEntries = headerEntriesFor(variant.headers, name);\n\n if (headerEntries.length === 0) {\n return [];\n }\n\n return headerEntries.map(headerEntry => {\n const originalSchemaPointer = headerSchemaPointer(\n responsePointer,\n headerEntry.name\n );\n const warnings = variant.warnings\n .filter(warning =>\n isWarningDocumentPathAtOrBelow(warning, originalSchemaPointer)\n )\n .map(warning =>\n originalSchemaPointer === schemaPointer\n ? warning\n : rebaseWarningDocumentPath(\n warning,\n originalSchemaPointer,\n schemaPointer\n )\n );\n\n return {\n variantIndex,\n responseName: variant.responseName,\n header: headerEntry.header,\n warnings,\n schemaKey: stableStringifyJsonSchema(headerEntry.header.schema),\n };\n });\n });\n}\n\nfunction headerEntriesFor(\n headers: Record<string, OpenApiHeaderObject>,\n name: string\n): readonly { readonly name: string; readonly header: OpenApiHeaderObject }[] {\n const lowerName = name.toLowerCase();\n const entries: {\n readonly name: string;\n readonly header: OpenApiHeaderObject;\n }[] = [];\n\n for (const [headerName, header] of Object.entries(headers)) {\n if (headerName.toLowerCase() === lowerName) {\n entries.push({ name: headerName, header });\n }\n }\n\n return entries;\n}\n\nfunction distinctHeaderSchemaAppearances(\n appearances: readonly HeaderAppearance[]\n): readonly HeaderAppearance[] {\n const seenSchemas = new Set<string>();\n const distinctAppearances: HeaderAppearance[] = [];\n\n for (const appearance of appearances) {\n if (seenSchemas.has(appearance.schemaKey)) {\n continue;\n }\n\n seenSchemas.add(appearance.schemaKey);\n distinctAppearances.push(appearance);\n }\n\n return distinctAppearances;\n}\n\nfunction mergedHeaderSchema(\n appearances: readonly HeaderAppearance[],\n schemaPointer: string\n): JsonSchema | undefined {\n const firstAppearance = appearances[0];\n\n if (firstAppearance === undefined) {\n return undefined;\n }\n\n if (appearances.length === 1) {\n return firstAppearance.header.schema;\n }\n\n return {\n anyOf: appearances.map((appearance, index) =>\n rebaseSchemaDocumentRefs(\n appearance.header.schema,\n schemaPointer,\n `${schemaPointer}/anyOf/${index}`\n )\n ),\n } as JsonSchema;\n}\n\nfunction mergedHeaderSchemaWarnings(options: {\n readonly appearances: readonly HeaderAppearance[];\n readonly distinctSchemaAppearances: readonly HeaderAppearance[];\n readonly schemaPointer: string;\n}): readonly OpenApiBuildWarning[] {\n if (options.distinctSchemaAppearances.length <= 1) {\n return options.appearances.flatMap(appearance => appearance.warnings);\n }\n\n return options.appearances.flatMap(appearance => {\n const schemaIndex = options.distinctSchemaAppearances.findIndex(\n distinctAppearance =>\n distinctAppearance.schemaKey === appearance.schemaKey\n );\n const branchPointer = `${options.schemaPointer}/anyOf/${schemaIndex}`;\n\n return appearance.warnings.map(warning =>\n rebaseWarningDocumentPath(warning, options.schemaPointer, branchPointer)\n );\n });\n}\n\nfunction headerSchemaPointer(responsePointer: string, name: string): string {\n return `${responsePointer}/headers/${escapeJsonPointerSegment(name)}/schema`;\n}\n\nfunction mergedHeaderDescription(\n appearances: readonly HeaderAppearance[]\n): string | undefined {\n const describedAppearances = appearances.filter(\n appearance => appearance.header.description !== undefined\n );\n const distinctDescriptions = new Set(\n describedAppearances.map(appearance => appearance.header.description)\n );\n\n if (distinctDescriptions.size === 0) {\n return undefined;\n }\n\n if (distinctDescriptions.size === 1) {\n return describedAppearances[0]?.header.description;\n }\n\n return [\n \"Header description merged from response variants:\",\n ...describedAppearances.map(\n appearance =>\n `- ${appearance.responseName}: ${appearance.header.description ?? \"\"}`\n ),\n ].join(\"\\n\");\n}\n\nfunction stableStringifyJsonSchema(schema: JsonSchema): string {\n return JSON.stringify(canonicalizeJsonSchemaValue(schema));\n}\n\nfunction canonicalizeJsonSchemaValue(value: JsonSchemaValue): JsonSchemaValue {\n if (Array.isArray(value)) {\n return value.map(canonicalizeJsonSchemaValue);\n }\n\n if (!isJsonSchemaObject(value)) {\n return value;\n }\n\n return Object.fromEntries(\n Object.entries(value)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))\n .map(([key, child]) => [key, canonicalizeJsonSchemaValue(child)])\n ) as JsonSchema;\n}\n\nfunction isJsonSchemaObject(value: JsonSchemaValue): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type {\n NormalizedResponse,\n NormalizedResponseUsage,\n} from \"@rexeus/typeweaver-gen\";\nimport type { JsonSchema } from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport { pascalCase } from \"polycase\";\nimport { resolveOpenApiBodySchema } from \"./bodyContent.js\";\nimport { buildHeaderObjects } from \"./headerObjects.js\";\nimport { escapeJsonPointerSegment, jsonPointer } from \"./jsonPointer.js\";\nimport { createOperationLocation } from \"./operationContext.js\";\nimport { buildMergedHeaders } from \"./responseHeaderMerge.js\";\nimport type {\n OpenApiBuildWarning,\n OpenApiDiagnosticWarning,\n OpenApiResponseObject,\n OpenApiResponsesObject,\n} from \"../types.js\";\nimport type { OperationContext } from \"./operationContext.js\";\nimport type { SchemaRegistry } from \"./schemaRegistry.js\";\n\nexport type ComponentsResponsesResult = {\n readonly responses: Record<string, OpenApiResponseObject>;\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\nexport type OperationResponsesResult = {\n readonly responses: OpenApiResponsesObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\nexport function buildComponentsResponses(\n responses: readonly NormalizedResponse[],\n schemaRegistry: SchemaRegistry\n): ComponentsResponsesResult {\n const warnings: OpenApiBuildWarning[] = [];\n const componentsResponses = Object.fromEntries(\n responses.map(response => {\n const responsePointer = jsonPointer([\n \"components\",\n \"responses\",\n response.name,\n ]);\n const built = buildResponseObject(response, {\n schemaRegistry,\n responseName: response.name,\n statusCode: String(response.statusCode),\n responsePointer,\n bodyBaseName: `${response.name}Body`,\n });\n\n warnings.push(...built.warnings);\n\n return [response.name, built.response];\n })\n );\n\n return { responses: componentsResponses, warnings };\n}\n\nexport function buildOperationResponses(\n usages: readonly NormalizedResponseUsage[],\n canonicalResponsesByName: ReadonlyMap<string, NormalizedResponse>,\n context: OperationContext,\n schemaRegistry: SchemaRegistry\n): OperationResponsesResult {\n const responsesPointer = operationResponsesPointer(context);\n const resolved = resolveResponseVariants(usages, {\n canonicalResponsesByName,\n context,\n responsesPointer,\n });\n const warnings: OpenApiBuildWarning[] = [...resolved.warnings];\n const responses: OpenApiResponsesObject = {};\n\n for (const [statusCode, variants] of groupResponsesByStatus(\n resolved.variants\n )) {\n const built = buildResponseForStatus(variants, {\n schemaRegistry,\n context,\n statusCode,\n responsePointer: `${responsesPointer}/${statusCode}`,\n });\n\n if (built === undefined) {\n continue;\n }\n\n responses[statusCode] = built.response;\n warnings.push(...built.warnings);\n }\n\n return { responses, warnings };\n}\n\ntype ResolvedResponseVariant = {\n readonly response: NormalizedResponse;\n readonly usage: NormalizedResponseUsage;\n readonly statusCode: string;\n};\n\ntype ResolvedResponseVariantsResult = {\n readonly variants: readonly ResolvedResponseVariant[];\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\ntype BuiltOperationResponse = {\n readonly response: OpenApiResponsesObject[string];\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\ntype RegisteredBodySchema = {\n readonly mediaType: string;\n readonly schema: JsonSchema;\n readonly schemaKey: string;\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\nfunction operationResponsesPointer(context: OperationContext): string {\n return jsonPointer([\n \"paths\",\n context.openApiPath,\n context.method,\n \"responses\",\n ]);\n}\n\nfunction resolveResponseVariants(\n usages: readonly NormalizedResponseUsage[],\n options: {\n readonly canonicalResponsesByName: ReadonlyMap<string, NormalizedResponse>;\n readonly context: OperationContext;\n readonly responsesPointer: string;\n }\n): ResolvedResponseVariantsResult {\n const warnings: OpenApiBuildWarning[] = [];\n const variants: ResolvedResponseVariant[] = [];\n\n for (const usage of usages) {\n const response = resolveResponse(usage, options.canonicalResponsesByName);\n\n if (response === undefined) {\n warnings.push(\n createBuilderWarning({\n code: \"missing-canonical-response\",\n message: `Canonical response '${usage.responseName}' is not defined.`,\n documentPath: options.responsesPointer,\n context: options.context,\n part: \"response\",\n responseName: usage.responseName,\n })\n );\n continue;\n }\n\n variants.push({\n response,\n usage,\n statusCode: String(response.statusCode),\n });\n }\n\n return { variants, warnings };\n}\n\nfunction buildResponseForStatus(\n variants: readonly ResolvedResponseVariant[],\n options: {\n readonly schemaRegistry: SchemaRegistry;\n readonly context: OperationContext;\n readonly statusCode: string;\n readonly responsePointer: string;\n }\n): BuiltOperationResponse | undefined {\n if (variants.length === 1) {\n const variant = variants[0];\n\n return variant === undefined\n ? undefined\n : buildSingleResponseVariant(variant, options);\n }\n\n return buildMergedResponseObject(variants, {\n schemaRegistry: options.schemaRegistry,\n context: options.context,\n statusCode: options.statusCode,\n responsePointer: options.responsePointer,\n });\n}\n\nfunction buildSingleResponseVariant(\n variant: ResolvedResponseVariant,\n options: {\n readonly schemaRegistry: SchemaRegistry;\n readonly context: OperationContext;\n readonly statusCode: string;\n readonly responsePointer: string;\n }\n): BuiltOperationResponse {\n if (variant.usage.source === \"canonical\") {\n return {\n response: {\n $ref: `#/components/responses/${escapeJsonPointerSegment(\n variant.usage.responseName\n )}`,\n },\n warnings: [],\n };\n }\n\n const built = buildResponseObject(variant.response, {\n schemaRegistry: options.schemaRegistry,\n context: options.context,\n responseName: variant.usage.responseName,\n statusCode: options.statusCode,\n responsePointer: options.responsePointer,\n bodyBaseName: inlineResponseBodyBaseName(\n options.context,\n variant.usage.responseName\n ),\n });\n\n return { response: built.response, warnings: built.warnings };\n}\n\nfunction groupResponsesByStatus(\n variants: readonly ResolvedResponseVariant[]\n): ReadonlyMap<string, readonly ResolvedResponseVariant[]> {\n const groups = new Map<string, ResolvedResponseVariant[]>();\n\n for (const variant of variants) {\n const group = groups.get(variant.statusCode);\n\n if (group === undefined) {\n groups.set(variant.statusCode, [variant]);\n continue;\n }\n\n group.push(variant);\n }\n\n return groups;\n}\n\nfunction resolveResponse(\n usage: NormalizedResponseUsage,\n canonicalResponsesByName: ReadonlyMap<string, NormalizedResponse>\n): NormalizedResponse | undefined {\n return usage.source === \"inline\"\n ? usage.response\n : canonicalResponsesByName.get(usage.responseName);\n}\n\nfunction buildResponseObject(\n response: NormalizedResponse,\n options: {\n readonly schemaRegistry: SchemaRegistry;\n readonly context?: OperationContext;\n readonly responseName: string;\n readonly statusCode: string;\n readonly responsePointer: string;\n readonly bodyBaseName: string;\n }\n): {\n readonly response: OpenApiResponseObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n} {\n const context =\n options.context ?? createComponentResponseContext(options.responseName);\n const headers = buildHeaderObjects(response.header, context, {\n responseName: options.responseName,\n statusCode: options.statusCode,\n part: \"response.header\",\n headersPointer: `${options.responsePointer}/headers`,\n });\n const body = buildResponseBody(response, {\n schemaRegistry: options.schemaRegistry,\n context,\n responseName: options.responseName,\n statusCode: options.statusCode,\n baseName: options.bodyBaseName,\n });\n\n return {\n response: {\n description: response.description,\n ...(Object.keys(headers.headers).length > 0\n ? { headers: headers.headers }\n : {}),\n ...(body.content === undefined ? {} : { content: body.content }),\n },\n warnings: [...headers.warnings, ...body.warnings],\n };\n}\n\nfunction buildResponseBody(\n response: NormalizedResponse,\n options: {\n readonly schemaRegistry: SchemaRegistry;\n readonly context: OperationContext;\n readonly responseName: string;\n readonly statusCode: string;\n readonly baseName: string;\n }\n): {\n readonly content?: OpenApiResponseObject[\"content\"];\n readonly warnings: readonly OpenApiBuildWarning[];\n} {\n const body = response.body;\n\n if (body === undefined) {\n return { warnings: [] };\n }\n\n const registration = registerResponseBody(body, {\n schemaRegistry: options.schemaRegistry,\n context: options.context,\n responseName: options.responseName,\n statusCode: options.statusCode,\n baseName: options.baseName,\n });\n\n return {\n content: {\n [body.mediaType]: {\n schema: registration.schema,\n },\n },\n warnings: registration.warnings,\n };\n}\n\nfunction buildMergedResponseObject(\n variants: readonly ResolvedResponseVariant[],\n options: {\n readonly schemaRegistry: SchemaRegistry;\n readonly context: OperationContext;\n readonly statusCode: string;\n readonly responsePointer: string;\n }\n): {\n readonly response: OpenApiResponseObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n} {\n const body = buildMergedResponseBody(variants, options);\n const headers = buildMergedHeaders(variants, options);\n\n return {\n response: {\n description: variants\n .map(\n variant =>\n `${variant.usage.responseName}: ${variant.response.description}`\n )\n .join(\"\\n\\n\"),\n ...(Object.keys(headers.headers).length > 0\n ? { headers: headers.headers }\n : {}),\n ...(body.content === undefined ? {} : { content: body.content }),\n },\n warnings: [...body.warnings, ...headers.warnings],\n };\n}\n\nfunction buildMergedResponseBody(\n variants: readonly ResolvedResponseVariant[],\n options: {\n readonly schemaRegistry: SchemaRegistry;\n readonly context: OperationContext;\n readonly statusCode: string;\n }\n): {\n readonly content?: OpenApiResponseObject[\"content\"];\n readonly warnings: readonly OpenApiBuildWarning[];\n} {\n const warnings: OpenApiBuildWarning[] = [];\n const schemasByMediaType = new Map<string, RegisteredBodySchema[]>();\n\n for (const variant of variants) {\n const body = variant.response.body;\n\n if (body === undefined) {\n continue;\n }\n\n const registration = registerResponseBody(body, {\n schemaRegistry: options.schemaRegistry,\n context: options.context,\n baseName: responseBodyBaseName(options.context, variant.usage),\n responseName: variant.usage.responseName,\n statusCode: options.statusCode,\n });\n const schemas = schemasByMediaType.get(body.mediaType) ?? [];\n\n schemasByMediaType.set(body.mediaType, [...schemas, registration]);\n warnings.push(...registration.warnings);\n }\n\n if (schemasByMediaType.size === 0) {\n return { warnings };\n }\n\n return {\n content: Object.fromEntries(\n Array.from(schemasByMediaType, ([mediaType, registrations]) => [\n mediaType,\n { schema: mergedMediaTypeSchema(registrations) },\n ])\n ),\n warnings,\n };\n}\n\nfunction mergedMediaTypeSchema(\n registrations: readonly RegisteredBodySchema[]\n): JsonSchema {\n const distinctSchemas = distinctBy(\n registrations,\n registration => registration.schemaKey\n ).map(registration => registration.schema);\n const firstSchema = distinctSchemas[0];\n\n if (firstSchema === undefined) {\n return {};\n }\n\n const otherSchemas = distinctSchemas.slice(1);\n\n return otherSchemas.length === 0 ? firstSchema : { anyOf: distinctSchemas };\n}\n\nfunction registerResponseBody(\n body: NonNullable<NormalizedResponse[\"body\"]>,\n options: {\n readonly schemaRegistry: SchemaRegistry;\n readonly context: OperationContext;\n readonly responseName: string;\n readonly statusCode: string;\n readonly baseName: string;\n }\n): RegisteredBodySchema {\n const resolvedSchema = resolveOpenApiBodySchema<OpenApiBuildWarning>(\n body,\n () => {\n const registration = options.schemaRegistry.register({\n schema: body.schema,\n baseName: options.baseName,\n location: createOperationLocation({\n context: options.context,\n part: \"response.body\",\n responseName: options.responseName,\n statusCode: options.statusCode,\n }),\n });\n\n return {\n schema: registration.ref,\n schemaKey: registration.ref.$ref,\n warnings: registration.warnings,\n };\n }\n );\n\n return { mediaType: body.mediaType, ...resolvedSchema };\n}\n\nfunction responseBodyBaseName(\n context: OperationContext,\n usage: NormalizedResponseUsage\n): string {\n return usage.source === \"canonical\"\n ? `${usage.responseName}Body`\n : inlineResponseBodyBaseName(context, usage.responseName);\n}\n\nfunction inlineResponseBodyBaseName(\n context: OperationContext,\n responseName: string\n): string {\n return `${pascalCase(context.operation.operationId)}${responseName}Body`;\n}\n\nfunction distinctBy<T>(\n values: readonly T[],\n keyForValue: (value: T) => string\n): readonly T[] {\n const seen = new Set<string>();\n const distinctValues: T[] = [];\n\n for (const value of values) {\n const key = keyForValue(value);\n\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n distinctValues.push(value);\n }\n\n return distinctValues;\n}\n\nfunction createComponentResponseContext(\n responseName: string\n): OperationContext {\n return {\n resourceName: \"components.responses\",\n operation: {\n operationId: responseName,\n method: \"components\",\n path: \"#/components/responses\",\n },\n openApiPath: \"#/components/responses\",\n method: \"components\",\n };\n}\n\nfunction createBuilderWarning(options: {\n readonly code: OpenApiDiagnosticWarning[\"code\"];\n readonly message: string;\n readonly documentPath: string;\n readonly context: OperationContext;\n readonly part: string;\n readonly responseName?: string;\n readonly statusCode?: string;\n}): OpenApiDiagnosticWarning {\n return {\n origin: \"openapi-builder\",\n code: options.code,\n message: options.message,\n documentPath: options.documentPath,\n location: createOperationLocation(options),\n };\n}\n","import type { JsonSchema } from \"@rexeus/typeweaver-zod-to-json-schema\";\nimport { escapeJsonPointerSegment, jsonPointer } from \"./jsonPointer.js\";\nimport { convertSchema, unwrapRootOptional } from \"./schemaConversion.js\";\nimport type {\n OpenApiBuildWarning,\n OpenApiReferenceObject,\n OpenApiWarningLocation,\n} from \"../types.js\";\nimport type { z } from \"zod\";\n\nexport type SchemaRegistry = {\n readonly register: (options: {\n readonly schema: z.core.$ZodType;\n readonly baseName: string;\n readonly location: OpenApiWarningLocation;\n }) => SchemaRegistration;\n readonly components: () => Record<string, JsonSchema>;\n};\n\nexport type SchemaRegistration = {\n readonly name: string;\n readonly ref: OpenApiReferenceObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n};\n\ntype SchemaRegistryEntry = {\n readonly name: string;\n readonly ref: OpenApiReferenceObject;\n readonly schema: JsonSchema;\n};\n\nexport function createSchemaRegistry(): SchemaRegistry {\n const entriesBySchema = new WeakMap<z.core.$ZodType, SchemaRegistryEntry>();\n const components = new Map<string, JsonSchema>();\n\n return {\n register: options => {\n const schema = unwrapRootOptional(options.schema).schema;\n const existingEntry = entriesBySchema.get(schema);\n\n if (existingEntry !== undefined) {\n return {\n name: existingEntry.name,\n ref: existingEntry.ref,\n warnings: [],\n };\n }\n\n const name = nextComponentName(options.baseName, components);\n const documentPath = jsonPointer([\"components\", \"schemas\", name]);\n const converted = convertSchema(schema, documentPath, options.location);\n const ref = {\n $ref: `#/components/schemas/${escapeJsonPointerSegment(name)}`,\n };\n const entry = { name, ref, schema: converted.schema };\n\n entriesBySchema.set(schema, entry);\n components.set(name, converted.schema);\n\n return { name, ref, warnings: converted.warnings };\n },\n components: () => Object.fromEntries(components),\n };\n}\n\nfunction nextComponentName(\n baseName: string,\n components: ReadonlyMap<string, JsonSchema>\n): string {\n const sanitizedName = sanitizeComponentName(baseName);\n\n if (!components.has(sanitizedName)) {\n return sanitizedName;\n }\n\n for (let suffix = 2; ; suffix += 1) {\n const name = `${sanitizedName}_${suffix}`;\n\n if (!components.has(name)) {\n return name;\n }\n }\n}\n\nfunction sanitizeComponentName(name: string): string {\n const sanitizedName = name\n .trim()\n .replaceAll(/[^A-Za-z0-9._-]/g, \"_\")\n .replaceAll(/_+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\");\n\n return sanitizedName === \"\" ? \"Schema\" : sanitizedName;\n}\n","import type {\n NormalizedResponse,\n NormalizedSpec,\n} from \"@rexeus/typeweaver-gen\";\nimport { pascalCase } from \"polycase\";\nimport { resolveOpenApiBodySchema } from \"./internal/bodyContent.js\";\nimport { jsonPointer } from \"./internal/jsonPointer.js\";\nimport { toOpenApiPath } from \"./internal/openApiPath.js\";\nimport { buildRequestParameters } from \"./internal/parameters.js\";\nimport {\n buildComponentsResponses,\n buildOperationResponses,\n} from \"./internal/responses.js\";\nimport { unwrapRootOptional } from \"./internal/schemaConversion.js\";\nimport { createSchemaRegistry } from \"./internal/schemaRegistry.js\";\nimport type { SchemaRegistry } from \"./internal/schemaRegistry.js\";\nimport type {\n BuildOpenApiDocumentOptions,\n OpenApiBuildResult,\n OpenApiBuildWarning,\n OpenApiDiagnosticWarning,\n OpenApiDocument,\n OpenApiHttpMethod,\n OpenApiOperationObject,\n OpenApiPathsObject,\n OpenApiRequestBodyObject,\n} from \"./types.js\";\n\nexport function buildOpenApiDocument(\n normalizedSpec: NormalizedSpec,\n options: BuildOpenApiDocumentOptions\n): OpenApiBuildResult {\n const warnings: OpenApiBuildWarning[] = [\n ...duplicateCanonicalResponseWarnings(normalizedSpec.responses),\n ];\n const schemaRegistry = createSchemaRegistry();\n const canonicalResponses = buildComponentsResponses(\n normalizedSpec.responses,\n schemaRegistry\n );\n const canonicalResponsesByName = new Map(\n normalizedSpec.responses.map(response => [response.name, response])\n );\n const paths: OpenApiPathsObject = {};\n\n warnings.push(...canonicalResponses.warnings);\n\n for (const resource of normalizedSpec.resources) {\n for (const operation of resource.operations) {\n const method = operation.method.toLowerCase() as OpenApiHttpMethod;\n const openApiPath = toOpenApiPath(operation.path);\n const operationObject = buildOperationObject({\n resourceName: resource.name,\n operation,\n openApiPath,\n method,\n canonicalResponsesByName,\n schemaRegistry,\n });\n\n paths[openApiPath] = {\n ...paths[openApiPath],\n [method]: operationObject.operation,\n };\n warnings.push(...operationObject.warnings);\n }\n }\n\n const schemas = schemaRegistry.components();\n const responses = canonicalResponses.responses;\n const hasResponses = Object.keys(responses).length > 0;\n const hasSchemas = Object.keys(schemas).length > 0;\n const document: OpenApiDocument = {\n openapi: \"3.1.1\",\n jsonSchemaDialect: \"https://json-schema.org/draft/2020-12/schema\",\n info: { ...options.info },\n ...(options.servers === undefined ? {} : { servers: [...options.servers] }),\n tags: normalizedSpec.resources.map(resource => ({ name: resource.name })),\n paths,\n ...(!hasResponses && !hasSchemas\n ? {}\n : {\n components: {\n ...(hasResponses ? { responses } : {}),\n ...(hasSchemas ? { schemas } : {}),\n },\n }),\n };\n\n return { document, warnings };\n}\n\nfunction buildOperationObject(options: {\n readonly resourceName: string;\n readonly operation: NormalizedSpec[\"resources\"][number][\"operations\"][number];\n readonly openApiPath: string;\n readonly method: OpenApiHttpMethod;\n readonly canonicalResponsesByName: ReadonlyMap<\n string,\n NormalizedSpec[\"responses\"][number]\n >;\n readonly schemaRegistry: SchemaRegistry;\n}): {\n readonly operation: OpenApiOperationObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n} {\n const context = {\n resourceName: options.resourceName,\n operation: options.operation,\n openApiPath: options.openApiPath,\n method: options.method,\n };\n const parameters = buildRequestParameters(context);\n const requestBody = buildRequestBody(context, options.schemaRegistry);\n const responses = buildOperationResponses(\n options.operation.responses,\n options.canonicalResponsesByName,\n context,\n options.schemaRegistry\n );\n\n return {\n operation: {\n operationId: options.operation.operationId,\n ...(options.operation.summary.trim() === \"\"\n ? {}\n : { summary: options.operation.summary }),\n tags: [options.resourceName],\n ...(parameters.parameters.length === 0\n ? {}\n : { parameters: parameters.parameters }),\n ...(requestBody.requestBody === undefined\n ? {}\n : { requestBody: requestBody.requestBody }),\n responses: responses.responses,\n },\n warnings: [\n ...parameters.warnings,\n ...requestBody.warnings,\n ...responses.warnings,\n ],\n };\n}\n\nfunction buildRequestBody(\n context: {\n readonly resourceName: string;\n readonly operation: NormalizedSpec[\"resources\"][number][\"operations\"][number];\n readonly openApiPath: string;\n readonly method: OpenApiHttpMethod;\n },\n schemaRegistry: SchemaRegistry\n): {\n readonly requestBody?: OpenApiRequestBodyObject;\n readonly warnings: readonly OpenApiBuildWarning[];\n} {\n const body = context.operation.request?.body;\n\n if (body === undefined) {\n return { warnings: [] };\n }\n\n const optionalSchema = unwrapRootOptional(body.schema);\n const resolvedSchema = resolveOpenApiBodySchema<OpenApiBuildWarning>(\n body,\n () => {\n const registration = schemaRegistry.register({\n schema: optionalSchema.schema,\n baseName: `${pascalCase(context.operation.operationId)}RequestBody`,\n location: {\n resourceName: context.resourceName,\n operationId: context.operation.operationId,\n method: context.operation.method,\n path: context.operation.path,\n openApiPath: context.openApiPath,\n part: \"request.body\",\n },\n });\n\n return {\n schema: registration.ref,\n schemaKey: registration.ref.$ref,\n warnings: registration.warnings,\n };\n }\n );\n\n return {\n requestBody: {\n required: !optionalSchema.isOptional,\n content: {\n [body.mediaType]: {\n schema: resolvedSchema.schema,\n },\n },\n },\n warnings: resolvedSchema.warnings,\n };\n}\n\nfunction duplicateCanonicalResponseWarnings(\n responses: readonly NormalizedResponse[]\n): readonly OpenApiDiagnosticWarning[] {\n const firstSeenAt = new Map<string, number>();\n const warnings: OpenApiDiagnosticWarning[] = [];\n\n responses.forEach((response, index) => {\n const previousIndex = firstSeenAt.get(response.name);\n\n if (previousIndex === undefined) {\n firstSeenAt.set(response.name, index);\n return;\n }\n\n warnings.push({\n origin: \"openapi-builder\",\n code: \"duplicate-canonical-response\",\n message: `Canonical response '${response.name}' is defined more than once; the entry at index ${index} overrides the entry at index ${previousIndex}.`,\n documentPath: jsonPointer([\"components\", \"responses\", response.name]),\n location: { responseName: response.name, part: \"components.responses\" },\n });\n });\n\n return warnings;\n}\n","import path from \"node:path\";\nimport { BasePlugin } from \"@rexeus/typeweaver-gen\";\nimport type { GeneratorContext } from \"@rexeus/typeweaver-gen\";\nimport { buildOpenApiDocument } from \"./buildOpenApiDocument.js\";\nimport type {\n OpenApiBuildWarning,\n OpenApiInfoObject,\n OpenApiServerObject,\n} from \"./types.js\";\n\nconst DEFAULT_INFO: OpenApiInfoObject = {\n title: \"Typeweaver API\",\n version: \"0.0.0\",\n};\nconst DEFAULT_OUTPUT_PATH = \"openapi/openapi.json\";\n\nexport type OpenApiPluginOptions = {\n readonly info?: OpenApiInfoObject;\n readonly servers?: readonly OpenApiServerObject[];\n readonly outputPath?: string;\n};\n\ntype NormalizedOpenApiPluginOptions = {\n readonly info: OpenApiInfoObject;\n readonly servers?: readonly OpenApiServerObject[];\n readonly outputPath: string;\n};\n\nexport class OpenApiPlugin extends BasePlugin {\n public name = \"openapi\";\n\n private readonly options: NormalizedOpenApiPluginOptions;\n\n public constructor(options: OpenApiPluginOptions = {}) {\n super({});\n this.options = normalizeOptions(validateOptions(options));\n }\n\n public override generate(context: GeneratorContext): void {\n const result = buildOpenApiDocument(context.normalizedSpec, {\n info: this.options.info,\n servers: this.options.servers,\n });\n const json = `${JSON.stringify(result.document, null, 2)}\\n`;\n\n context.writeFile(this.options.outputPath, json);\n\n if (result.warnings.length > 0) {\n console.warn(formatWarnings(result.warnings));\n }\n }\n}\n\nfunction validateOptions(options: unknown): OpenApiPluginOptions {\n if (!isPlainObject(options)) {\n throwConfigError(\"options must be an object\");\n }\n\n return options;\n}\n\nfunction normalizeOptions(\n options: OpenApiPluginOptions\n): NormalizedOpenApiPluginOptions {\n const outputPath =\n options.outputPath === undefined ? DEFAULT_OUTPUT_PATH : options.outputPath;\n\n return {\n info: normalizeInfo(options.info),\n ...(options.servers === undefined\n ? {}\n : { servers: normalizeServers(options.servers) }),\n outputPath: normalizeOutputPath(outputPath),\n };\n}\n\nfunction normalizeInfo(info: OpenApiPluginOptions[\"info\"]): OpenApiInfoObject {\n if (info === undefined) {\n return { ...DEFAULT_INFO };\n }\n\n if (!isPlainObject(info)) {\n throwConfigError(\"info must be an object with string title and version\");\n }\n\n if (typeof info.title !== \"string\" || typeof info.version !== \"string\") {\n throwConfigError(\"info.title and info.version must be strings\");\n }\n\n return { ...info };\n}\n\nfunction normalizeServers(\n servers: OpenApiPluginOptions[\"servers\"]\n): readonly OpenApiServerObject[] {\n if (!Array.isArray(servers)) {\n throwConfigError(\"servers must be an array of objects with string url\");\n }\n\n return servers.map((server, index) => {\n if (!isOpenApiServerObject(server)) {\n throwConfigError(`servers[${index}].url must be a string`);\n }\n\n return { ...server };\n });\n}\n\nfunction normalizeOutputPath(outputPath: unknown): string {\n if (typeof outputPath !== \"string\" || outputPath.length === 0) {\n throwConfigError(\"outputPath must be a non-empty relative .json path\");\n }\n\n if (!outputPath.endsWith(\".json\")) {\n throwConfigError(\"outputPath must end with .json\");\n }\n\n if (outputPath.includes(\"\\0\")) {\n throwConfigError(\"outputPath must not contain null bytes\");\n }\n\n if (path.isAbsolute(outputPath) || path.win32.isAbsolute(outputPath)) {\n throwConfigError(\"outputPath must be relative\");\n }\n\n const pathSegments = outputPath.replace(/\\\\/g, \"/\").split(\"/\");\n\n if (pathSegments.some(segment => segment === \"..\")) {\n throwConfigError(\"outputPath must not contain parent directory segments\");\n }\n\n const normalizedPath = path.posix.normalize(pathSegments.join(\"/\"));\n\n if (normalizedPath === \".\" || normalizedPath.startsWith(\"../\")) {\n throwConfigError(\"outputPath must be a safe relative .json path\");\n }\n\n return normalizedPath;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isOpenApiServerObject(value: unknown): value is OpenApiServerObject {\n return isPlainObject(value) && typeof value.url === \"string\";\n}\n\nfunction throwConfigError(message: string): never {\n throw new Error(`OpenApiPlugin config error: ${message}`);\n}\n\nfunction formatWarnings(warnings: readonly OpenApiBuildWarning[]): string {\n const warningLines = warnings.map(\n warning => `- ${warning.code}: ${warning.message} (${warning.documentPath})`\n );\n\n return [\n `OpenAPI generation completed with ${warnings.length} warning(s).`,\n ...warningLines,\n ].join(\"\\n\");\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rexeus/typeweaver-openapi",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"description": "Builds OpenAPI 3.1 documents from Typeweaver normalized specs. Powered by Typeweaver 🧵✨",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "dist/index.cjs",
|
|
8
|
+
"module": "dist/index.mjs",
|
|
9
|
+
"types": "dist/index.d.mts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.mts",
|
|
14
|
+
"default": "./dist/index.mjs"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.cts",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"package.json",
|
|
25
|
+
"README.md",
|
|
26
|
+
"LICENSE",
|
|
27
|
+
"NOTICE"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"typecheck": "tsc --noEmit -p tsconfig.typecheck.json",
|
|
31
|
+
"format": "oxfmt",
|
|
32
|
+
"build": "tsdown && cp ../../LICENSE ../../NOTICE ./dist/",
|
|
33
|
+
"test": "vitest --run",
|
|
34
|
+
"prepack": "npm run build",
|
|
35
|
+
"preversion": "npm run build"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"openapi",
|
|
39
|
+
"json-schema",
|
|
40
|
+
"api",
|
|
41
|
+
"generator",
|
|
42
|
+
"typeweaver"
|
|
43
|
+
],
|
|
44
|
+
"author": "Dennis Wentzien <dw@rexeus.com>",
|
|
45
|
+
"license": "Apache-2.0",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/rexeus/typeweaver.git",
|
|
49
|
+
"directory": "packages/openapi"
|
|
50
|
+
},
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/rexeus/typeweaver/issues"
|
|
53
|
+
},
|
|
54
|
+
"homepage": "https://github.com/rexeus/typeweaver#readme",
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@rexeus/typeweaver-zod-to-json-schema": "workspace:^",
|
|
57
|
+
"polycase": "^1.1.0"
|
|
58
|
+
},
|
|
59
|
+
"peerDependencies": {
|
|
60
|
+
"@rexeus/typeweaver-gen": "workspace:^",
|
|
61
|
+
"zod": "^4.3.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@rexeus/typeweaver-gen": "workspace:^",
|
|
65
|
+
"ibm-openapi-validator": "1.37.13",
|
|
66
|
+
"zod": "^4.3.6"
|
|
67
|
+
}
|
|
68
|
+
}
|