diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/CLAUDE.md b/packages/cli/register/src/ir-to-fdr-converter/__test__/CLAUDE.md index 91f915ea624c..2719675cdbbc 100644 --- a/packages/cli/register/src/ir-to-fdr-converter/__test__/CLAUDE.md +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/CLAUDE.md @@ -6,7 +6,7 @@ Direct testing of OpenAPI v3 parser pipeline without CLI compilation. ```bash # Run tests -cd packages/cli/workspace/register +cd packages/cli/register pnpm test src/ir-to-fdr-converter/__test__/openapi-from-flag.test.ts # Update snapshots 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 new file mode 100644 index 000000000000..9678a7d32da6 --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-fdr.snap @@ -0,0 +1,421 @@ +{ + "auth": { + "description": undefined, + "tokenName": "token", + "type": "bearerAuth", + }, + "authSchemes": { + "Bearer": { + "description": undefined, + "tokenName": "token", + "type": "bearerAuth", + }, + }, + "globalHeaders": [], + "navigation": undefined, + "rootPackage": { + "endpoints": [], + "pointsTo": undefined, + "subpackages": [ + "subpackage_commentsService", + ], + "types": [ + "Comment", + "CreateCommentRequest", + "CreateCommentResponse", + ], + "webhooks": [], + "websockets": [], + }, + "snippetsConfiguration": { + "csharpSdk": undefined, + "goSdk": undefined, + "javaSdk": undefined, + "phpSdk": undefined, + "pythonSdk": undefined, + "rubySdk": undefined, + "rustSdk": undefined, + "swiftSdk": undefined, + "typescriptSdk": undefined, + }, + "subpackages": { + "subpackage_commentsService": { + "description": undefined, + "displayName": undefined, + "endpoints": [ + { + "auth": false, + "authV2": undefined, + "availability": undefined, + "defaultEnvironment": "Production", + "description": "buf:lint:ignore RPC_REQUEST_STANDARD_NAME + Create a comment on a resource", + "environments": [ + { + "baseUrl": "https://test.com/api", + "id": "Production", + }, + ], + "errors": undefined, + "errorsV2": [], + "examples": [ + { + "codeSamples": undefined, + "description": "", + "headers": {}, + "name": undefined, + "path": "/comments/v1/comments", + "pathParameters": {}, + "queryParameters": {}, + "requestBody": {}, + "requestBodyV3": { + "type": "json", + "value": {}, + }, + "responseBody": { + "comment": { + "author": "string", + "created_at": 1, + "id": "string", + "resource_id": "string", + "text": "string", + }, + }, + "responseBodyV3": { + "type": "json", + "value": { + "comment": { + "author": "string", + "created_at": 1, + "id": "string", + "resource_id": "string", + "text": "string", + }, + }, + }, + "responseStatusCode": 200, + }, + ], + "headers": [], + "id": "createcomment", + "includeInApiExplorer": undefined, + "method": "POST", + "multiAuth": undefined, + "name": "Add a Comment", + "originalEndpointId": "endpoint_commentsService.createcomment", + "path": { + "parts": [ + { + "type": "literal", + "value": "", + }, + { + "type": "literal", + "value": "/comments/v1/comments", + }, + ], + "pathParameters": [], + }, + "protocol": { + "type": "rest", + }, + "queryParameters": [], + "request": { + "description": undefined, + "type": { + "contentType": "application/json", + "description": undefined, + "shape": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "CreateCommentRequest", + }, + }, + "type": "json", + }, + }, + "requestsV2": { + "requests": [ + { + "description": undefined, + "type": { + "contentType": "application/json", + "description": undefined, + "shape": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "CreateCommentRequest", + }, + }, + "type": "json", + }, + }, + ], + }, + "response": { + "description": "OK", + "statusCode": 200, + "type": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "CreateCommentResponse", + }, + }, + }, + "responsesV2": { + "responses": [ + { + "description": "OK", + "statusCode": 200, + "type": { + "type": "reference", + "value": { + "default": undefined, + "type": "id", + "value": "CreateCommentResponse", + }, + }, + }, + ], + }, + "slug": undefined, + }, + ], + "name": "commentsService", + "pointsTo": undefined, + "subpackageId": "subpackage_commentsService", + "subpackages": [], + "types": [], + "webhooks": [], + "websockets": [], + }, + }, + "types": { + "Comment": { + "availability": undefined, + "description": undefined, + "displayName": undefined, + "name": "Comment", + "shape": { + "extends": [], + "extraProperties": undefined, + "properties": [ + { + "availability": undefined, + "description": undefined, + "key": "id", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + "type": "optional", + }, + }, + { + "availability": undefined, + "description": undefined, + "key": "resource_id", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + "type": "optional", + }, + }, + { + "availability": undefined, + "description": undefined, + "key": "text", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + "type": "optional", + }, + }, + { + "availability": undefined, + "description": undefined, + "key": "author", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + "type": "optional", + }, + }, + { + "availability": undefined, + "description": undefined, + "key": "created_at", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "maximum": undefined, + "minimum": undefined, + "type": "long", + }, + }, + "type": "optional", + }, + }, + ], + "type": "object", + }, + }, + "CreateCommentRequest": { + "availability": undefined, + "description": undefined, + "displayName": undefined, + "name": "CreateCommentRequest", + "shape": { + "extends": [], + "extraProperties": undefined, + "properties": [ + { + "availability": undefined, + "description": undefined, + "key": "resource_id", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + "type": "optional", + }, + }, + { + "availability": undefined, + "description": undefined, + "key": "text", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + "type": "optional", + }, + }, + { + "availability": undefined, + "description": undefined, + "key": "author", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "type": "primitive", + "value": { + "default": undefined, + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "regex": undefined, + "type": "string", + }, + }, + "type": "optional", + }, + }, + ], + "type": "object", + }, + }, + "CreateCommentResponse": { + "availability": undefined, + "description": undefined, + "displayName": undefined, + "name": "CreateCommentResponse", + "shape": { + "extends": [], + "extraProperties": undefined, + "properties": [ + { + "availability": undefined, + "description": undefined, + "key": "comment", + "propertyAccess": undefined, + "valueType": { + "defaultValue": undefined, + "itemType": { + "default": undefined, + "type": "id", + "value": "Comment", + }, + "type": "optional", + }, + }, + ], + "type": "object", + }, + }, + }, +} \ No newline at end of file diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-ir.snap b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-ir.snap new file mode 100644 index 000000000000..a4d2de21d084 --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/__snapshots__/grpc-comments-ir.snap @@ -0,0 +1,1318 @@ +{ + "apiDisplayName": undefined, + "apiDocs": undefined, + "apiName": { + "camelCase": { + "safeName": "", + "unsafeName": "", + }, + "originalName": "", + "pascalCase": { + "safeName": "", + "unsafeName": "", + }, + "screamingSnakeCase": { + "safeName": "", + "unsafeName": "", + }, + "snakeCase": { + "safeName": "", + "unsafeName": "", + }, + }, + "apiPlayground": undefined, + "apiVersion": undefined, + "audiences": [], + "auth": { + "docs": undefined, + "requirement": "ALL", + "schemes": [ + { + "_visit": [Function], + "docs": undefined, + "key": "Bearer", + "token": { + "camelCase": { + "safeName": "token", + "unsafeName": "token", + }, + "originalName": "token", + "pascalCase": { + "safeName": "Token", + "unsafeName": "Token", + }, + "screamingSnakeCase": { + "safeName": "TOKEN", + "unsafeName": "TOKEN", + }, + "snakeCase": { + "safeName": "token", + "unsafeName": "token", + }, + }, + "tokenEnvVar": undefined, + "type": "bearer", + }, + ], + }, + "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": "Production", + "environments": { + "_visit": [Function], + "environments": [ + { + "docs": undefined, + "id": "Production", + "name": { + "camelCase": { + "safeName": "production", + "unsafeName": "production", + }, + "originalName": "Production", + "pascalCase": { + "safeName": "Production", + "unsafeName": "Production", + }, + "screamingSnakeCase": { + "safeName": "PRODUCTION", + "unsafeName": "PRODUCTION", + }, + "snakeCase": { + "safeName": "production", + "unsafeName": "production", + }, + }, + "url": "https://test.com/api", + }, + ], + "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": undefined, + "subpackages": [ + "subpackage_commentsService", + ], + "types": [ + "Comment", + "CreateCommentRequest", + "CreateCommentResponse", + ], + "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_commentsService": { + "audiences": undefined, + "availability": undefined, + "basePath": { + "head": "", + "parts": [], + }, + "displayName": undefined, + "encoding": undefined, + "endpoints": [ + { + "allPathParameters": [], + "apiPlayground": undefined, + "audiences": [], + "auth": false, + "autogeneratedExamples": [], + "availability": undefined, + "basePath": undefined, + "baseUrl": undefined, + "displayName": "Add a Comment", + "docs": "buf:lint:ignore RPC_REQUEST_STANDARD_NAME + Create a comment on a resource", + "errors": [], + "fullPath": { + "head": "/comments/v1/comments", + "parts": [], + }, + "headers": [], + "id": "endpoint_commentsService.createcomment", + "idempotent": false, + "method": "POST", + "name": { + "camelCase": { + "safeName": "createcomment", + "unsafeName": "createcomment", + }, + "originalName": "createcomment", + "pascalCase": { + "safeName": "Createcomment", + "unsafeName": "Createcomment", + }, + "screamingSnakeCase": { + "safeName": "CREATECOMMENT", + "unsafeName": "CREATECOMMENT", + }, + "snakeCase": { + "safeName": "createcomment", + "unsafeName": "createcomment", + }, + }, + "pagination": undefined, + "path": { + "head": "/comments/v1/comments", + "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": "createCommentRequest", + "unsafeName": "createCommentRequest", + }, + "originalName": "CreateCommentRequest", + "pascalCase": { + "safeName": "CreateCommentRequest", + "unsafeName": "CreateCommentRequest", + }, + "screamingSnakeCase": { + "safeName": "CREATE_COMMENT_REQUEST", + "unsafeName": "CREATE_COMMENT_REQUEST", + }, + "snakeCase": { + "safeName": "create_comment_request", + "unsafeName": "create_comment_request", + }, + }, + "type": "named", + "typeId": "CreateCommentRequest", + }, + "type": "reference", + "v2Examples": { + "autogeneratedExamples": { + "commentsServiceCreatecommentExample": {}, + }, + "userSpecifiedExamples": {}, + }, + }, + "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": "createCommentResponse", + "unsafeName": "createCommentResponse", + }, + "originalName": "CreateCommentResponse", + "pascalCase": { + "safeName": "CreateCommentResponse", + "unsafeName": "CreateCommentResponse", + }, + "screamingSnakeCase": { + "safeName": "CREATE_COMMENT_RESPONSE", + "unsafeName": "CREATE_COMMENT_RESPONSE", + }, + "snakeCase": { + "safeName": "create_comment_response", + "unsafeName": "create_comment_response", + }, + }, + "type": "named", + "typeId": "CreateCommentResponse", + }, + "type": "response", + "v2Examples": { + "autogeneratedExamples": { + "commentsServiceCreatecommentExample": { + "comment": { + "author": "string", + "created_at": 1, + "id": "string", + "resource_id": "string", + "text": "string", + }, + }, + }, + "userSpecifiedExamples": {}, + }, + }, + }, + "statusCode": 200, + }, + "retries": undefined, + "sdkRequest": undefined, + "security": undefined, + "source": { + "_visit": [Function], + "type": "openapi", + }, + "transport": undefined, + "userSpecifiedExamples": [], + "v2BaseUrls": undefined, + "v2Examples": { + "autogeneratedExamples": { + "commentsServiceCreatecommentExample_200": { + "codeSamples": undefined, + "displayName": "commentsServiceCreatecommentExample", + "request": { + "auth": undefined, + "baseUrl": undefined, + "docs": undefined, + "endpoint": { + "method": "POST", + "path": "/comments/v1/comments", + }, + "environment": undefined, + "headers": {}, + "pathParameters": {}, + "queryParameters": {}, + "requestBody": {}, + }, + "response": { + "body": { + "_visit": [Function], + "type": "json", + "value": { + "comment": { + "author": "string", + "created_at": 1, + "id": "string", + "resource_id": "string", + "text": "string", + }, + }, + }, + "docs": undefined, + "statusCode": 200, + }, + }, + }, + "userSpecifiedExamples": {}, + }, + "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": "createCommentRequest", + "unsafeName": "createCommentRequest", + }, + "originalName": "CreateCommentRequest", + "pascalCase": { + "safeName": "CreateCommentRequest", + "unsafeName": "CreateCommentRequest", + }, + "screamingSnakeCase": { + "safeName": "CREATE_COMMENT_REQUEST", + "unsafeName": "CREATE_COMMENT_REQUEST", + }, + "snakeCase": { + "safeName": "create_comment_request", + "unsafeName": "create_comment_request", + }, + }, + "type": "named", + "typeId": "CreateCommentRequest", + }, + "type": "reference", + "v2Examples": { + "autogeneratedExamples": { + "commentsServiceCreatecommentExample": {}, + }, + "userSpecifiedExamples": {}, + }, + }, + ], + }, + "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": "createCommentResponse", + "unsafeName": "createCommentResponse", + }, + "originalName": "CreateCommentResponse", + "pascalCase": { + "safeName": "CreateCommentResponse", + "unsafeName": "CreateCommentResponse", + }, + "screamingSnakeCase": { + "safeName": "CREATE_COMMENT_RESPONSE", + "unsafeName": "CREATE_COMMENT_RESPONSE", + }, + "snakeCase": { + "safeName": "create_comment_response", + "unsafeName": "create_comment_response", + }, + }, + "type": "named", + "typeId": "CreateCommentResponse", + }, + "type": "response", + "v2Examples": { + "autogeneratedExamples": { + "commentsServiceCreatecommentExample": { + "comment": { + "author": "string", + "created_at": 1, + "id": "string", + "resource_id": "string", + "text": "string", + }, + }, + }, + "userSpecifiedExamples": {}, + }, + }, + }, + "statusCode": 200, + }, + ], + }, + }, + ], + "headers": [], + "name": { + "fernFilepath": { + "allParts": [ + { + "camelCase": { + "safeName": "commentsService", + "unsafeName": "commentsService", + }, + "originalName": "CommentsService", + "pascalCase": { + "safeName": "CommentsService", + "unsafeName": "CommentsService", + }, + "screamingSnakeCase": { + "safeName": "COMMENTS_SERVICE", + "unsafeName": "COMMENTS_SERVICE", + }, + "snakeCase": { + "safeName": "comments_service", + "unsafeName": "comments_service", + }, + }, + ], + "file": { + "camelCase": { + "safeName": "commentsService", + "unsafeName": "commentsService", + }, + "originalName": "CommentsService", + "pascalCase": { + "safeName": "CommentsService", + "unsafeName": "CommentsService", + }, + "screamingSnakeCase": { + "safeName": "COMMENTS_SERVICE", + "unsafeName": "COMMENTS_SERVICE", + }, + "snakeCase": { + "safeName": "comments_service", + "unsafeName": "comments_service", + }, + }, + "packagePath": [], + }, + }, + "pathParameters": [], + "transport": undefined, + }, + }, + "sourceConfig": undefined, + "subpackages": { + "subpackage_commentsService": { + "displayName": undefined, + "docs": undefined, + "errors": [], + "fernFilepath": { + "allParts": [ + { + "camelCase": { + "safeName": "commentsService", + "unsafeName": "commentsService", + }, + "originalName": "commentsService", + "pascalCase": { + "safeName": "CommentsService", + "unsafeName": "CommentsService", + }, + "screamingSnakeCase": { + "safeName": "COMMENTS_SERVICE", + "unsafeName": "COMMENTS_SERVICE", + }, + "snakeCase": { + "safeName": "comments_service", + "unsafeName": "comments_service", + }, + }, + ], + "file": { + "camelCase": { + "safeName": "commentsService", + "unsafeName": "commentsService", + }, + "originalName": "commentsService", + "pascalCase": { + "safeName": "CommentsService", + "unsafeName": "CommentsService", + }, + "screamingSnakeCase": { + "safeName": "COMMENTS_SERVICE", + "unsafeName": "COMMENTS_SERVICE", + }, + "snakeCase": { + "safeName": "comments_service", + "unsafeName": "comments_service", + }, + }, + "packagePath": [], + }, + "hasEndpointsInTree": false, + "name": { + "camelCase": { + "safeName": "commentsService", + "unsafeName": "commentsService", + }, + "originalName": "commentsService", + "pascalCase": { + "safeName": "CommentsService", + "unsafeName": "CommentsService", + }, + "screamingSnakeCase": { + "safeName": "COMMENTS_SERVICE", + "unsafeName": "COMMENTS_SERVICE", + }, + "snakeCase": { + "safeName": "comments_service", + "unsafeName": "comments_service", + }, + }, + "navigationConfig": undefined, + "service": "service_commentsService", + "subpackages": [], + "types": [], + "webhooks": undefined, + "websocket": undefined, + }, + }, + "types": { + "Comment": { + "autogeneratedExamples": [], + "availability": undefined, + "docs": undefined, + "encoding": undefined, + "inline": false, + "name": { + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "name": { + "camelCase": { + "safeName": "comment", + "unsafeName": "comment", + }, + "originalName": "Comment", + "pascalCase": { + "safeName": "Comment", + "unsafeName": "Comment", + }, + "screamingSnakeCase": { + "safeName": "COMMENT", + "unsafeName": "COMMENT", + }, + "snakeCase": { + "safeName": "comment", + "unsafeName": "comment", + }, + }, + "typeId": "Comment", + }, + "referencedTypes": Set {}, + "shape": { + "_visit": [Function], + "extendedProperties": [], + "extends": [], + "extraProperties": false, + "properties": [ + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "id", + "unsafeName": "id", + }, + "originalName": "id", + "pascalCase": { + "safeName": "Id", + "unsafeName": "Id", + }, + "screamingSnakeCase": { + "safeName": "ID", + "unsafeName": "ID", + }, + "snakeCase": { + "safeName": "id", + "unsafeName": "id", + }, + }, + "wireValue": "id", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CommentId_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "resourceId", + "unsafeName": "resourceId", + }, + "originalName": "resource_id", + "pascalCase": { + "safeName": "ResourceId", + "unsafeName": "ResourceId", + }, + "screamingSnakeCase": { + "safeName": "RESOURCE_ID", + "unsafeName": "RESOURCE_ID", + }, + "snakeCase": { + "safeName": "resource_id", + "unsafeName": "resource_id", + }, + }, + "wireValue": "resource_id", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CommentResourceId_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "text", + "unsafeName": "text", + }, + "originalName": "text", + "pascalCase": { + "safeName": "Text", + "unsafeName": "Text", + }, + "screamingSnakeCase": { + "safeName": "TEXT", + "unsafeName": "TEXT", + }, + "snakeCase": { + "safeName": "text", + "unsafeName": "text", + }, + }, + "wireValue": "text", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CommentText_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "author", + "unsafeName": "author", + }, + "originalName": "author", + "pascalCase": { + "safeName": "Author", + "unsafeName": "Author", + }, + "screamingSnakeCase": { + "safeName": "AUTHOR", + "unsafeName": "AUTHOR", + }, + "snakeCase": { + "safeName": "author", + "unsafeName": "author", + }, + }, + "wireValue": "author", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CommentAuthor_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "createdAt", + "unsafeName": "createdAt", + }, + "originalName": "created_at", + "pascalCase": { + "safeName": "CreatedAt", + "unsafeName": "CreatedAt", + }, + "screamingSnakeCase": { + "safeName": "CREATED_AT", + "unsafeName": "CREATED_AT", + }, + "snakeCase": { + "safeName": "created_at", + "unsafeName": "created_at", + }, + }, + "wireValue": "created_at", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CommentCreatedAt_example_autogenerated": 1, + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "LONG", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "long", + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + ], + "type": "object", + }, + "source": undefined, + "userProvidedExamples": [], + "v2Examples": { + "autogeneratedExamples": { + "Comment_example_autogenerated": {}, + }, + "userSpecifiedExamples": {}, + }, + }, + "CreateCommentRequest": { + "autogeneratedExamples": [], + "availability": undefined, + "docs": undefined, + "encoding": undefined, + "inline": false, + "name": { + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "name": { + "camelCase": { + "safeName": "createCommentRequest", + "unsafeName": "createCommentRequest", + }, + "originalName": "CreateCommentRequest", + "pascalCase": { + "safeName": "CreateCommentRequest", + "unsafeName": "CreateCommentRequest", + }, + "screamingSnakeCase": { + "safeName": "CREATE_COMMENT_REQUEST", + "unsafeName": "CREATE_COMMENT_REQUEST", + }, + "snakeCase": { + "safeName": "create_comment_request", + "unsafeName": "create_comment_request", + }, + }, + "typeId": "CreateCommentRequest", + }, + "referencedTypes": Set {}, + "shape": { + "_visit": [Function], + "extendedProperties": [], + "extends": [], + "extraProperties": false, + "properties": [ + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "resourceId", + "unsafeName": "resourceId", + }, + "originalName": "resource_id", + "pascalCase": { + "safeName": "ResourceId", + "unsafeName": "ResourceId", + }, + "screamingSnakeCase": { + "safeName": "RESOURCE_ID", + "unsafeName": "RESOURCE_ID", + }, + "snakeCase": { + "safeName": "resource_id", + "unsafeName": "resource_id", + }, + }, + "wireValue": "resource_id", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CreateCommentRequestResourceId_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "text", + "unsafeName": "text", + }, + "originalName": "text", + "pascalCase": { + "safeName": "Text", + "unsafeName": "Text", + }, + "screamingSnakeCase": { + "safeName": "TEXT", + "unsafeName": "TEXT", + }, + "snakeCase": { + "safeName": "text", + "unsafeName": "text", + }, + }, + "wireValue": "text", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CreateCommentRequestText_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "author", + "unsafeName": "author", + }, + "originalName": "author", + "pascalCase": { + "safeName": "Author", + "unsafeName": "Author", + }, + "screamingSnakeCase": { + "safeName": "AUTHOR", + "unsafeName": "AUTHOR", + }, + "snakeCase": { + "safeName": "author", + "unsafeName": "author", + }, + }, + "wireValue": "author", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": { + "CreateCommentRequestAuthor_example_autogenerated": "string", + }, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "primitive": { + "v1": "STRING", + "v2": { + "_visit": [Function], + "default": undefined, + "type": "string", + "validation": { + "format": undefined, + "maxLength": undefined, + "minLength": undefined, + "pattern": undefined, + }, + }, + }, + "type": "primitive", + }, + "type": "optional", + }, + "type": "container", + }, + }, + ], + "type": "object", + }, + "source": undefined, + "userProvidedExamples": [], + "v2Examples": { + "autogeneratedExamples": { + "CreateCommentRequest_example_autogenerated": {}, + }, + "userSpecifiedExamples": {}, + }, + }, + "CreateCommentResponse": { + "autogeneratedExamples": [], + "availability": undefined, + "docs": undefined, + "encoding": undefined, + "inline": false, + "name": { + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "name": { + "camelCase": { + "safeName": "createCommentResponse", + "unsafeName": "createCommentResponse", + }, + "originalName": "CreateCommentResponse", + "pascalCase": { + "safeName": "CreateCommentResponse", + "unsafeName": "CreateCommentResponse", + }, + "screamingSnakeCase": { + "safeName": "CREATE_COMMENT_RESPONSE", + "unsafeName": "CREATE_COMMENT_RESPONSE", + }, + "snakeCase": { + "safeName": "create_comment_response", + "unsafeName": "create_comment_response", + }, + }, + "typeId": "CreateCommentResponse", + }, + "referencedTypes": Set {}, + "shape": { + "_visit": [Function], + "extendedProperties": [], + "extends": [], + "extraProperties": false, + "properties": [ + { + "availability": undefined, + "docs": undefined, + "name": { + "name": { + "camelCase": { + "safeName": "comment", + "unsafeName": "comment", + }, + "originalName": "comment", + "pascalCase": { + "safeName": "Comment", + "unsafeName": "Comment", + }, + "screamingSnakeCase": { + "safeName": "COMMENT", + "unsafeName": "COMMENT", + }, + "snakeCase": { + "safeName": "comment", + "unsafeName": "comment", + }, + }, + "wireValue": "comment", + }, + "propertyAccess": undefined, + "v2Examples": { + "autogeneratedExamples": {}, + "userSpecifiedExamples": {}, + }, + "valueType": { + "_visit": [Function], + "container": { + "_visit": [Function], + "optional": { + "_visit": [Function], + "default": undefined, + "displayName": undefined, + "fernFilepath": { + "allParts": [], + "file": undefined, + "packagePath": [], + }, + "inline": false, + "name": { + "camelCase": { + "safeName": "comment", + "unsafeName": "comment", + }, + "originalName": "Comment", + "pascalCase": { + "safeName": "Comment", + "unsafeName": "Comment", + }, + "screamingSnakeCase": { + "safeName": "COMMENT", + "unsafeName": "COMMENT", + }, + "snakeCase": { + "safeName": "comment", + "unsafeName": "comment", + }, + }, + "type": "named", + "typeId": "Comment", + }, + "type": "optional", + }, + "type": "container", + }, + }, + ], + "type": "object", + }, + "source": undefined, + "userProvidedExamples": [], + "v2Examples": { + "autogeneratedExamples": { + "CreateCommentResponse_example_autogenerated": {}, + }, + "userSpecifiedExamples": {}, + }, + }, + }, + "variables": [], + "webhookGroups": {}, + "websocketChannels": {}, +} \ No newline at end of file diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/generators.yml b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/generators.yml new file mode 100644 index 000000000000..d1bb06065675 --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/generators.yml @@ -0,0 +1,16 @@ +auth-schemes: + Bearer: + scheme: bearer +api: + auth: Bearer + default-environment: Production + environments: + Production: https://test.com/api + specs: + - proto: + root: proto + local-generation: true + from-openapi: true + dependencies: + - buf.build/googleapis/googleapis + - buf.build/bufbuild/protovalidate diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/proto/comments.proto b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/proto/comments.proto new file mode 100644 index 000000000000..1a97117023fd --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/proto/comments.proto @@ -0,0 +1,39 @@ +syntax = "proto3"; + +package comments.v1; + +option go_package = "github.com/fern-api/fern/comments/v1"; + +import "google/api/annotations.proto"; +import "fern/options.proto"; + +service CommentsService { + // buf:lint:ignore RPC_REQUEST_STANDARD_NAME + // Create a comment on a resource + rpc CreateComment(CreateCommentRequest) returns (CreateCommentResponse) { + option (google.api.http) = { + post: "/comments/v1/comments" + response_body: "comment" + body: "*" + }; + option (fern.summary) = "Add a Comment"; + } +} + +message CreateCommentRequest { + string resource_id = 1; + string text = 2; + string author = 3; +} + +message CreateCommentResponse { + Comment comment = 1; +} + +message Comment { + string id = 1; + string resource_id = 2; + string text = 3; + string author = 4; + int64 created_at = 5; +} diff --git a/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/proto/fern/options.proto b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/proto/fern/options.proto new file mode 100644 index 000000000000..400ab8f82773 --- /dev/null +++ b/packages/cli/register/src/ir-to-fdr-converter/__test__/fixtures/grpc-comments/proto/fern/options.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package fern; + +import "google/protobuf/descriptor.proto"; + +option go_package = "github.com/fern-api/protoc-gen-openapi/extensions/fern"; + +extend google.protobuf.MethodOptions { + // Custom summary for the RPC method that will be used as the OpenAPI operation summary. + // This overrides any auto-generated summary. + string summary = 51001; +} 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 754261af0a49..cac530abadbb 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 @@ -374,4 +374,64 @@ describe("OpenAPI v3 Parser Pipeline (--from-openapi flag)", () => { const rootApi = definition.rootApiFile?.contents; expect(rootApi).toBeDefined(); }); + + it("should handle gRPC proto with comments service", async () => { + const context = createMockTaskContext(); + const workspace = await loadAPIWorkspace({ + absolutePathToWorkspace: join( + AbsoluteFilePath.of(__dirname), + RelativeFilePath.of("fixtures/grpc-comments") + ), + context, + cliVersion: "0.0.0", + workspaceName: "grpc-comments" + }); + + expect(workspace.didSucceed).toBe(true); + assert(workspace.didSucceed); + + if (!(workspace.workspace instanceof OSSWorkspace)) { + throw new Error(`Expected OSSWorkspace for gRPC processing, got ${workspace.workspace.constructor.name}`); + } + + const intermediateRepresentation = await workspace.workspace.getIntermediateRepresentation({ + context, + audiences: { type: "all" }, + enableUniqueErrorsPerEndpoint: true, + generateV1Examples: false, + logWarnings: true + }); + + // 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 auth was processed correctly + expect(intermediateRepresentation.auth).toBeDefined(); + expect(fdrApiDefinition.authSchemes).toBeDefined(); + + // Validate services and endpoints + expect(intermediateRepresentation.services).toBeDefined(); + expect(fdrApiDefinition.subpackages).toBeDefined(); + + // Snapshot the complete output for regression testing + await expect(fdrApiDefinition).toMatchFileSnapshot("__snapshots__/grpc-comments-fdr.snap"); + await expect(intermediateRepresentation).toMatchFileSnapshot("__snapshots__/grpc-comments-ir.snap"); + }); });