@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
JavaScript
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