Skip to content

Commit 5db7541

Browse files
feat(internal): IR minor update to include SSE parsing information (#12242)
* ir proposal * ir proposal 2 on internal/external * data/protocol * openapi-ir and fern def; x-fern-discriminator-context * cut mapping * cut discriminatorField too * release 3.76.0 * jog * schema * snaps * snaps 2 * snaps 3 * snaps 4 please let this be the last
1 parent d76813b commit 5db7541

File tree

97 files changed

+3086
-448
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+3086
-448
lines changed

fern.schema.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,13 @@
847847
],
848848
"additionalProperties": false
849849
},
850+
"types.UnionDiscriminatorContext": {
851+
"type": "string",
852+
"enum": [
853+
"data",
854+
"protocol"
855+
]
856+
},
850857
"types.UnionDiscriminantSchema": {
851858
"type": "object",
852859
"properties": {
@@ -862,6 +869,16 @@
862869
},
863870
"value": {
864871
"type": "string"
872+
},
873+
"context": {
874+
"oneOf": [
875+
{
876+
"$ref": "#/definitions/types.UnionDiscriminatorContext"
877+
},
878+
{
879+
"type": "null"
880+
}
881+
]
865882
}
866883
},
867884
"required": [

fern/apis/fern-definition/definition/types.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,17 @@ types:
219219
- commons.WithName
220220
properties:
221221
value: string
222+
context:
223+
type: optional<UnionDiscriminatorContext>
224+
docs: |
225+
Context for where the discriminator exists. Defaults to "data" for backward compatibility.
226+
"data" means the discriminator is within the union data itself.
227+
"protocol" means the discriminator is at the SSE protocol level.
228+
229+
UnionDiscriminatorContext:
230+
enum:
231+
- data
232+
- protocol
222233

223234
#### Undiscriminated Union ####
224235

package-yml.schema.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,13 @@
867867
],
868868
"additionalProperties": false
869869
},
870+
"types.UnionDiscriminatorContext": {
871+
"type": "string",
872+
"enum": [
873+
"data",
874+
"protocol"
875+
]
876+
},
870877
"types.UnionDiscriminantSchema": {
871878
"type": "object",
872879
"properties": {
@@ -882,6 +889,16 @@
882889
},
883890
"value": {
884891
"type": "string"
892+
},
893+
"context": {
894+
"oneOf": [
895+
{
896+
"$ref": "#/definitions/types.UnionDiscriminatorContext"
897+
},
898+
{
899+
"type": "null"
900+
}
901+
]
885902
}
886903
},
887904
"required": [

packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/fernExtensions.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,23 @@ export const FernOpenAPIExtension = {
500500
* get:
501501
* x-fern-explorer-enabled: true # or false
502502
*/
503-
EXPLORER_ENABLED: "x-fern-explorer-enabled"
503+
EXPLORER_ENABLED: "x-fern-explorer-enabled",
504+
505+
/**
506+
* Used to specify the context where a discriminator exists for union types.
507+
* This is used for SSE discrimination patterns.
508+
*
509+
* components:
510+
* schemas:
511+
* SseStreamEvent:
512+
* discriminator:
513+
* propertyName: event
514+
* x-fern-discriminator-context: protocol # or data (default)
515+
* oneOf:
516+
* - $ref: '#/components/schemas/CompletionEvent'
517+
* - $ref: '#/components/schemas/ErrorEvent'
518+
*/
519+
DISCRIMINATOR_CONTEXT: "x-fern-discriminator-context"
504520
} as const;
505521

506522
export type FernOpenAPIExtension = Values<typeof FernOpenAPIExtension>;

packages/cli/api-importers/openapi/openapi-ir-parser/src/schema/convertDiscriminatedOneOf.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ export function convertDiscriminatedOneOf({
5252
}): SchemaWithExample {
5353
const discriminant = discriminator.propertyName;
5454
const discriminantNameOverride = getExtension<string>(discriminator, FernOpenAPIExtension.FERN_PROPERTY_NAME);
55+
const discriminatorContext =
56+
getExtension<"data" | "protocol">(discriminator, FernOpenAPIExtension.DISCRIMINATOR_CONTEXT) ?? "data";
5557
const unionSubTypes = Object.fromEntries(
5658
Object.entries(discriminator.mapping ?? {}).map(([discriminantValue, schema]) => {
5759
const subtypeReference = convertReferenceObject(
@@ -110,6 +112,7 @@ export function convertDiscriminatedOneOf({
110112
availability,
111113
discriminant,
112114
discriminantNameOverride,
115+
discriminatorContext,
113116
subtypes: unionSubTypes,
114117
namespace,
115118
groupName,
@@ -219,6 +222,7 @@ export function convertDiscriminatedOneOfWithVariants({
219222
availability,
220223
discriminant,
221224
discriminantNameOverride: undefined,
225+
discriminatorContext: "data", // variants don't have discriminator object, default to data
222226
subtypes: unionSubTypes,
223227
namespace,
224228
groupName,
@@ -237,6 +241,7 @@ export function wrapDiscriminatedOneOf({
237241
availability,
238242
discriminant,
239243
discriminantNameOverride,
244+
discriminatorContext,
240245
subtypes,
241246
namespace,
242247
groupName,
@@ -252,6 +257,7 @@ export function wrapDiscriminatedOneOf({
252257
availability: Availability | undefined;
253258
discriminant: string;
254259
discriminantNameOverride: string | undefined;
260+
discriminatorContext: "data" | "protocol";
255261
subtypes: Record<string, SchemaWithExample>;
256262
namespace: string | undefined;
257263
groupName: SdkGroupName | undefined;
@@ -263,6 +269,7 @@ export function wrapDiscriminatedOneOf({
263269
availability,
264270
discriminantProperty: discriminant,
265271
discriminantPropertyNameOverride: discriminantNameOverride,
272+
discriminatorContext,
266273
nameOverride,
267274
generatedName,
268275
title,

packages/cli/api-importers/openapi/openapi-ir-parser/src/schema/utils/convertSchemaToSchemaWithExample.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ function convertToOneOf(oneOfSchema: OneOfSchema): OneOfSchemaWithExample {
241241
availability: oneOfSchema.availability,
242242
discriminantProperty: oneOfSchema.discriminantProperty,
243243
discriminantPropertyNameOverride: oneOfSchema.discriminantPropertyNameOverride,
244+
discriminatorContext: oneOfSchema.discriminatorContext,
244245
generatedName: oneOfSchema.generatedName,
245246
nameOverride: oneOfSchema.nameOverride,
246247
title: oneOfSchema.title,

packages/cli/api-importers/openapi/openapi-ir-parser/src/schema/utils/convertSchemaWithExampleToSchema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ function convertToOneOf(oneOfSchema: OneOfSchemaWithExample): OneOfSchema {
217217
availability: oneOfSchema.availability,
218218
discriminantProperty: oneOfSchema.discriminantProperty,
219219
discriminantPropertyNameOverride: oneOfSchema.discriminantPropertyNameOverride,
220+
discriminatorContext: oneOfSchema.discriminatorContext,
220221
generatedName: oneOfSchema.generatedName,
221222
title: oneOfSchema.title,
222223
nameOverride: oneOfSchema.nameOverride,

packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/allof-oneof-anyof-edge-cases.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,7 @@
613613
"value": {
614614
"commonProperties": [],
615615
"discriminantProperty": "petType",
616+
"discriminatorContext": "data",
616617
"generatedName": "Pet",
617618
"schemas": {
618619
"dog": {

packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/discriminated-union-value-title.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@
186186
"value": {
187187
"commonProperties": [],
188188
"discriminantProperty": "type",
189+
"discriminatorContext": "data",
189190
"generatedName": "SampleUnion",
190191
"schemas": {
191192
"request": {

packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/discriminator-base-class.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@
136136
],
137137
"description": "Base form field with discriminator",
138138
"discriminantProperty": "type",
139+
"discriminatorContext": "data",
139140
"generatedName": "FormFieldBase",
140141
"schemas": {
141142
"text": {

0 commit comments

Comments
 (0)