Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ export function transformGroups(codeModel: CodeModel) {
}

function transformGroup({ language, properties }: GroupSchema): ObjectDetails {
const { name, description } = getLanguageMetadata(language);
const { name, description, isTopLevelParameter } = getLanguageMetadata(language);
const groupProperties = (properties || []).map(prop =>
transformProperty(prop)
transformProperty(prop, isTopLevelParameter)
);

return {
Expand Down
69 changes: 38 additions & 31 deletions packages/autorest.typescript/src/transforms/objectTransforms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export function transformObjects(
const clientName = getLanguageMetadata(codeModel.language).name;
const objectSchemas = codeModel.schemas.objects || [];
const headersSchemas = extractHeaders(codeModel.operationGroups, clientName);
const objectDetails = [...objectSchemas, ...headersSchemas].map(object =>
const objectDetails = [...objectSchemas, ...headersSchemas].map((object) =>
transformObject(object, uberParents)
);

Expand Down Expand Up @@ -63,7 +63,9 @@ export function transformObject(
description: metadata.description || undefined,
schema,
properties: schema.properties
? schema.properties.map(prop => transformProperty(prop))
? schema.properties.map((prop) =>
transformProperty(prop, metadata.isTopLevelParameter)
)
: []
};

Expand All @@ -74,18 +76,21 @@ function getObjectSerializedName(metadata: Language, kind: ObjectKind) {
return metadata.serializedName
? metadata.serializedName
: kind === ObjectKind.Polymorphic
? metadata.name
: undefined;
? metadata.name
: undefined;
}

export function transformProperty({
language,
schema,
serializedName,
required,
readOnly,
nullable
}: Property | GroupProperty): PropertyDetails {
export function transformProperty(
{
language,
schema,
serializedName,
required,
readOnly,
nullable
}: Property | GroupProperty,
isTopLevelParameter: boolean = false
): PropertyDetails {
const { useCoreV2 } = getAutorestOptions();
const metadata = getLanguageMetadata(language);
// In the next call, the second parameter 'false' stands for isNullable
Expand All @@ -101,7 +106,9 @@ export function transformProperty({
return {
name: normalizeName(
metadata.name,
metadata.isTopLevelParameter ? NameType.Parameter : NameType.Property,
isTopLevelParameter || metadata.isTopLevelParameter
? NameType.Parameter
: NameType.Property,
true /** shouldGuard */
),
description,
Expand Down Expand Up @@ -135,7 +142,7 @@ function getObjectKind(schema: ObjectSchema): ObjectKind {
function getObjectDetailsWithHierarchy(
objectsDetails: ObjectDetails[]
): ObjectDetails[] {
return objectsDetails.map(current => {
return objectsDetails.map((current) => {
const parentsSchema = getSchemaParents(
current.schema,
true /** immediateOnly */
Expand Down Expand Up @@ -174,13 +181,13 @@ function extractHierarchy(
return [];
}

return schemas.map(r => {
return schemas.map((r) => {
const relativeName = normalizeName(
getLanguageMetadata(r.language).name,
NameType.Interface,
true /** shouldGuard */
);
const relative = objectsDetails.find(o => o.name === relativeName);
const relative = objectsDetails.find((o) => o.name === relativeName);

if (!relative) {
throw new Error(
Expand Down Expand Up @@ -221,7 +228,7 @@ function transformComposedObject(
throw new Error(`Expected object ${objectDetails.name} to have parents`);
}

const parentNames = immediateParents.map(parent => {
const parentNames = immediateParents.map((parent) => {
const name = getLanguageMetadata(parent.language).name;
return `${normalizeName(
name,
Expand All @@ -244,18 +251,18 @@ function transformPolymorphicObject(
let uberParent: ObjectSchema | undefined = objectDetails.schema;
const allParents = getSchemaParents(schema);
if (allParents && allParents.length) {
const uberParentSchema = allParents.find(p => {
const uberParentSchema = allParents.find((p) => {
// TODO: Reconsider names to reduce issues with normalization, can we switch to serialized?
const name = normalizeName(
getLanguageMetadata(p.language).name,
NameType.Interface,
true /** shouldGuard */
);
return uberParents.some(up => up.name === name);
return uberParents.some((up) => up.name === name);
});

if (!uberParentSchema) {
const upn = uberParents.map(u => u.name);
const upn = uberParents.map((u) => u.name);
throw new Error(
`Could not determine uberParent for Object ${
objectDetails.name
Expand All @@ -269,7 +276,7 @@ function transformPolymorphicObject(
}

if (schema !== uberParent && objectDetails.schema.parents?.immediate[0]) {
uberParent = objectDetails.schema.parents?.immediate[0] as ObjectSchema;
uberParent = objectDetails.schema.parents?.immediate[0] as ObjectSchema;
}
const uberParentName = getLanguageMetadata(uberParent.language).name;
const unionName = `${normalizeName(uberParentName, NameType.Interface)}Union`;
Expand All @@ -290,7 +297,7 @@ function transformPolymorphicObject(
const childDiscriminators = getChildrenDiscriminators(schema);

const propertyToMark = objectDetails.properties.find(
p => p.name === discriminatorProperty
(p) => p.name === discriminatorProperty
);

if (propertyToMark) {
Expand All @@ -309,13 +316,13 @@ function transformPolymorphicObject(
if (uberParent.discriminator) {
const childDiscriminators = getChildrenDiscriminators(schema);
discriminatorValues = {
[getLanguageMetadata(uberParent.discriminator.property.language)
.name]: [
schema.discriminatorValue
? schema.discriminatorValue
: schema.language.default.name,
...childDiscriminators
]
[getLanguageMetadata(uberParent.discriminator.property.language).name]:
[
schema.discriminatorValue
? schema.discriminatorValue
: schema.language.default.name,
...childDiscriminators
]
};
}
}
Expand All @@ -331,6 +338,6 @@ function transformPolymorphicObject(
function getChildrenDiscriminators(objectSchema: ObjectSchema) {
const children = objectSchema.children?.all ?? [];
return children
.map(c => (c as ObjectSchema).discriminatorValue)
.filter(c => !!c) as string[];
.map((c) => (c as ObjectSchema).discriminatorValue)
.filter((c) => !!c) as string[];
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { PropertyKind } from "../models/modelDetails";
import { KnownMediaType } from "@azure-tools/codegen";
import { getAutorestOptions } from "../autorestSession";
import { DictionaryMapper } from "@azure/core-client";
import { ReservedModelNames } from "@azure-tools/rlc-common";

interface OperationParameterDetails {
parameter: Parameter;
Expand Down Expand Up @@ -108,7 +109,7 @@ export function transformParameters(
const { addCredentials } = getSecurityInfoFromModel(codeModel.security);

const hasXmlMetadata = !!options.mediaTypes?.has(KnownMediaType.Xml);
extractOperationParameters(codeModel).forEach(p =>
extractOperationParameters(codeModel).forEach((p) =>
populateOperationParameters(
p.parameter,
parameters,
Expand Down Expand Up @@ -148,33 +149,36 @@ const extractOperationParameters = (codeModel: CodeModel) =>
}
const operationParams: OperationParameterDetails[] = (
operation.parameters || []
).map(p => {
if (p.required) {
p.language.default.isTopLevelParameter = true;
}
).map((p) => {
p.language.default.isTopLevelParameter = true;
p.schema.language.default.isTopLevelParameter = true;
return {
parameter: p,
operationName
}
parameter: p,
operationName
};
});

// Operations may have multiple requests, each with their own set of parameters.
// This is known to be the case when an operation can consume multiple media types.
// We need to ensure that the parameters from each request (method overload) is accounted for.
const requestParams: OperationParameterDetails[] = [];
requests.map(request => {
request.parameters?.map(parameter => {
requests.map((request) => {
request.parameters?.map((parameter) => {
if ((parameter as any)["targetProperty"] !== undefined) {
(parameter as any)[
"targetProperty"
].language.default.isTopLevelParameter = true;
(parameter as any)[
"targetProperty"
].schema.language.default.isTopLevelParameter = true;
}
parameter.language.default.isTopLevelParameter = true;
parameter.schema.language.default.isTopLevelParameter = true;
requestParams.push({
operationName,
parameter,
targetMediaType: request.protocol.http?.knownMediaType
});
if (parameter.required) {
if ((parameter as any)['targetProperty'] !== undefined) {
(parameter as any)['targetProperty'].language.default.isTopLevelParameter = true;
}
parameter.language.default.isTopLevelParameter = true;
}
return parameter;
});
return request;
Expand Down Expand Up @@ -250,11 +254,11 @@ export function populateOperationParameters(
const name = normalizeName(
parameterName,
NameType.Parameter,
parameter.language.default.isTopLevelParameter /** shouldGuard */
true /** shouldGuard */
);

const sameNameParams = operationParameters.filter(
p => p.name === name || p.nameRef === name
(p) => p.name === name || p.nameRef === name
);
description += getSchemaTypeDocumentation(parameter.schema);
const isRequired = getParameterRequired(parameter);
Expand Down Expand Up @@ -348,12 +352,13 @@ function getParameterPath(parameter: Parameter) {
const name = normalizeName(
metadata.name,
NameType.Parameter,
parameter.language.default.isTopLevelParameter ? true: false /** shouldGuard */
true /** shouldGuard */
);

if (parameter.groupedBy) {
const groupedByName = getLanguageMetadata(parameter.groupedBy.language)
.name;
const groupedByName = getLanguageMetadata(
parameter.groupedBy.language
).name;
return [
...(!parameter.required && !parameter.groupedBy.required
? ["options"]
Expand Down Expand Up @@ -409,7 +414,7 @@ function getCollectionFormat(parameter: Parameter): string | undefined {

const getStyle = (value: QueryCollectionFormat) =>
Object.keys(QueryCollectionFormat).find(
key => (QueryCollectionFormat as any)[key] === value
(key) => (QueryCollectionFormat as any)[key] === value
);

let queryCollectionFormat: QueryCollectionFormat;
Expand Down Expand Up @@ -512,7 +517,7 @@ export function disambiguateParameter(
description: string
) {
const param = getComparableParameter(parameter);
const existingParam = sameNameParams.find(p =>
const existingParam = sameNameParams.find((p) =>
isEqual(getComparableParameter(p), param)
);

Expand Down
20 changes: 10 additions & 10 deletions packages/autorest.typescript/src/transforms/transforms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export async function transformChoices(codeModel: CodeModel) {
function extractProperties(
choice: ChoiceSchema | SealedChoiceSchema
): UnionElement[] {
return choice.choices.map(c => {
return choice.choices.map((c) => {
const metadata = getLanguageMetadata(c.language);
return {
name: metadata.name,
Expand Down Expand Up @@ -106,10 +106,10 @@ export async function transformCodeModel(

const options = await transformOptions(operationGroups);

const [objects, groups, parameters, mappers, unions] = await Promise.all([
const [objects, parameters, groups, mappers, unions] = await Promise.all([
transformObjects(codeModel, uberParents),
transformGroups(codeModel),
transformParameters(codeModel, options),
transformGroups(codeModel),
transformMappers(codeModel, uberParents, options),
transformChoices(codeModel)
]);
Expand Down Expand Up @@ -146,9 +146,9 @@ async function getUberParents(codeModel: CodeModel): Promise<ObjectDetails[]> {

let uberParents: ObjectDetails[] = [];

codeModel.schemas.objects.forEach(object => {
codeModel.schemas.objects.forEach((object) => {
const name = getLanguageMetadata(object.language).name;
const isPresent = uberParents.some(up => up.name === name);
const isPresent = uberParents.some((up) => up.name === name);
const hasChildren = object.children && object.children.all.length;
const hasParents = getSchemaParents(object).length > 0;

Expand All @@ -164,9 +164,9 @@ async function getUberParents(codeModel: CodeModel): Promise<ObjectDetails[]> {
function transformHasTenantLevel(
operationGroups: OperationGroupDetails[]
): boolean {
const hasClientLevelSubscription = operationGroups.some(opGroup => {
return opGroup.operations.some(op => {
return op.parameters.some(p => {
const hasClientLevelSubscription = operationGroups.some((opGroup) => {
return opGroup.operations.some((op) => {
return op.parameters.some((p) => {
return (
p.language.default.name.toLowerCase() === "subscriptionid" &&
p.protocol.http?.in === ParameterLocation.Path &&
Expand All @@ -175,8 +175,8 @@ function transformHasTenantLevel(
});
});
});
const hasTenantLevelOperation = operationGroups.some(opGroup => {
return opGroup.operations.some(op => {
const hasTenantLevelOperation = operationGroups.some((opGroup) => {
return opGroup.operations.some((op) => {
return op.isTenantLevel;
});
});
Expand Down
5 changes: 4 additions & 1 deletion packages/autorest.typescript/src/utils/languageHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@ export interface PaginationExtension {
isNextLinkMethod?: boolean;
}

export type Language = ModelerLanguage & { paging?: PaginationExtension };
export type Language = ModelerLanguage & {
paging?: PaginationExtension;
isTopLevelParameter?: boolean;
};

export function getLanguageMetadata(languages: Languages): Language {
return languages.typescript || languages.javascript || languages.default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export interface ParameterGroupingPostOptionalParameters {
/** Parameter group */
export interface ParameterGroupingPostReservedWordsParameters {
/** 'from' is a reserved word. Pass in 'bob' to pass. */
from?: string;
fromParam?: string;
Comment thread
qiaozha marked this conversation as resolved.
Outdated
/** 'accept' is a reserved word. Pass in 'yes' to pass. */
accept?: string;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,11 @@ export const query1: OperationQueryParameter = {
},
};

export const from: OperationQueryParameter = {
export const fromParam: OperationQueryParameter = {
parameterPath: [
"options",
"parameterGroupingPostReservedWordsParameters",
"from",
"fromParam",
],
mapper: {
serializedName: "from",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ const postReservedWordsOperationSpec: coreClient.OperationSpec = {
bodyMapper: Mappers.ErrorModel,
},
},
queryParameters: [Parameters.from, Parameters.accept1],
queryParameters: [Parameters.fromParam, Parameters.accept1],
urlParameters: [Parameters.$host],
headerParameters: [Parameters.accept],
serializer,
Expand Down
Loading