in packages/extensions/openapi-to-typespec/src/transforms/transform-arm-resources.ts [57:147]
export function transformTspArmResource(schema: ArmResourceSchema): TspArmResource {
if (armResourceCache.has(schema)) return armResourceCache.get(schema)!;
const { isFullCompatible } = getOptions();
const fixMe: string[] = [];
if (!getSession().configuration["namespace"]) {
const segments = schema.resourceMetadata[0].GetOperation!.Path.split("/");
for (let i = segments.length - 1; i >= 0; i--) {
if (segments[i] === "providers") {
getSession().configuration["namespace"] = segments[i + 1];
updateOptions();
break;
}
}
}
// TODO: deal with a resource with multiple parents
if (schema.resourceMetadata[0].Parents.length > 1) {
fixMe.push(
`// FIXME: ${schema.resourceMetadata[0].SwaggerModelName} has more than one parent, currently converter will only use the first one`,
);
}
const propertiesModel = schema.properties?.find((p) => p.serializedName === "properties");
const propertiesModelSchema = propertiesModel?.schema;
let propertiesModelName = propertiesModelSchema?.language.default.name;
let propertiesPropertyRequired = false;
let propertiesPropertyDescription = "";
if (propertiesModelSchema?.type === SchemaType.Dictionary) {
propertiesModelName = "Record<unknown>";
} else if (propertiesModelSchema?.type === SchemaType.Object) {
propertiesPropertyRequired = propertiesModel?.required ?? false;
propertiesPropertyDescription = propertiesModel?.language.default.description ?? "";
}
// TODO: deal with resources that has no properties property
if (!propertiesModelName) {
fixMe.push(`// FIXME: ${schema.resourceMetadata[0].SwaggerModelName} has no properties property`);
propertiesModelName = "{}";
}
const armResourceOperationGroups = getTspOperationGroups(schema);
const decorators = buildResourceDecorators(schema);
if (schema.resourceMetadata[0].IsExtensionResource) {
decorators.push({ name: "extensionResource" });
}
const clientDecorators = buildResourceClientDecorators(schema);
const keyProperty = buildKeyProperty(schema);
const augmentDecorators = buildKeyAugmentDecorators(schema, keyProperty) ?? [];
const properties = [keyProperty, ...getOtherProperties(schema, augmentDecorators)];
if (propertiesModel) {
augmentDecorators.push(...buildPropertiesAugmentDecorators(schema, propertiesModel));
}
const propertiesPropertyClientDecorator = [];
if (isFullCompatible && propertiesModel?.extensions?.["x-ms-client-flatten"]) {
propertiesPropertyClientDecorator.push({
name: "flattenProperty",
module: "@azure-tools/typespec-client-generator-core",
namespace: "Azure.ClientGenerator.Core",
suppressionCode: "deprecated",
suppressionMessage: "@flattenProperty decorator is not recommended to use.",
});
}
const tspResource: TspArmResource = {
kind: "ArmResource",
name: schema.resourceMetadata[0].SwaggerModelName,
fixMe,
resourceKind: getResourceKind(schema),
properties,
resourceParent: getParentResource(schema),
propertiesModelName,
propertiesPropertyRequired,
propertiesPropertyDescription,
propertiesPropertyClientDecorator,
doc: schema.language.default.description,
decorators,
clientDecorators,
augmentDecorators,
resourceOperationGroups: armResourceOperationGroups,
locationParent: getLocationParent(schema),
};
armResourceCache.set(schema, tspResource);
return tspResource;
}