diff --git a/packages/cli/api-importers/v3-importer-commons/src/converters/abstract/AbstractMediaTypeObjectConverter.ts b/packages/cli/api-importers/v3-importer-commons/src/converters/abstract/AbstractMediaTypeObjectConverter.ts index 4fcab82e40f8..0f0731784bfc 100644 --- a/packages/cli/api-importers/v3-importer-commons/src/converters/abstract/AbstractMediaTypeObjectConverter.ts +++ b/packages/cli/api-importers/v3-importer-commons/src/converters/abstract/AbstractMediaTypeObjectConverter.ts @@ -86,9 +86,9 @@ export abstract class AbstractMediaTypeObjectConverter extends AbstractConverter breadcrumbs: [...this.breadcrumbs, "content", contentType, "examples"], skipErrorCollector: true }); - return resolved.resolved ? [key, resolved.value.value ?? resolved.value] : null; + return resolved.resolved ? [key, resolved.value] : null; } - return [key, example.value ?? example]; + return [key, example]; }) .filter((entry): entry is [string, OpenAPIV3_1.ExampleObject] => entry != null) ) diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/example-summaries-fdr.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/example-summaries-fdr.snap new file mode 100644 index 000000000000..965037c27be2 --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/example-summaries-fdr.snap @@ -0,0 +1,225 @@ +{ + "auth": undefined, + "authSchemes": {}, + "globalHeaders": [], + "navigation": undefined, + "rootPackage": { + "endpoints": [ + { + "auth": false, + "authV2": undefined, + "availability": undefined, + "defaultEnvironment": "https://httpbin.org/anything", + "description": undefined, + "environments": [ + { + "baseUrl": "https://httpbin.org/anything", + "id": "https://httpbin.org/anything", + }, + ], + "errors": undefined, + "errorsV2": [], + "examples": [ + { + "codeSamples": undefined, + "description": "", + "headers": {}, + "name": "User token", + "path": "/something", + "pathParameters": {}, + "queryParameters": {}, + "requestBody": { + "foo": "user", + }, + "requestBodyV3": { + "type": "json", + "value": { + "foo": "user", + }, + }, + "responseBody": { + "foo": "string", + }, + "responseBodyV3": { + "type": "json", + "value": { + "foo": "string", + }, + }, + "responseStatusCode": 200, + }, + { + "codeSamples": undefined, + "description": "", + "headers": {}, + "name": "Partner token", + "path": "/something", + "pathParameters": {}, + "queryParameters": {}, + "requestBody": { + "foo": "partner", + }, + "requestBodyV3": { + "type": "json", + "value": { + "foo": "partner", + }, + }, + "responseBody": { + "foo": "string", + }, + "responseBodyV3": { + "type": "json", + "value": { + "foo": "string", + }, + }, + "responseStatusCode": 200, + }, + ], + "headers": [], + "id": "doSomething", + "includeInApiExplorer": undefined, + "method": "POST", + "multiAuth": undefined, + "name": "Do something", + "originalEndpointId": "endpoint_.doSomething", + "path": { + "parts": [ + { + "type": "literal", + "value": "", + }, + { + "type": "literal", + "value": "/something", + }, + ], + "pathParameters": [], + }, + "protocol": { + "type": "rest", + }, + "queryParameters": [], + "request": { + "description": undefined, + "type": { + "contentType": "application/json", + "description": undefined, + "shape": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "Foo", + }, + }, + "type": "json", + }, + }, + "requestsV2": { + "requests": [ + { + "description": undefined, + "type": { + "contentType": "application/json", + "description": undefined, + "shape": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "Foo", + }, + }, + "type": "json", + }, + }, + ], + }, + "response": { + "description": "ok", + "isWildcard": undefined, + "statusCode": 200, + "type": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "Foo", + }, + }, + }, + "responsesV2": { + "responses": [ + { + "description": "ok", + "isWildcard": undefined, + "statusCode": 200, + "type": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "Foo", + }, + }, + }, + ], + }, + "slug": undefined, + }, + ], + "pointsTo": undefined, + "subpackages": [], + "types": [ + "Foo", + ], + "webhooks": [], + "websockets": [], + }, + "snippetsConfiguration": { + "csharpSdk": undefined, + "goSdk": undefined, + "javaSdk": undefined, + "phpSdk": undefined, + "pythonSdk": undefined, + "rubySdk": undefined, + "rustSdk": undefined, + "swiftSdk": undefined, + "typescriptSdk": undefined, + }, + "subpackages": {}, + "types": { + "Foo": { + "availability": undefined, + "description": undefined, + "displayName": undefined, + "name": "Foo", + "shape": { + "extends": [], + "extraProperties": undefined, + "properties": [ + { + "availability": undefined, + "description": undefined, + "key": "foo", + "propertyAccess": undefined, + "valueType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + }, + ], + "type": "object", + }, + }, + }, +} \ No newline at end of file diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/example-summaries-ir.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/example-summaries-ir.snap new file mode 100644 index 000000000000..641e84f9f84b --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/example-summaries-ir.snap @@ -0,0 +1,609 @@ +{ + "apiDisplayName": undefined, + "apiDocs": undefined, + "apiName": { + "camelCase": { + "safeName": "", + "unsafeName": "", + }, + "originalName": "", + "pascalCase": { + "safeName": "", + "unsafeName": "", + }, + "screamingSnakeCase": { + "safeName": "", + "unsafeName": "", + }, + "snakeCase": { + "safeName": "", + "unsafeName": "", + }, + }, + "apiPlayground": undefined, + "apiVersion": undefined, + "audiences": undefined, + "auth": { + "docs": undefined, + "requirement": "ALL", + "schemes": [], + }, + "basePath": undefined, + "constants": { + "errorInstanceIdKey": { + "name": { + "camelCase": { + "safeName": "errorInstanceId", + "unsafeName": "errorInstanceId", + }, + "originalName": "errorInstanceId", + "pascalCase": { + "safeName": "ErrorInstanceId", + "unsafeName": "ErrorInstanceId", + }, + "screamingSnakeCase": { + "safeName": "ERROR_INSTANCE_ID", + "unsafeName": "ERROR_INSTANCE_ID", + }, + "snakeCase": { + "safeName": "error_instance_id", + "unsafeName": "error_instance_id", + }, + }, + "wireValue": "errorInstanceId", + }, + }, + "dynamic": undefined, + "environments": { + "defaultEnvironment": "https://httpbin.org/anything", + "environments": { + "_visit": [Function], + "environments": [ + { + "docs": undefined, + "id": "https://httpbin.org/anything", + "name": { + "camelCase": { + "safeName": "httpsHttpbinOrgAnything", + "unsafeName": "httpsHttpbinOrgAnything", + }, + "originalName": "https://httpbin.org/anything", + "pascalCase": { + "safeName": "HttpsHttpbinOrgAnything", + "unsafeName": "HttpsHttpbinOrgAnything", + }, + "screamingSnakeCase": { + "safeName": "HTTPS_HTTPBIN_ORG_ANYTHING", + "unsafeName": "HTTPS_HTTPBIN_ORG_ANYTHING", + }, + "snakeCase": { + "safeName": "https_httpbin_org_anything", + "unsafeName": "https_httpbin_org_anything", + }, + }, + "url": "https://httpbin.org/anything", + }, + ], + "type": "singleBaseUrl", + }, + }, + "errorDiscriminationStrategy": { + "_visit": [Function], + "type": "statusCode", + }, + "errors": {}, + "fdrApiDefinitionId": undefined, + "generationMetadata": undefined, + "headers": [], + "idempotencyHeaders": [], + "pathParameters": [], + "publishConfig": undefined, + "readmeConfig": undefined, + "rootPackage": { + "docs": undefined, + "errors": [], + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "hasEndpointsInTree": false, + "navigationConfig": undefined, + "service": "service_", + "subpackages": [], + "types": [ + "Foo", + ], + "webhooks": undefined, + "websocket": undefined, + }, + "sdkConfig": { + "hasFileDownloadEndpoints": false, + "hasPaginatedEndpoints": false, + "hasStreamingEndpoints": false, + "isAuthMandatory": true, + "platformHeaders": { + "language": "", + "sdkName": "", + "sdkVersion": "", + "userAgent": undefined, + }, + }, + "selfHosted": false, + "serviceTypeReferenceInfo": { + "sharedTypes": [], + "typesReferencedOnlyByService": {}, + }, + "services": { + "service_": { + "audiences": undefined, + "availability": undefined, + "basePath": { + "head": "", + "parts": [], + }, + "displayName": undefined, + "encoding": undefined, + "endpoints": [ + { + "allPathParameters": [], + "apiPlayground": undefined, + "audiences": [], + "auth": false, + "autogeneratedExamples": [], + "availability": undefined, + "basePath": undefined, + "baseUrl": "https://httpbin.org/anything", + "displayName": "Do something", + "docs": undefined, + "errors": [], + "fullPath": { + "head": "/something", + "parts": [], + }, + "headers": [], + "id": "endpoint_.doSomething", + "idempotent": false, + "method": "POST", + "name": { + "camelCase": { + "safeName": "doSomething", + "unsafeName": "doSomething", + }, + "originalName": "doSomething", + "pascalCase": { + "safeName": "DoSomething", + "unsafeName": "DoSomething", + }, + "screamingSnakeCase": { + "safeName": "DO_SOMETHING", + "unsafeName": "DO_SOMETHING", + }, + "snakeCase": { + "safeName": "do_something", + "unsafeName": "do_something", + }, + }, + "pagination": undefined, + "path": { + "head": "/something", + "parts": [], + }, + "pathParameters": [], + "queryParameters": [], + "requestBody": { + "_visit": [Function], + "contentType": "application/json", + "docs": undefined, + "requestBodyType": { + "_visit": [Function], + "default": undefined, + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "inline": false, + "name": { + "camelCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + "originalName": "Foo", + "pascalCase": { + "safeName": "Foo", + "unsafeName": "Foo", + }, + "screamingSnakeCase": { + "safeName": "FOO", + "unsafeName": "FOO", + }, + "snakeCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + }, + "type": "named", + "typeId": "Foo", + }, + "type": "reference", + "v2Examples": { + "autogeneratedExamples": {}, + "userSpecifiedExamples": { + "Partner token": { + "foo": "partner", + }, + "User token": { + "foo": "user", + }, + }, + }, + }, + "response": { + "body": { + "_visit": [Function], + "type": "json", + "value": { + "_visit": [Function], + "docs": "ok", + "responseBodyType": { + "_visit": [Function], + "default": undefined, + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "inline": false, + "name": { + "camelCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + "originalName": "Foo", + "pascalCase": { + "safeName": "Foo", + "unsafeName": "Foo", + }, + "screamingSnakeCase": { + "safeName": "FOO", + "unsafeName": "FOO", + }, + "snakeCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + }, + "type": "named", + "typeId": "Foo", + }, + "type": "response", + "v2Examples": { + "autogeneratedExamples": { + "doSomethingExample": { + "foo": "string", + }, + }, + "userSpecifiedExamples": {}, + }, + }, + }, + "statusCode": 200, + }, + "retries": undefined, + "sdkRequest": undefined, + "security": undefined, + "source": { + "_visit": [Function], + "type": "openapi", + }, + "transport": undefined, + "userSpecifiedExamples": [], + "v2BaseUrls": undefined, + "v2Examples": { + "autogeneratedExamples": { + "Partner token_doSomethingExample_200": { + "codeSamples": undefined, + "displayName": "Partner token", + "request": { + "auth": undefined, + "baseUrl": undefined, + "docs": undefined, + "endpoint": { + "method": "POST", + "path": "/something", + }, + "environment": "https://httpbin.org/anything", + "headers": {}, + "pathParameters": {}, + "queryParameters": {}, + "requestBody": { + "foo": "partner", + }, + }, + "response": { + "body": { + "_visit": [Function], + "type": "json", + "value": { + "foo": "string", + }, + }, + "docs": undefined, + "statusCode": 200, + }, + }, + }, + "userSpecifiedExamples": { + "User token_doSomethingExample_200": { + "codeSamples": undefined, + "displayName": "User token", + "request": { + "auth": undefined, + "baseUrl": undefined, + "docs": undefined, + "endpoint": { + "method": "POST", + "path": "/something", + }, + "environment": "https://httpbin.org/anything", + "headers": {}, + "pathParameters": {}, + "queryParameters": {}, + "requestBody": { + "foo": "user", + }, + }, + "response": { + "body": { + "_visit": [Function], + "type": "json", + "value": { + "foo": "string", + }, + }, + "docs": undefined, + "statusCode": 200, + }, + }, + }, + }, + "v2RequestBodies": { + "requestBodies": [ + { + "_visit": [Function], + "contentType": "application/json", + "docs": undefined, + "requestBodyType": { + "_visit": [Function], + "default": undefined, + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "inline": false, + "name": { + "camelCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + "originalName": "Foo", + "pascalCase": { + "safeName": "Foo", + "unsafeName": "Foo", + }, + "screamingSnakeCase": { + "safeName": "FOO", + "unsafeName": "FOO", + }, + "snakeCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + }, + "type": "named", + "typeId": "Foo", + }, + "type": "reference", + "v2Examples": { + "autogeneratedExamples": {}, + "userSpecifiedExamples": { + "Partner token": { + "foo": "partner", + }, + "User token": { + "foo": "user", + }, + }, + }, + }, + ], + }, + "v2Responses": { + "responses": [ + { + "body": { + "_visit": [Function], + "type": "json", + "value": { + "_visit": [Function], + "docs": "ok", + "responseBodyType": { + "_visit": [Function], + "default": undefined, + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "inline": false, + "name": { + "camelCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + "originalName": "Foo", + "pascalCase": { + "safeName": "Foo", + "unsafeName": "Foo", + }, + "screamingSnakeCase": { + "safeName": "FOO", + "unsafeName": "FOO", + }, + "snakeCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + }, + "type": "named", + "typeId": "Foo", + }, + "type": "response", + "v2Examples": { + "autogeneratedExamples": { + "doSomethingExample": { + "foo": "string", + }, + }, + "userSpecifiedExamples": {}, + }, + }, + }, + "statusCode": 200, + }, + ], + }, + }, + ], + "headers": [], + "name": { + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + }, + "pathParameters": [], + "transport": undefined, + }, + }, + "sourceConfig": undefined, + "subpackages": {}, + "types": { + "Foo": { + "autogeneratedExamples": [], + "availability": undefined, + "docs": undefined, + "encoding": undefined, + "inline": false, + "name": { + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "name": { + "camelCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + "originalName": "Foo", + "pascalCase": { + "safeName": "Foo", + "unsafeName": "Foo", + }, + "screamingSnakeCase": { + "safeName": "FOO", + "unsafeName": "FOO", + }, + "snakeCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + }, + "typeId": "Foo", + }, + "referencedTypes": Set {}, + "shape": { + "_visit": [Function], + "extendedProperties": [], + "extends": [], + "extraProperties": false, + "properties": [ + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + "originalName": "foo", + "pascalCase": { + "safeName": "Foo", + "unsafeName": "Foo", + }, + "screamingSnakeCase": { + "safeName": "FOO", + "unsafeName": "FOO", + }, + "snakeCase": { + "safeName": "foo", + "unsafeName": "foo", + }, + }, + "wireValue": "foo", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "FooFoo_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + }, + ], + "type": "object", + }, + "source": undefined, + "userProvidedExamples": [], + "v2Examples": { + "autogeneratedExamples": { + "Foo_example_autogenerated": { + "foo": "string", + }, + }, + "userSpecifiedExamples": {}, + }, + }, + }, + "variables": [], + "webhookGroups": {}, + "websocketChannels": undefined, +} \ No newline at end of file diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-fdr.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-fdr.snap index 059e85e67a52..b80e4e81d0a0 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-fdr.snap +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-fdr.snap @@ -63,7 +63,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "commentsServiceCreatecommentExample", "path": "/comments/v1/comments", "pathParameters": {}, "queryParameters": {}, @@ -420,4 +420,4 @@ }, }, }, -} \ No newline at end of file +} diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/multiple-security-headers-fdr.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/multiple-security-headers-fdr.snap index 42e4e7b236a3..1d4724507cac 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/multiple-security-headers-fdr.snap +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/multiple-security-headers-fdr.snap @@ -86,7 +86,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "createTransactionExample", "path": "/transaction", "pathParameters": {}, "queryParameters": {}, @@ -237,7 +237,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "createUserTransactionExample", "path": "/user-transaction", "pathParameters": {}, "queryParameters": {}, @@ -392,7 +392,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "getMerchantSettingsExample", "path": "/merchant/settings", "pathParameters": {}, "queryParameters": {}, @@ -499,7 +499,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "listUsersExample", "path": "/admin/users", "pathParameters": {}, "queryParameters": {}, diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/oneOf-references-mapping-fdr.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/oneOf-references-mapping-fdr.snap index 44940fba7d14..c4c89fb08bd1 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/oneOf-references-mapping-fdr.snap +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/oneOf-references-mapping-fdr.snap @@ -41,7 +41,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "createEventExample", "path": "/events", "pathParameters": {}, "queryParameters": {}, diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-auth-test-fdr.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-auth-test-fdr.snap index 360df07d7b38..7d93b0abaa56 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-auth-test-fdr.snap +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-auth-test-fdr.snap @@ -53,7 +53,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "getProtectedExample", "path": "/protected", "pathParameters": {}, "queryParameters": {}, @@ -158,7 +158,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "getPublicExample", "path": "/public", "pathParameters": {}, "queryParameters": {}, diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-from-flag-simple-fdr.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-from-flag-simple-fdr.snap index 6b905750c151..a3d46e228909 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-from-flag-simple-fdr.snap +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/openapi-from-flag-simple-fdr.snap @@ -41,7 +41,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "getHealthExample", "path": "/health", "pathParameters": {}, "queryParameters": {}, @@ -159,7 +159,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "getUserExample", "path": "/users/user123", "pathParameters": { "userId": "user123", @@ -329,7 +329,7 @@ "codeSamples": undefined, "description": "", "headers": {}, - "name": undefined, + "name": "createUserExample", "path": "/users", "pathParameters": {}, "queryParameters": {}, diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/x-code-samples-fdr.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/x-code-samples-fdr.snap index 9af60607325a..9a37c1334236 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/x-code-samples-fdr.snap +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/x-code-samples-fdr.snap @@ -66,7 +66,7 @@ func main() { ], "description": "", "headers": {}, - "name": undefined, + "name": "getUserExample", "path": "/users/userId", "pathParameters": { "userId": "userId", diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/example-summaries/generators.yml b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/example-summaries/generators.yml new file mode 100644 index 000000000000..bc9a333a3500 --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/example-summaries/generators.yml @@ -0,0 +1,3 @@ +api: + specs: + - openapi: openapi.yml diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/example-summaries/openapi.yml b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/example-summaries/openapi.yml new file mode 100644 index 000000000000..d54c6c921528 --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/example-summaries/openapi.yml @@ -0,0 +1,41 @@ +openapi: 3.1.0 +info: + title: Example Summaries Test + version: 1.0.0 +servers: + - url: https://httpbin.org/anything +paths: + /something: + post: + summary: Do something + operationId: doSomething + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Foo' + examples: + partner_token: + summary: Partner token + value: + foo: partner + user_token: + summary: User token + value: + foo: user + responses: + '200': + description: ok + content: + application/json: + schema: + $ref: '#/components/schemas/Foo' + +components: + schemas: + Foo: + type: object + required: [foo] + properties: + foo: + type: string diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/openapi-from-flag.test.ts b/packages/cli/register/src/ir-to-fdr-converter/__test__/openapi-from-flag.test.ts index 524a8ca8382e..a1aa59c287d6 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/openapi-from-flag.test.ts +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/openapi-from-flag.test.ts @@ -609,4 +609,108 @@ describe("OpenAPI v3 Parser Pipeline (--from-openapi flag)", () => { await expect(fdrApiDefinition).toMatchFileSnapshot("__snapshots__/x-code-samples-override-fdr.snap"); await expect(intermediateRepresentation).toMatchFileSnapshot("__snapshots__/x-code-samples-override-ir.snap"); }); + + it("should preserve OpenAPI example summaries in request bodies", async () => { + // Test that example summaries defined via examples..summary are preserved + // Fixes: https://github.com/fern-api/fern/issues/9551 + const context = createMockTaskContext(); + const workspace = await loadAPIWorkspace({ + absolutePathToWorkspace: join( + AbsoluteFilePath.of(__dirname), + RelativeFilePath.of("fixtures/example-summaries") + ), + context, + cliVersion: "0.0.0", + workspaceName: "example-summaries" + }); + + expect(workspace.didSucceed).toBe(true); + assert(workspace.didSucceed); + + if (!(workspace.workspace instanceof OSSWorkspace)) { + throw new Error( + `Expected OSSWorkspace for OpenAPI processing, got ${workspace.workspace.constructor.name}` + ); + } + + const intermediateRepresentation = await workspace.workspace.getIntermediateRepresentation({ + context, + audiences: { type: "all" }, + enableUniqueErrorsPerEndpoint: true, + generateV1Examples: false, + logWarnings: false + }); + + // Convert to FDR format (complete pipeline) + const fdrApiDefinition = await convertIrToFdrApi({ + ir: intermediateRepresentation, + snippetsConfig: { + typescriptSdk: undefined, + pythonSdk: undefined, + javaSdk: undefined, + rubySdk: undefined, + goSdk: undefined, + csharpSdk: undefined, + phpSdk: undefined, + swiftSdk: undefined, + rustSdk: undefined + }, + playgroundConfig: { + oauth: true + }, + context + }); + + // Validate that example summaries are preserved in IR + expect(intermediateRepresentation.services).toBeDefined(); + const services = Object.values(intermediateRepresentation.services); + expect(services.length).toBeGreaterThan(0); + + const service = services[0]; + expect(service).toBeDefined(); + + if (service && typeof service === "object" && "endpoints" in service) { + const serviceWithEndpoints = service as { + endpoints?: Array<{ + examples?: Array<{ name?: string }>; + requestBody?: { + contentType?: string; + shape?: { + type?: string; + value?: { + jsonExample?: { + properties?: Record; + }; + }; + }; + }; + }>; + }; + + expect(serviceWithEndpoints.endpoints).toBeDefined(); + expect(serviceWithEndpoints.endpoints?.length).toBeGreaterThan(0); + + const doSomethingEndpoint = serviceWithEndpoints.endpoints?.[0]; + expect(doSomethingEndpoint).toBeDefined(); + + // Validate that request body has examples with proper names + // The example names should be "Partner token" and "User token", not "Example 1" or "Example 2" + const irString = JSON.stringify(intermediateRepresentation); + expect(irString).toContain("Partner token"); + expect(irString).toContain("User token"); + + // Should NOT contain generic example names + expect(irString).not.toContain("Example 1"); + expect(irString).not.toContain("Example 2"); + } + + // Validate FDR structure + expect(fdrApiDefinition.types).toBeDefined(); + expect(fdrApiDefinition.subpackages).toBeDefined(); + expect(fdrApiDefinition.rootPackage).toBeDefined(); + + // Snapshot the complete output for regression testing + await expect(fdrApiDefinition).toMatchFileSnapshot("__snapshots__/example-summaries-fdr.snap"); + await expect(intermediateRepresentation).toMatchFileSnapshot("__snapshots__/example-summaries-ir.snap"); + }); }); diff --git a/packages/cli/register/src/ir-to-fdr-converter/convertPackage.ts b/packages/cli/register/src/ir-to-fdr-converter/convertPackage.ts index 8f5b3498780f..c673b5f8862c 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/convertPackage.ts +++ b/packages/cli/register/src/ir-to-fdr-converter/convertPackage.ts @@ -909,8 +909,10 @@ function convertV2HttpEndpointExample({ }); const responseBodyValue = example.response?.body != null ? example.response.body.value : undefined; + const resolvedName = + example.displayName != null ? example.displayName : shouldUseExampleName ? exampleName : undefined; return { - name: shouldUseExampleName ? exampleName : undefined, + name: resolvedName, description: "", path: example.request?.endpoint.path ?? "", pathParameters: example.request?.pathParameters ?? {},