From 39d9447bae41ad932328f610b77775cc79d1987e Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:36:50 +0000 Subject: [PATCH 1/2] feat: add alpha and preview as availability options for x-fern-availability Co-Authored-By: Niels Swimberghe <3382717+Swimburger@users.noreply.github.com> --- .../v3/extensions/getFernAvailability.ts | 4 +- .../openapi-ir-in-memory/availability.json | 36 + .../openapi-ir/availability.json | 124 ++++ .../__snapshots__/openapi/availability.json | 81 +++ .../fixtures/availability/openapi.yml | 22 + .../openapi-ir/fern/definition/finalIr.yml | 1 + .../resources/finalIr/types/Availability.ts | 6 +- .../resources/finalIr/types/Availability.ts | 4 +- .../src/extensions/x-fern-availability.ts | 2 + .../baseline-sdks/availability.json | 241 +++++++ .../__snapshots__/v3-sdks/availability.json | 620 ++++++++++++++++++ .../fixtures/availability/openapi.yml | 22 + 12 files changed, 1159 insertions(+), 4 deletions(-) diff --git a/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts b/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts index 952f72d2a95..b4f9fe4f364 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts +++ b/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts @@ -13,10 +13,12 @@ export function getFernAvailability(operationObject: OpenAPIV3.OperationObject): const availability = getExtension(operationObject, FernOpenAPIExtension.AVAILABILITY); if (availability === "ga" || availability === "generally-available") { return Availability.GenerallyAvailable; - } else if (availability === "beta" || availability === "pre-release") { + } else if (availability === "beta" || availability === "pre-release" || availability === "preview") { return Availability.Beta; } else if (availability === "deprecated") { return Availability.Deprecated; + } else if (availability === "alpha" || availability === "in-development") { + return Availability.InDevelopment; } if (operationObject.deprecated) { return Availability.Deprecated; diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json index a5621eb345a..e667bc373bd 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json @@ -250,6 +250,42 @@ }, "x-fern-availability": "beta" } + }, + "/alpha-endpoint": { + "get": { + "summary": "An alpha endpoint", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotDeprecatedSettings" + } + } + } + } + }, + "x-fern-availability": "alpha" + } + }, + "/preview-endpoint": { + "get": { + "summary": "A preview endpoint", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotDeprecatedSettings" + } + } + } + } + }, + "x-fern-availability": "preview" + } } }, "components": { diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json index 5134c81cdb1..7084ae0e5c0 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json @@ -776,6 +776,130 @@ "file": "../openapi.yml", "type": "openapi" } + }, + { + "summary": "An alpha endpoint", + "audiences": [], + "tags": [], + "pathParameters": [], + "queryParameters": [], + "headers": [], + "generatedRequestName": "GetAlphaEndpointRequest", + "response": { + "description": "OK", + "schema": { + "generatedName": "GetAlphaEndpointResponse", + "schema": "NotDeprecatedSettings", + "source": { + "file": "../openapi.yml", + "type": "openapi" + }, + "type": "reference" + }, + "fullExamples": [], + "source": { + "file": "../openapi.yml", + "type": "openapi" + }, + "statusCode": 200, + "type": "json" + }, + "errors": {}, + "servers": [], + "authed": false, + "availability": "InDevelopment", + "method": "GET", + "path": "/alpha-endpoint", + "examples": [ + { + "pathParameters": [], + "queryParameters": [], + "headers": [], + "response": { + "value": { + "properties": { + "not_deprecated_setting": { + "value": { + "value": true, + "type": "boolean" + }, + "type": "primitive" + } + }, + "type": "object" + }, + "type": "withoutStreaming" + }, + "codeSamples": [], + "type": "full" + } + ], + "source": { + "file": "../openapi.yml", + "type": "openapi" + } + }, + { + "summary": "A preview endpoint", + "audiences": [], + "tags": [], + "pathParameters": [], + "queryParameters": [], + "headers": [], + "generatedRequestName": "GetPreviewEndpointRequest", + "response": { + "description": "OK", + "schema": { + "generatedName": "GetPreviewEndpointResponse", + "schema": "NotDeprecatedSettings", + "source": { + "file": "../openapi.yml", + "type": "openapi" + }, + "type": "reference" + }, + "fullExamples": [], + "source": { + "file": "../openapi.yml", + "type": "openapi" + }, + "statusCode": 200, + "type": "json" + }, + "errors": {}, + "servers": [], + "authed": false, + "availability": "Beta", + "method": "GET", + "path": "/preview-endpoint", + "examples": [ + { + "pathParameters": [], + "queryParameters": [], + "headers": [], + "response": { + "value": { + "properties": { + "not_deprecated_setting": { + "value": { + "value": true, + "type": "boolean" + }, + "type": "primitive" + } + }, + "type": "object" + }, + "type": "withoutStreaming" + }, + "codeSamples": [], + "type": "full" + } + ], + "source": { + "file": "../openapi.yml", + "type": "openapi" + } } ], "webhooks": [], diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json index cab6ef20fea..6641bbef1af 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json @@ -9,6 +9,58 @@ "auth": false, "base-path": "", "endpoints": { + "aPreviewEndpoint": { + "auth": undefined, + "availability": "pre-release", + "display-name": "A preview endpoint", + "docs": undefined, + "examples": [ + { + "response": { + "body": { + "not_deprecated_setting": true, + }, + }, + }, + ], + "method": "GET", + "pagination": undefined, + "path": "/preview-endpoint", + "response": { + "docs": "OK", + "status-code": 200, + "type": "NotDeprecatedSettings", + }, + "source": { + "openapi": "../openapi.yml", + }, + }, + "anAlphaEndpoint": { + "auth": undefined, + "availability": undefined, + "display-name": "An alpha endpoint", + "docs": undefined, + "examples": [ + { + "response": { + "body": { + "not_deprecated_setting": true, + }, + }, + }, + ], + "method": "GET", + "pagination": undefined, + "path": "/alpha-endpoint", + "response": { + "docs": "OK", + "status-code": 200, + "type": "NotDeprecatedSettings", + }, + "source": { + "openapi": "../openapi.yml", + }, + }, "getCollectionIdActiveIdDeprecatedRefIdXFernAvailabilityPathParam": { "auth": undefined, "docs": undefined, @@ -445,6 +497,35 @@ response: body: not_deprecated_setting: true + anAlphaEndpoint: + path: /alpha-endpoint + method: GET + source: + openapi: ../openapi.yml + display-name: An alpha endpoint + response: + docs: OK + type: NotDeprecatedSettings + status-code: 200 + examples: + - response: + body: + not_deprecated_setting: true + aPreviewEndpoint: + path: /preview-endpoint + method: GET + source: + openapi: ../openapi.yml + display-name: A preview endpoint + response: + docs: OK + type: NotDeprecatedSettings + status-code: 200 + availability: pre-release + examples: + - response: + body: + not_deprecated_setting: true source: openapi: ../openapi.yml types: diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml index d72edeef591..4b8edf79d3c 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml @@ -152,6 +152,28 @@ paths: schema: $ref: "#/components/schemas/NotDeprecatedSettings" x-fern-availability: "beta" + /alpha-endpoint: + get: + summary: An alpha endpoint + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/NotDeprecatedSettings" + x-fern-availability: "alpha" + /preview-endpoint: + get: + summary: A preview endpoint + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/NotDeprecatedSettings" + x-fern-availability: "preview" components: schemas: DeprecatedParam: diff --git a/packages/cli/api-importers/openapi/openapi-ir/fern/definition/finalIr.yml b/packages/cli/api-importers/openapi/openapi-ir/fern/definition/finalIr.yml index 6863a510e3c..fd65472c311 100644 --- a/packages/cli/api-importers/openapi/openapi-ir/fern/definition/finalIr.yml +++ b/packages/cli/api-importers/openapi/openapi-ir/fern/definition/finalIr.yml @@ -185,6 +185,7 @@ types: - GenerallyAvailable - Beta - Deprecated + - InDevelopment Endpoint: extends: diff --git a/packages/cli/api-importers/openapi/openapi-ir/src/sdk/api/resources/finalIr/types/Availability.ts b/packages/cli/api-importers/openapi/openapi-ir/src/sdk/api/resources/finalIr/types/Availability.ts index bf3559ed88a..d43c6210bb3 100644 --- a/packages/cli/api-importers/openapi/openapi-ir/src/sdk/api/resources/finalIr/types/Availability.ts +++ b/packages/cli/api-importers/openapi/openapi-ir/src/sdk/api/resources/finalIr/types/Availability.ts @@ -2,11 +2,12 @@ * This file was auto-generated by Fern from our API Definition. */ -export type Availability = "GenerallyAvailable" | "Beta" | "Deprecated"; +export type Availability = "GenerallyAvailable" | "Beta" | "Deprecated" | "InDevelopment"; export const Availability = { GenerallyAvailable: "GenerallyAvailable", Beta: "Beta", Deprecated: "Deprecated", + InDevelopment: "InDevelopment", _visit: (value: Availability, visitor: Availability.Visitor) => { switch (value) { case Availability.GenerallyAvailable: @@ -15,6 +16,8 @@ export const Availability = { return visitor.beta(); case Availability.Deprecated: return visitor.deprecated(); + case Availability.InDevelopment: + return visitor.inDevelopment(); default: return visitor._other(); } @@ -26,6 +29,7 @@ export namespace Availability { generallyAvailable: () => R; beta: () => R; deprecated: () => R; + inDevelopment: () => R; _other: () => R; } } diff --git a/packages/cli/api-importers/openapi/openapi-ir/src/sdk/serialization/resources/finalIr/types/Availability.ts b/packages/cli/api-importers/openapi/openapi-ir/src/sdk/serialization/resources/finalIr/types/Availability.ts index edd81e91c75..597de4504d8 100644 --- a/packages/cli/api-importers/openapi/openapi-ir/src/sdk/serialization/resources/finalIr/types/Availability.ts +++ b/packages/cli/api-importers/openapi/openapi-ir/src/sdk/serialization/resources/finalIr/types/Availability.ts @@ -7,8 +7,8 @@ import * as FernOpenapiIr from "../../../../api/index"; import * as core from "../../../../core"; export const Availability: core.serialization.Schema = - core.serialization.enum_(["GenerallyAvailable", "Beta", "Deprecated"]); + core.serialization.enum_(["GenerallyAvailable", "Beta", "Deprecated", "InDevelopment"]); export declare namespace Availability { - export type Raw = "GenerallyAvailable" | "Beta" | "Deprecated"; + export type Raw = "GenerallyAvailable" | "Beta" | "Deprecated" | "InDevelopment"; } diff --git a/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts b/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts index 2952c6525b1..8f69b4759c4 100644 --- a/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts +++ b/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts @@ -30,9 +30,11 @@ export class FernAvailabilityExtension extends AbstractExtension Date: Fri, 23 Jan 2026 17:13:12 +0000 Subject: [PATCH 2/2] feat: add stable as availability option for x-fern-availability Co-Authored-By: Niels Swimberghe <3382717+Swimburger@users.noreply.github.com> --- .../v3/extensions/getFernAvailability.ts | 2 +- .../openapi-ir-in-memory/availability.json | 18 + .../openapi-ir/availability.json | 62 ++++ .../__snapshots__/openapi/availability.json | 41 +++ .../fixtures/availability/openapi.yml | 11 + .../src/extensions/x-fern-availability.ts | 1 + .../baseline-sdks/availability.json | 122 +++++++ .../__snapshots__/v3-sdks/availability.json | 310 ++++++++++++++++++ .../fixtures/availability/openapi.yml | 11 + 9 files changed, 577 insertions(+), 1 deletion(-) diff --git a/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts b/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts index b4f9fe4f364..3b0c13d6fb9 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts +++ b/packages/cli/api-importers/openapi/openapi-ir-parser/src/openapi/v3/extensions/getFernAvailability.ts @@ -11,7 +11,7 @@ export interface BasicSecuritySchemeNames { export function getFernAvailability(operationObject: OpenAPIV3.OperationObject): undefined | Availability { const availability = getExtension(operationObject, FernOpenAPIExtension.AVAILABILITY); - if (availability === "ga" || availability === "generally-available") { + if (availability === "ga" || availability === "generally-available" || availability === "stable") { return Availability.GenerallyAvailable; } else if (availability === "beta" || availability === "pre-release" || availability === "preview") { return Availability.Beta; diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json index e667bc373bd..7376d93fa5b 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir-in-memory/availability.json @@ -286,6 +286,24 @@ }, "x-fern-availability": "preview" } + }, + "/stable-endpoint": { + "get": { + "summary": "A stable endpoint", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotDeprecatedSettings" + } + } + } + } + }, + "x-fern-availability": "stable" + } } }, "components": { diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json index 7084ae0e5c0..53b811caa82 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi-ir/availability.json @@ -900,6 +900,68 @@ "file": "../openapi.yml", "type": "openapi" } + }, + { + "summary": "A stable endpoint", + "audiences": [], + "tags": [], + "pathParameters": [], + "queryParameters": [], + "headers": [], + "generatedRequestName": "GetStableEndpointRequest", + "response": { + "description": "OK", + "schema": { + "generatedName": "GetStableEndpointResponse", + "schema": "NotDeprecatedSettings", + "source": { + "file": "../openapi.yml", + "type": "openapi" + }, + "type": "reference" + }, + "fullExamples": [], + "source": { + "file": "../openapi.yml", + "type": "openapi" + }, + "statusCode": 200, + "type": "json" + }, + "errors": {}, + "servers": [], + "authed": false, + "availability": "GenerallyAvailable", + "method": "GET", + "path": "/stable-endpoint", + "examples": [ + { + "pathParameters": [], + "queryParameters": [], + "headers": [], + "response": { + "value": { + "properties": { + "not_deprecated_setting": { + "value": { + "value": true, + "type": "boolean" + }, + "type": "primitive" + } + }, + "type": "object" + }, + "type": "withoutStreaming" + }, + "codeSamples": [], + "type": "full" + } + ], + "source": { + "file": "../openapi.yml", + "type": "openapi" + } } ], "webhooks": [], diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json index 6641bbef1af..94ad2c2bcea 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/__snapshots__/openapi/availability.json @@ -35,6 +35,32 @@ "openapi": "../openapi.yml", }, }, + "aStableEndpoint": { + "auth": undefined, + "availability": "generally-available", + "display-name": "A stable endpoint", + "docs": undefined, + "examples": [ + { + "response": { + "body": { + "not_deprecated_setting": true, + }, + }, + }, + ], + "method": "GET", + "pagination": undefined, + "path": "/stable-endpoint", + "response": { + "docs": "OK", + "status-code": 200, + "type": "NotDeprecatedSettings", + }, + "source": { + "openapi": "../openapi.yml", + }, + }, "anAlphaEndpoint": { "auth": undefined, "availability": undefined, @@ -526,6 +552,21 @@ - response: body: not_deprecated_setting: true + aStableEndpoint: + path: /stable-endpoint + method: GET + source: + openapi: ../openapi.yml + display-name: A stable endpoint + response: + docs: OK + type: NotDeprecatedSettings + status-code: 200 + availability: generally-available + examples: + - response: + body: + not_deprecated_setting: true source: openapi: ../openapi.yml types: diff --git a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml index 4b8edf79d3c..fbaa57ba23a 100644 --- a/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml +++ b/packages/cli/api-importers/openapi/openapi-ir-to-fern-tests/src/__test__/fixtures/availability/openapi.yml @@ -174,6 +174,17 @@ paths: schema: $ref: "#/components/schemas/NotDeprecatedSettings" x-fern-availability: "preview" + /stable-endpoint: + get: + summary: A stable endpoint + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/NotDeprecatedSettings" + x-fern-availability: "stable" components: schemas: DeprecatedParam: diff --git a/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts b/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts index 8f69b4759c4..bc99d006642 100644 --- a/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts +++ b/packages/cli/api-importers/v3-importer-commons/src/extensions/x-fern-availability.ts @@ -38,6 +38,7 @@ export class FernAvailabilityExtension extends AbstractExtension