Refactor union field collection logic and condition labeling
This commit is contained in:
@@ -304,6 +304,26 @@ function appendCondition(
|
|||||||
return condition === null ? nextCondition : `${condition}; ${nextCondition}`;
|
return condition === null ? nextCondition : `${condition}; ${nextCondition}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createConditionLabel(
|
||||||
|
currentPath: string,
|
||||||
|
discriminator: string,
|
||||||
|
value: string
|
||||||
|
): string {
|
||||||
|
const parentName = currentPath.split(".").at(-1)?.replace(/\[\]$/, "") ?? "";
|
||||||
|
|
||||||
|
if (
|
||||||
|
(discriminator === "kind" ||
|
||||||
|
discriminator === "type" ||
|
||||||
|
discriminator === "mode") &&
|
||||||
|
parentName.length > 0 &&
|
||||||
|
!parentName.endsWith("s")
|
||||||
|
) {
|
||||||
|
return `${parentName}.${discriminator}=${value}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${discriminator}=${value}`;
|
||||||
|
}
|
||||||
|
|
||||||
function fieldKey(entry: FieldEntry): string {
|
function fieldKey(entry: FieldEntry): string {
|
||||||
return `${entry.path}::${entry.condition ?? ""}`;
|
return `${entry.path}::${entry.condition ?? ""}`;
|
||||||
}
|
}
|
||||||
@@ -414,27 +434,45 @@ function collectUnionFields(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const groupedTypes = new Map<string, ts.Type[]>();
|
||||||
|
|
||||||
for (const objectType of objectTypes) {
|
for (const objectType of objectTypes) {
|
||||||
const discriminatorType =
|
const discriminatorType =
|
||||||
discriminator === null ? null : getPropertyType(objectType, discriminator);
|
discriminator === null ? null : getPropertyType(objectType, discriminator);
|
||||||
const discriminatorValue =
|
const discriminatorValue =
|
||||||
discriminatorType === null
|
discriminatorType === null
|
||||||
? null
|
? ""
|
||||||
: literalUnionLabels(discriminatorType)[0] ?? null;
|
: literalUnionLabels(discriminatorType)[0] ?? "";
|
||||||
|
const groupKey =
|
||||||
|
discriminator === null ? checker.typeToString(objectType) : discriminatorValue;
|
||||||
|
groupedTypes.set(groupKey, [...(groupedTypes.get(groupKey) ?? []), objectType]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [groupKey, groupTypes] of groupedTypes) {
|
||||||
const condition = appendCondition(
|
const condition = appendCondition(
|
||||||
options.condition,
|
options.condition,
|
||||||
discriminator !== null && discriminatorValue !== null
|
discriminator !== null && groupKey.length > 0
|
||||||
? `${discriminator}=${discriminatorValue}`
|
? createConditionLabel(currentPath, discriminator, groupKey)
|
||||||
: null
|
: null
|
||||||
);
|
);
|
||||||
|
const skippedForGroup = new Set([
|
||||||
|
...options.skipProperties,
|
||||||
|
...commonProperties,
|
||||||
|
...(discriminator === null ? [] : [discriminator])
|
||||||
|
]);
|
||||||
|
|
||||||
collectObjectFields(objectType, currentPath, entries, {
|
if (groupTypes.length > 1) {
|
||||||
|
collectUnionFields(groupTypes, currentPath, entries, {
|
||||||
|
condition,
|
||||||
|
skipProperties: skippedForGroup
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
collectObjectFields(groupTypes[0]!, currentPath, entries, {
|
||||||
condition,
|
condition,
|
||||||
skipProperties: options.skipProperties,
|
skipProperties: options.skipProperties,
|
||||||
skipPropertiesForThisObject: new Set([
|
skipPropertiesForThisObject: skippedForGroup
|
||||||
...commonProperties,
|
|
||||||
...(discriminator === null ? [] : [discriminator])
|
|
||||||
])
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user