Skip to content

Commit ced7f9a

Browse files
johereditimotheeguerin
authored andcommitted
Rremove use of deprecated getDiscriminatedUnion in JS emitter (microsoft#6306)
This change removed the use of the deprecated overload on the JS emitter and adds support for models in the `$.type.getDiscriminator` typekit --------- Co-authored-by: Timothee Guerin <tiguerin@microsoft.com> Co-authored-by: Timothee Guerin <timothee.guerin@outlook.com> # Conflicts: # pnpm-lock.yaml
1 parent 1e5d752 commit ced7f9a

File tree

14 files changed

+86
-55
lines changed

14 files changed

+86
-55
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
changeKind: deprecation
3+
packages:
4+
- "@typespec/compiler"
5+
- "@typespec/http-client-js"
6+
- "@typespec/http-client"
7+
---
8+
9+
Remove the use of deprecated getDiscriminatedUnion
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
changeKind: internal
3+
packages:
4+
- "@typespec/emitter-framework"
5+
---
6+
7+
Remove use of deprecated getDiscriminatedUnion overload

packages/compiler/src/experimental/typekit/kits/model.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import { getEffectiveModelType } from "../../../core/checker.js";
2+
import { ignoreDiagnostics } from "../../../core/diagnostics.js";
3+
import {
4+
DiscriminatedUnionLegacy,
5+
getDiscriminatedUnionFromInheritance,
6+
} from "../../../core/helpers/discriminator-utils.js";
7+
import { getDiscriminator } from "../../../core/intrinsic-type-state.js";
28
import type {
39
Model,
410
ModelIndexer,
@@ -116,6 +122,11 @@ export interface ModelKit {
116122
* @returns The record representing additional properties, or undefined if there are none.
117123
*/
118124
getAdditionalPropertiesRecord(model: Model): Model | undefined;
125+
/**
126+
* Resolves a discriminated union for the given model from inheritance.
127+
* @param type Model to resolve the discriminated union for.
128+
*/
129+
getDiscriminatedUnion(model: Model): DiscriminatedUnionLegacy | undefined;
119130
}
120131

121132
interface TypekitExtension {
@@ -234,5 +245,13 @@ defineKit<TypekitExtension>({
234245

235246
return undefined;
236247
},
248+
getDiscriminatedUnion(model) {
249+
const discriminator = getDiscriminator(this.program, model);
250+
if (!discriminator) {
251+
return undefined;
252+
}
253+
254+
return ignoreDiagnostics(getDiscriminatedUnionFromInheritance(model, discriminator));
255+
},
237256
},
238257
});

packages/compiler/src/experimental/typekit/kits/type.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import {
2-
DiscriminatedUnion,
3-
getDiscriminatedUnion,
4-
} from "../../../core/helpers/discriminator-utils.js";
1+
import { ignoreDiagnostics } from "../../../core/diagnostics.js";
2+
import { getDiscriminatedUnion } from "../../../core/helpers/discriminator-utils.js";
53
import { getLocationContext } from "../../../core/helpers/location-context.js";
64
import {
75
Discriminator,
@@ -20,6 +18,7 @@ import { Enum, Model, Scalar, Union, type Type } from "../../../core/types.js";
2018
import { getDoc, getSummary } from "../../../lib/decorators.js";
2119
import { resolveEncodedName } from "../../../lib/encoded-names.js";
2220
import { defineKit } from "../define-kit.js";
21+
import { $ } from "../index.js";
2322
import { copyMap } from "../utils.js";
2423
import { getPlausibleName } from "../utils/get-plausible-name.js";
2524

@@ -65,11 +64,6 @@ export interface TypeTypekit {
6564
* @param type The scalar to get the name of.z
6665
*/
6766
getPlausibleName(type: Model | Union | Enum | Scalar): string;
68-
/**
69-
* Resolves a discriminated union for the given model or union.
70-
* @param type Model or Union to resolve the discriminated union for.
71-
*/
72-
getDiscriminatedUnion(type: Union): DiscriminatedUnion | undefined;
7367
/**
7468
* Resolves the discriminator for a discriminated union. Returns undefined if the type is not a discriminated union.
7569
* @param type
@@ -236,11 +230,18 @@ defineKit<TypekitExtension>({
236230
return getPlausibleName(type);
237231
},
238232
getDiscriminator(type) {
239-
return getDiscriminator(this.program, type);
240-
},
241-
getDiscriminatedUnion(type) {
242-
const [union] = getDiscriminatedUnion(this.program, type);
243-
return union;
233+
let discriminator: Discriminator | undefined;
234+
if ($.model.is(type)) {
235+
discriminator = getDiscriminator(this.program, type);
236+
} else {
237+
const unionDiscriminator = ignoreDiagnostics(getDiscriminatedUnion(this.program, type));
238+
const propertyName = unionDiscriminator?.options.discriminatorPropertyName;
239+
if (propertyName) {
240+
discriminator = { propertyName };
241+
}
242+
}
243+
244+
return discriminator;
244245
},
245246
maxValue(type) {
246247
return getMaxValue(this.program, type);

packages/compiler/src/experimental/typekit/kits/union.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { ignoreDiagnostics } from "../../../core/diagnostics.js";
2+
import {
3+
DiscriminatedUnion,
4+
getDiscriminatedUnion,
5+
} from "../../../core/helpers/discriminator-utils.js";
26
import type { Type, Union, UnionVariant } from "../../../core/types.js";
37
import { createRekeyableMap } from "../../../utils/misc.js";
48
import { defineKit } from "../define-kit.js";
@@ -73,6 +77,11 @@ export interface UnionKit {
7377
* @param type Uniton to check if it is an expression
7478
*/
7579
isExpression(type: Union): boolean;
80+
/**
81+
* Resolves a discriminated union for the given union.
82+
* @param type Union to resolve the discriminated union for.
83+
*/
84+
getDiscriminatedUnion(type: Union): DiscriminatedUnion | undefined;
7685
}
7786

7887
interface TypekitExtension {
@@ -172,5 +181,8 @@ export const UnionKit = defineKit<TypekitExtension>({
172181
isExpression(type) {
173182
return type.name === undefined || type.name === "";
174183
},
184+
getDiscriminatedUnion(type) {
185+
return ignoreDiagnostics(getDiscriminatedUnion(this.program, type));
186+
},
175187
},
176188
});

packages/emitter-framework/src/typescript/components/type-transform.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { Children, code, For, mapJoin, Refkey, refkey } from "@alloy-js/core";
22
import * as ts from "@alloy-js/typescript";
33
import {
44
Discriminator,
5-
getDiscriminatedUnion,
65
Model,
76
ModelProperty,
87
RekeyableMap,
@@ -57,7 +56,13 @@ interface DiscriminateExpressionProps {
5756
}
5857

5958
function DiscriminateExpression(props: DiscriminateExpressionProps) {
60-
const [discriminatedUnion] = getDiscriminatedUnion(props.type, props.discriminator)!;
59+
const discriminatedUnion = $.model.is(props.type)
60+
? $.model.getDiscriminatedUnion(props.type)
61+
: $.union.getDiscriminatedUnion(props.type);
62+
63+
if (!discriminatedUnion) {
64+
return code`return item as any`;
65+
}
6166

6267
const discriminatorRef = `item.${props.discriminator.propertyName}`;
6368

@@ -66,8 +71,10 @@ function DiscriminateExpression(props: DiscriminateExpressionProps) {
6671
return item as any;
6772
`;
6873

74+
const variants: Map<string, Type> = discriminatedUnion.variants;
75+
6976
return (
70-
<For each={discriminatedUnion.variants} ender={unhandledVariant}>
77+
<For each={variants} ender={unhandledVariant}>
7178
{(name, variant) => {
7279
return code`
7380
if( ${discriminatorRef} === ${JSON.stringify(name)}) {
@@ -331,7 +338,7 @@ function needsTransform(type: Type): boolean {
331338
/**
332339
* This component represents a function call to transform a type
333340
*/
334-
export function TypeTransformCall(props: TypeTransformCallProps) {
341+
export function TypeTransformCall(props: TypeTransformCallProps): Children {
335342
const collapsedProperty = getCollapsedProperty(props.type, props.collapse ?? false);
336343
const itemPath = collapsedProperty
337344
? [...(props.itemPath ?? []), collapsedProperty.name]

packages/http-client-js/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
"@vitest/ui": "^3.0.7",
6868
"picocolors": "~1.1.1",
6969
"concurrently": "^9.1.2",
70-
"dotenv": "^16.4.7",
7170
"execa": "^9.5.2",
7271
"fs-extra": "^11.2.0",
7372
"globby": "~14.1.0",

packages/http-client-js/src/components/testing/client-options.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
import * as ay from "@alloy-js/core";
2-
import { config } from "dotenv";
3-
4-
config();
52

63
export interface ClientTestOptions {}
74

packages/http-client-js/src/components/transforms/json/json-transform-discriminator.tsx

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
import * as ay from "@alloy-js/core";
22
import * as ts from "@alloy-js/typescript";
3-
import {
4-
DiscriminatedUnion,
5-
DiscriminatedUnionLegacy,
6-
Discriminator,
7-
getDiscriminatedUnion,
8-
ignoreDiagnostics,
9-
Model,
10-
Union,
11-
} from "@typespec/compiler";
3+
import { Discriminator, Model, Union } from "@typespec/compiler";
124
import { $ } from "@typespec/compiler/experimental/typekit";
135
import { JsonTransform } from "./json-transform.jsx";
146

@@ -20,17 +12,11 @@ export interface JsonTransformDiscriminatorProps {
2012
}
2113

2214
export function JsonTransformDiscriminator(props: JsonTransformDiscriminatorProps) {
23-
let discriminatedUnion: DiscriminatedUnion | DiscriminatedUnionLegacy | undefined = $.union.is(
24-
props.type,
25-
)
26-
? $.type.getDiscriminatedUnion(props.type)
27-
: undefined;
15+
const discriminatedUnion = $.model.is(props.type)
16+
? $.model.getDiscriminatedUnion(props.type)
17+
: $.union.getDiscriminatedUnion(props.type);
2818

29-
let propertyName: string | undefined = discriminatedUnion?.options.discriminatorPropertyName;
30-
if (!discriminatedUnion && props.discriminator) {
31-
discriminatedUnion = ignoreDiagnostics(getDiscriminatedUnion(props.type, props.discriminator));
32-
propertyName = props.discriminator.propertyName;
33-
}
19+
const propertyName = props.discriminator.propertyName;
3420

3521
if (!discriminatedUnion || !propertyName) {
3622
return ay.code`${props.itemRef}`;

packages/http-client-js/test/e2e/http/type/property/additional-properties/spreads.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,10 @@ describe("Missing AdditionalProperties Endpoints", () => {
377377
});
378378
});
379379

380-
describe("SpreadRecordDiscriminatedUnion", () => {
380+
/**
381+
* Deprecated @discriminator in unions
382+
*/
383+
describe.skip("SpreadRecordDiscriminatedUnion", () => {
381384
const client = new SpreadRecordDiscriminatedUnionClient(clientOptions);
382385
const expected: SpreadRecordForDiscriminatedUnion = {
383386
name: "abc",

0 commit comments

Comments
 (0)