UNPKG

@typespec/openapi3

Version:

TypeSpec library for emitting OpenAPI 3.0 and OpenAPI 3.1 from the TypeSpec REST protocol binding and converting OpenAPI3 to TypeSpec

68 lines 2.68 kB
import { ObjectBuilder } from "@typespec/asset-emitter"; import { getEncode } from "@typespec/compiler"; import { isHeader, isQueryParam } from "@typespec/http"; import { getSchemaForStdScalars } from "./std-scalar-schemas.js"; function isParameterStyleEncoding(encoding) { if (!encoding) return false; return [ "ArrayEncoding.pipeDelimited", "ArrayEncoding.spaceDelimited", "ArrayEncoding.commaDelimited", "ArrayEncoding.newlineDelimited", ].includes(encoding); } export function applyEncoding(program, typespecType, target, getEncodedFieldName, options) { const encodedFieldName = getEncodedFieldName(typespecType); const targetObject = new ObjectBuilder(target); const encodeData = getEncode(program, typespecType); if (encodeData) { // Query parameters have a couple of special cases where encoding ends up as style. if (isQueryParam(program, typespecType) && isParameterStyleEncoding(encodeData.encoding)) { return targetObject; } const newType = getSchemaForStdScalars(encodeData.type, options); targetObject.type = newType.type; // If the target already has a format it takes priority. (e.g. int32) targetObject[encodedFieldName] = mergeFormatAndEncoding(targetObject[encodedFieldName], encodeData.encoding, newType.format); return targetObject; } if (isDateTimeHeader(program, typespecType, targetObject, encodedFieldName)) { targetObject[encodedFieldName] = "http-date"; return targetObject; } return targetObject; } function mergeFormatAndEncoding(format, encoding, encodeAsFormat) { switch (format) { case undefined: return encodeAsFormat ?? encoding ?? format; case "date-time": switch (encoding) { case "rfc3339": return "date-time"; case "unixTimestamp": return "unixtime"; case "rfc7231": return "http-date"; default: return encoding; } case "duration": switch (encoding) { case "ISO8601": return "duration"; default: return encodeAsFormat ?? encoding; } default: return encodeAsFormat ?? encoding ?? format; } } function isDateTimeHeader(program, typespecType, target, encodedFieldName) { if (isHeader(program, typespecType) && target[encodedFieldName] === "date-time") { return true; } return false; } //# sourceMappingURL=encoding.js.map