diff --git a/fern/docs.yml b/fern/docs.yml index 630394d1f..0442b9c68 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -632,6 +632,6 @@ redirects: - source: /learn/api-definitions/openrpc/extensions/others destination: /learn/api-definitions/openrpc/extensions/overview permanent: true - - source: /learn/api-definitions/grpc/extensions/others - destination: /learn/api-definitions/grpc/extensions/overview + - source: /learn/api-definitions/grpc/extensions/:slug* + destination: /learn/api-definitions/overview/overrides#definition-specific-extensions permanent: true \ No newline at end of file diff --git a/fern/products/api-def/api-def.yml b/fern/products/api-def/api-def.yml index 73d8bf5ea..16ec2b7c6 100644 --- a/fern/products/api-def/api-def.yml +++ b/fern/products/api-def/api-def.yml @@ -211,44 +211,6 @@ navigation: - page: Error handling path: ./grpc-pages/services/errors.mdx slug: errors - - section: Extensions - slug: extensions - contents: - - page: Overview - path: ./grpc-pages/extensions/overview.md - - page: Audiences - path: ./grpc-pages/extensions/audiences.mdx - - page: Availability - path: ./grpc-pages/extensions/availability.mdx - - page: Base path - path: ./grpc-pages/extensions/base-path.mdx - - page: Error handling - path: ./grpc-pages/extensions/error-handling.mdx - - page: Request + response examples - path: ./grpc-pages/extensions/examples.mdx - - page: Ignoring elements - path: ./grpc-pages/extensions/ignore.mdx - - page: SDK method names - path: ./grpc-pages/extensions/method-names.mdx - slug: method-names - - page: Pagination - path: ./grpc-pages/extensions/pagination.mdx - - page: Parameter names - path: ./grpc-pages/extensions/parameter-names.mdx - - page: Retry behavior - path: ./grpc-pages/extensions/retry.mdx - - page: SDK group names - path: ./grpc-pages/extensions/sdk-group-name.mdx - - page: Server names - path: ./grpc-pages/extensions/server-name.mdx - - page: Streaming operations - path: ./grpc-pages/extensions/streaming.mdx - - page: Timeout settings - path: ./grpc-pages/extensions/timeout.mdx - - page: Union naming - path: ./grpc-pages/extensions/union-naming.mdx - - page: Validation - path: ./grpc-pages/extensions/validation.mdx - section: Fern Definition collapsed: true slug: ferndef diff --git a/fern/products/api-def/grpc-pages/extensions/audiences.mdx b/fern/products/api-def/grpc-pages/extensions/audiences.mdx deleted file mode 100644 index 8c18f6ac9..000000000 --- a/fern/products/api-def/grpc-pages/extensions/audiences.mdx +++ /dev/null @@ -1,360 +0,0 @@ ---- -title: Use audiences to filter your API -subtitle: Use `x-fern-audiences` to filter to relevant services, methods and messages ---- - -Audiences are a useful tool for segmenting your gRPC API for different consumers. Common examples of audiences include `public` -and `beta`. - - - Remember to filter your SDKs and Docs after specifying audiences. If **no audiences** are specified, - nothing will be filtered. - - - - -The following example configures the SDK to filter to the `public` audience: - -```yaml title="generators.yml" {3-4} -groups: - sdks: - audiences: - - public - generators: - - name: fernapi/fern-typescript-node-sdk - version: 0.8.8 -``` - - - -The following example configures the docs to filter to the `public` audience: - -```yaml title="docs.yml" {3-4} -navigation: - - api: API Reference - audiences: - - public -``` - - - - - -## Filter services - -Add `x-fern-audiences` to services to control which services are included for specific audiences: - -```protobuf title="user_service.proto" -syntax = "proto3"; - -package userservice.v1; - -// Public user service available to all clients -service UserService { - option (x_fern_audiences) = "public"; - - rpc GetUser(GetUserRequest) returns (User); - rpc CreateUser(CreateUserRequest) returns (User); -} - -// Internal admin service for administrative operations -service AdminService { - option (x_fern_audiences) = "admin"; - - rpc ListAllUsers(ListAllUsersRequest) returns (ListAllUsersResponse); - rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty); - rpc BanUser(BanUserRequest) returns (google.protobuf.Empty); -} -``` - -## Filter individual methods - -You can filter specific methods within services: - -```protobuf title="mixed_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Public method available to all - rpc GetUser(GetUserRequest) returns (User) { - option (x_fern_audiences) = "public"; - } - - // Beta method only for beta testers - rpc GetUserAnalytics(GetUserAnalyticsRequest) returns (UserAnalytics) { - option (x_fern_audiences) = "beta"; - } - - // Internal method for debugging - rpc GetUserDebugInfo(GetUserDebugRequest) returns (UserDebugInfo) { - option (x_fern_audiences) = "internal"; - } -} -``` - -## Filter message fields - -Filter specific fields within message types: - -```protobuf title="user_messages.proto" -syntax = "proto3"; - -package userservice.v1; - -message User { - string id = 1; // Available to all audiences - string email = 2; // Available to all audiences - string name = 3; // Available to all audiences - - // Admin-only fields - string internal_id = 4 [(x_fern_audiences) = "admin"]; - repeated string permissions = 5 [(x_fern_audiences) = "admin"]; - google.protobuf.Timestamp created_at = 6 [(x_fern_audiences) = "admin"]; - - // Debug-only fields - map debug_metadata = 7 [(x_fern_audiences) = "debug"]; - string session_id = 8 [(x_fern_audiences) = "debug"]; -} -``` - -## Filter entire messages - -Filter entire message types to different audiences: - -```protobuf title="filtered_messages.proto" -syntax = "proto3"; - -package userservice.v1; - -// Public user data -message PublicUser { - option (x_fern_audiences) = "public"; - - string id = 1; - string name = 2; - string avatar_url = 3; -} - -// Extended user data for authenticated users -message AuthenticatedUser { - option (x_fern_audiences) = "authenticated"; - - string id = 1; - string name = 2; - string email = 3; - string phone = 4; - UserPreferences preferences = 5; -} - -// Full user data for administrators -message AdminUser { - option (x_fern_audiences) = "admin"; - - string id = 1; - string name = 2; - string email = 3; - string phone = 4; - UserPreferences preferences = 5; - repeated string roles = 6; - repeated Permission permissions = 7; - google.protobuf.Timestamp created_at = 8; - google.protobuf.Timestamp last_login = 9; - string created_by = 10; -} -``` - -## Filter enums and enum values - -Filter enum values based on audience: - -```protobuf title="user_enums.proto" -syntax = "proto3"; - -package userservice.v1; - -enum UserStatus { - USER_STATUS_UNSPECIFIED = 0; - - // Public statuses - USER_STATUS_ACTIVE = 1 [(x_fern_audiences) = "public"]; - USER_STATUS_INACTIVE = 2 [(x_fern_audiences) = "public"]; - - // Admin-only statuses - USER_STATUS_SUSPENDED = 3 [(x_fern_audiences) = "admin"]; - USER_STATUS_BANNED = 4 [(x_fern_audiences) = "admin"]; - USER_STATUS_PENDING_VERIFICATION = 5 [(x_fern_audiences) = "admin"]; - - // Internal debugging statuses - USER_STATUS_DEBUG = 6 [(x_fern_audiences) = "debug"]; - USER_STATUS_TEST = 7 [(x_fern_audiences) = "debug"]; -} - -enum OperationType { - OPERATION_TYPE_UNSPECIFIED = 0; - - // Available to beta users - OPERATION_TYPE_EXPERIMENTAL_FEATURE = 1 [(x_fern_audiences) = "beta"]; - OPERATION_TYPE_ADVANCED_ANALYTICS = 2 [(x_fern_audiences) = "beta"]; - - // Internal operations - OPERATION_TYPE_SYSTEM_MAINTENANCE = 3 [(x_fern_audiences) = "internal"]; -} -``` - -## Request/Response filtering - -Filter request and response messages based on audience: - -```protobuf title="request_response.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Method with different request/response based on audience - rpc GetUserProfile(GetUserProfileRequest) returns (GetUserProfileResponse); -} - -message GetUserProfileRequest { - string user_id = 1; - - // Admin can request additional data - bool include_internal_data = 2 [(x_fern_audiences) = "admin"]; - bool include_audit_log = 3 [(x_fern_audiences) = "admin"]; - - // Debug fields - bool include_debug_info = 4 [(x_fern_audiences) = "debug"]; -} - -message GetUserProfileResponse { - PublicUserProfile public_profile = 1; // Always included - - AdminUserProfile admin_profile = 2 [(x_fern_audiences) = "admin"]; // Admin only - repeated AuditLogEntry audit_log = 3 [(x_fern_audiences) = "admin"]; // Admin only - - DebugInfo debug_info = 4 [(x_fern_audiences) = "debug"]; // Debug only -} -``` - -## Conditional method definitions - -Use audiences to expose different versions of methods: - -```protobuf title="conditional_methods.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Basic user creation for public - rpc CreateUser(CreateUserRequest) returns (User) { - option (x_fern_audiences) = "public"; - } - - // Enhanced user creation for admin - rpc CreateUserWithPermissions(CreateUserWithPermissionsRequest) returns (AdminUser) { - option (x_fern_audiences) = "admin"; - } - - // Bulk user creation for enterprise - rpc BulkCreateUsers(BulkCreateUsersRequest) returns (BulkCreateUsersResponse) { - option (x_fern_audiences) = "enterprise"; - } - - // Beta features - rpc CreateUserWithAI(CreateUserWithAIRequest) returns (User) { - option (x_fern_audiences) = "beta"; - } -} -``` - -## Streaming method filtering - -Filter streaming methods by audience: - -```protobuf title="streaming_methods.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserStreamingService { - // Public event streaming - rpc StreamUserEvents(StreamUserEventsRequest) returns (stream PublicUserEvent) { - option (x_fern_audiences) = "public"; - } - - // Admin event streaming with more details - rpc StreamAdminEvents(StreamAdminEventsRequest) returns (stream AdminEvent) { - option (x_fern_audiences) = "admin"; - } - - // Internal debugging stream - rpc StreamDebugEvents(StreamDebugEventsRequest) returns (stream DebugEvent) { - option (x_fern_audiences) = "debug"; - } -} -``` - -## Multiple audience support - -Assign multiple audiences to services or methods: - -```protobuf title="multiple_audiences.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Available to both public and authenticated users - rpc GetPublicUserInfo(GetPublicUserInfoRequest) returns (PublicUserInfo) { - option (x_fern_audiences) = "public,authenticated"; - } - - // Available to admin and support staff - rpc GetUserSupportInfo(GetUserSupportInfoRequest) returns (UserSupportInfo) { - option (x_fern_audiences) = "admin,support"; - } - - // Available to beta and internal users - rpc TestNewFeature(TestNewFeatureRequest) returns (TestNewFeatureResponse) { - option (x_fern_audiences) = "beta,internal"; - } -} -``` - -## Using custom extensions - -Define custom Fern extensions for audience filtering: - -```protobuf title="custom_extensions.proto" -syntax = "proto3"; - -package userservice.v1; - -import "google/protobuf/descriptor.proto"; - -// Define custom option for audience filtering -extend google.protobuf.ServiceOptions { - string x_fern_audiences = 50001; -} - -extend google.protobuf.MethodOptions { - string x_fern_audiences = 50002; -} - -extend google.protobuf.FieldOptions { - string x_fern_audiences = 50003; -} - -extend google.protobuf.MessageOptions { - string x_fern_audiences = 50004; -} - -extend google.protobuf.EnumValueOptions { - string x_fern_audiences = 50005; -} -``` - -This allows you to create different views of the same gRPC API for different types of consumers, ensuring each audience only sees the services, methods, and data relevant to their use case. \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/availability.mdx b/fern/products/api-def/grpc-pages/extensions/availability.mdx deleted file mode 100644 index 29bdae6db..000000000 --- a/fern/products/api-def/grpc-pages/extensions/availability.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Availability -description: Mark features as available in specific SDK versions using `x-fern-availability` extension ---- - -Mark features as available in specific SDK versions: - -```protobuf title="availability_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc GetUser(GetUserRequest) returns (User); - - rpc GetUserAnalytics(GetUserAnalyticsRequest) returns (UserAnalytics) { - option (x_fern_availability) = '{ - "status": "beta", - "message": "This feature is in beta and may change" - }'; - } - - rpc ExperimentalSearch(ExperimentalSearchRequest) returns (SearchResults) { - option (x_fern_availability) = '{ - "status": "experimental", - "message": "This is an experimental feature and may be removed" - }'; - } -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/base-path.mdx b/fern/products/api-def/grpc-pages/extensions/base-path.mdx deleted file mode 100644 index 7d9949e21..000000000 --- a/fern/products/api-def/grpc-pages/extensions/base-path.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Base path -description: Configure base paths for generated SDK clients using `x-fern-base-path` extension ---- - -Configure base paths for generated SDK clients: - -```protobuf title="base_path_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - option (x_fern_base_path) = "/api/v1"; - - rpc GetUser(GetUserRequest) returns (User); -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/error-handling.mdx b/fern/products/api-def/grpc-pages/extensions/error-handling.mdx deleted file mode 100644 index aaef8b687..000000000 --- a/fern/products/api-def/grpc-pages/extensions/error-handling.mdx +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Error handling -description: Configure error handling for methods using `x-fern-error-handling` extension ---- - -Configure error handling for methods: - -```protobuf title="error_handling_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc CreateUser(CreateUserRequest) returns (User) { - option (x_fern_error_handling) = '{ - "ALREADY_EXISTS": { - "error_name": "UserAlreadyExistsError", - "user_friendly_message": "A user with this email already exists" - }, - "INVALID_ARGUMENT": { - "error_name": "ValidationError", - "user_friendly_message": "Please check your input and try again" - }, - "RESOURCE_EXHAUSTED": { - "error_name": "RateLimitError", - "retry_after_seconds": 60 - } - }'; - } -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/examples.mdx b/fern/products/api-def/grpc-pages/extensions/examples.mdx deleted file mode 100644 index 40e83e05e..000000000 --- a/fern/products/api-def/grpc-pages/extensions/examples.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Request + response examples -description: Provide additional examples for better SDK documentation using `x-fern-examples` extension ---- - -Provide additional examples for better SDK documentation: - -```protobuf title="user_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc CreateUser(CreateUserRequest) returns (User) { - option (x_fern_examples) = '{ - "StandardUser": { - "description": "Create a regular user account", - "request": { - "email": "john@example.com", - "name": "John Doe", - "age": 30, - "preferences": { - "theme": "dark", - "notifications": true - } - }, - "response": { - "id": "user_123", - "email": "john@example.com", - "name": "John Doe", - "created_at": "2024-01-15T10:30:00Z" - } - }, - "AdminUser": { - "description": "Create an admin user with special permissions", - "request": { - "email": "admin@example.com", - "name": "Admin User", - "role": "admin", - "permissions": ["read", "write", "delete"] - }, - "response": { - "id": "user_456", - "email": "admin@example.com", - "name": "Admin User", - "role": "admin", - "created_at": "2024-01-15T10:30:00Z" - } - } - }'; - } -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/ignore.mdx b/fern/products/api-def/grpc-pages/extensions/ignore.mdx deleted file mode 100644 index 41462a836..000000000 --- a/fern/products/api-def/grpc-pages/extensions/ignore.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Ignoring services, methods, or messages -description: Skip reading specific gRPC elements using `x-fern-ignore` extension ---- - -Use `x-fern-ignore` to exclude specific services, methods or messages from SDK generation: - -```protobuf title="user_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc GetUser(GetUserRequest) returns (User); - - // Exclude internal debugging method - rpc DebugUserData(DebugUserRequest) returns (DebugUserResponse) { - option (x_fern_ignore) = true; - } - - // Exclude experimental method - rpc ExperimentalFeature(ExperimentalRequest) returns (ExperimentalResponse) { - option (x_fern_ignore) = true; - } -} - -// Exclude internal message from SDK -message InternalUserData { - option (x_fern_ignore) = true; - - string internal_id = 1; - repeated string debug_flags = 2; - map system_metadata = 3; -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/method-names.mdx b/fern/products/api-def/grpc-pages/extensions/method-names.mdx deleted file mode 100644 index 3fe83e3a1..000000000 --- a/fern/products/api-def/grpc-pages/extensions/method-names.mdx +++ /dev/null @@ -1,330 +0,0 @@ ---- -title: SDK Method Names -subtitle: Use `x-fern-sdk-method-name` to customize SDK method names for gRPC methods ---- - -By default, Fern generates SDK method names based on your gRPC service and method names. You can override this behavior using the `x-fern-sdk-method-name` extension. - -## Customize method names - -Use `x-fern-sdk-method-name` to specify custom method names for your gRPC methods: - -```protobuf title="user_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Customize the SDK method name - rpc GetUserById(GetUserByIdRequest) returns (User) { - option (x_fern_sdk_method_name) = "getUser"; - } - - // Another customized method name - rpc CreateNewUser(CreateNewUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "create"; - } - - // Remove redundant service name from method - rpc UpdateUserProfile(UpdateUserProfileRequest) returns (User) { - option (x_fern_sdk_method_name) = "updateProfile"; - } -} -``` - -This will generate SDK methods like: - -```typescript -// Instead of client.userService.getUserById() -const user = await client.userService.getUser({ id: "user_123" }); - -// Instead of client.userService.createNewUser() -const newUser = await client.userService.create({ userData: {...} }); - -// Instead of client.userService.updateUserProfile() -const updatedUser = await client.userService.updateProfile({ profileData: {...} }); -``` - -## Method naming conventions - -Follow these conventions when naming SDK methods: - -### CRUD operations -Use standard CRUD naming for common operations: - -```protobuf title="crud_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc CreateUser(CreateUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "create"; - } - - rpc GetUser(GetUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "get"; - } - - rpc UpdateUser(UpdateUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "update"; - } - - rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty) { - option (x_fern_sdk_method_name) = "delete"; - } - - rpc ListUsers(ListUsersRequest) returns (ListUsersResponse) { - option (x_fern_sdk_method_name) = "list"; - } -} -``` - -### Search and query operations -Use descriptive names for search operations: - -```protobuf title="search_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc SearchUsers(SearchUsersRequest) returns (SearchUsersResponse) { - option (x_fern_sdk_method_name) = "search"; - } - - rpc FindUserByEmail(FindUserByEmailRequest) returns (User) { - option (x_fern_sdk_method_name) = "findByEmail"; - } - - rpc QueryUsersByRole(QueryUsersByRoleRequest) returns (QueryUsersResponse) { - option (x_fern_sdk_method_name) = "queryByRole"; - } -} -``` - -### Action operations -Use action-oriented names for business operations: - -```protobuf title="action_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc ActivateUserAccount(ActivateUserAccountRequest) returns (User) { - option (x_fern_sdk_method_name) = "activate"; - } - - rpc DeactivateUserAccount(DeactivateUserAccountRequest) returns (User) { - option (x_fern_sdk_method_name) = "deactivate"; - } - - rpc ResetUserPassword(ResetUserPasswordRequest) returns (ResetPasswordResponse) { - option (x_fern_sdk_method_name) = "resetPassword"; - } - - rpc SendVerificationEmail(SendVerificationEmailRequest) returns (google.protobuf.Empty) { - option (x_fern_sdk_method_name) = "sendVerification"; - } -} -``` - -## Language-specific method names - -You can specify different method names for different programming languages: - -```protobuf title="language_specific.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc GetUserPreferences(GetUserPreferencesRequest) returns (UserPreferences) { - option (x_fern_sdk_method_name_python) = "get_preferences"; - option (x_fern_sdk_method_name_typescript) = "getPreferences"; - option (x_fern_sdk_method_name_go) = "GetPreferences"; - option (x_fern_sdk_method_name_java) = "getPreferences"; - option (x_fern_sdk_method_name_csharp) = "GetPreferences"; - } - - rpc UpdateUserPreferences(UpdateUserPreferencesRequest) returns (UserPreferences) { - option (x_fern_sdk_method_name_python) = "update_preferences"; - option (x_fern_sdk_method_name_typescript) = "updatePreferences"; - option (x_fern_sdk_method_name_go) = "UpdatePreferences"; - option (x_fern_sdk_method_name_java) = "updatePreferences"; - option (x_fern_sdk_method_name_csharp) = "UpdatePreferences"; - } -} -``` - -## Streaming method names - -For streaming methods, use appropriate naming: - -```protobuf title="streaming_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserStreamingService { - // Server streaming - rpc StreamUserEvents(StreamUserEventsRequest) returns (stream UserEvent) { - option (x_fern_sdk_method_name) = "streamEvents"; - } - - // Client streaming - rpc UploadUserData(stream UploadUserDataRequest) returns (UploadUserDataResponse) { - option (x_fern_sdk_method_name) = "upload"; - } - - // Bidirectional streaming - rpc ChatWithUser(stream ChatMessage) returns (stream ChatMessage) { - option (x_fern_sdk_method_name) = "chat"; - } - - // Real-time notifications - rpc SubscribeToNotifications(SubscribeRequest) returns (stream Notification) { - option (x_fern_sdk_method_name) = "subscribe"; - } -} -``` - -## Service-level naming - -Customize the service name for better SDK organization: - -```protobuf title="service_naming.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserManagementService { - option (x_fern_sdk_service_name) = "users"; - - rpc CreateUser(CreateUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "create"; - } - - rpc GetUser(GetUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "get"; - } -} - -service AuthenticationService { - option (x_fern_sdk_service_name) = "auth"; - - rpc LoginUser(LoginUserRequest) returns (LoginResponse) { - option (x_fern_sdk_method_name) = "login"; - } - - rpc LogoutUser(LogoutUserRequest) returns (google.protobuf.Empty) { - option (x_fern_sdk_method_name) = "logout"; - } -} -``` - -This generates cleaner SDK interfaces: - -```typescript -// Instead of client.userManagementService.createUser() -await client.users.create({ userData: {...} }); - -// Instead of client.authenticationService.loginUser() -await client.auth.login({ credentials: {...} }); -``` - -## Handling method overloading - -For services with similar methods, use descriptive names to avoid conflicts: - -```protobuf title="overloaded_methods.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Get user by ID - rpc GetUser(GetUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "get"; - } - - // Get user by email - rpc GetUserByEmail(GetUserByEmailRequest) returns (User) { - option (x_fern_sdk_method_name) = "getByEmail"; - } - - // Get user by username - rpc GetUserByUsername(GetUserByUsernameRequest) returns (User) { - option (x_fern_sdk_method_name) = "getByUsername"; - } - - // Get multiple users - rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) { - option (x_fern_sdk_method_name) = "getMany"; - } -} -``` - -## Async method naming - -For long-running operations, consider async naming: - -```protobuf title="async_methods.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Quick operation - rpc GetUser(GetUserRequest) returns (User) { - option (x_fern_sdk_method_name) = "get"; - } - - // Long-running operation - rpc GenerateUserReport(GenerateUserReportRequest) returns (Operation) { - option (x_fern_sdk_method_name) = "generateReportAsync"; - } - - // Batch operation - rpc BatchUpdateUsers(BatchUpdateUsersRequest) returns (Operation) { - option (x_fern_sdk_method_name) = "batchUpdateAsync"; - } -} -``` - -## Grouping related methods - -Use consistent naming for related operations: - -```protobuf title="grouped_methods.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - // Profile operations - rpc GetUserProfile(GetUserProfileRequest) returns (UserProfile) { - option (x_fern_sdk_method_name) = "getProfile"; - } - - rpc UpdateUserProfile(UpdateUserProfileRequest) returns (UserProfile) { - option (x_fern_sdk_method_name) = "updateProfile"; - } - - rpc DeleteUserProfile(DeleteUserProfileRequest) returns (google.protobuf.Empty) { - option (x_fern_sdk_method_name) = "deleteProfile"; - } - - // Settings operations - rpc GetUserSettings(GetUserSettingsRequest) returns (UserSettings) { - option (x_fern_sdk_method_name) = "getSettings"; - } - - rpc UpdateUserSettings(UpdateUserSettingsRequest) returns (UserSettings) { - option (x_fern_sdk_method_name) = "updateSettings"; - } -} -``` - -This ensures method names follow the conventions of each target language while maintaining clear and intuitive APIs for developers. \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/overview.md b/fern/products/api-def/grpc-pages/extensions/overview.md deleted file mode 100644 index 3ca0fbbe6..000000000 --- a/fern/products/api-def/grpc-pages/extensions/overview.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Overview of gRPC extensions -description: Learn about Fern's gRPC extensions for generating higher-quality SDKs ---- - -Fern supports a variety of gRPC extensions that enhance your API specification and generate higher-quality SDKs. - -You can apply these extensions in two ways: by overlaying them in separate override files or by embedding them directly in your gRPC specification. See [Overrides](/api-definitions/overview/overrides) for more information. - -## Available extensions - -The table below shows all available extensions and links to detailed documentation for each one. - -| Extension | Description | -| --- | --- | -| [`x-fern-ignore`](./ignoring-elements) | Skip reading specific services, methods, or messages | -| [`x-fern-examples`](./request-response-examples) | Provide additional examples for better SDK documentation | -| [`x-fern-pagination`](./pagination) | Configure pagination for methods that return lists | -| [`x-fern-retry`](./retry-behavior) | Configure retry behavior for methods | -| [`x-fern-timeout`](./timeout-settings) | Configure timeout settings for methods | -| [`x-fern-error-handling`](./error-handling) | Configure error handling for methods | -| [`x-fern-availability`](./availability) | Mark features as available in specific SDK versions | -| [`x-fern-streaming`](./streaming-operations) | Mark methods as streaming for appropriate SDK generation | -| [`x-fern-server-name`](./server-names) | Specify custom names for different server environments | -| [`x-fern-base-path`](./base-path) | Configure base paths for generated SDK clients | -| [`x-fern-sdk-group-name`](./sdk-group-names) | Group related services in the SDK | -| [`x-fern-union-naming`](./union-naming) | Configure naming for oneof fields in SDKs | -| [`x-fern-validation`](./validation) | Add validation rules for message fields | - - - If there's an extension you want that doesn't already exist, file an [issue](https://github.com/fern-api/fern/issues/new) to start a discussion about it. - \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/pagination.mdx b/fern/products/api-def/grpc-pages/extensions/pagination.mdx deleted file mode 100644 index a8a9fea20..000000000 --- a/fern/products/api-def/grpc-pages/extensions/pagination.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Pagination -description: Configure pagination for methods that return lists using `x-fern-pagination` extension ---- - -Configure pagination for methods that return lists: - -```protobuf title="pagination_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc ListUsers(ListUsersRequest) returns (ListUsersResponse) { - option (x_fern_pagination) = '{ - "cursor": "page_token", - "results": "users", - "next_cursor": "next_page_token", - "has_next_page": "has_more" - }'; - } -} - -message ListUsersRequest { - int32 page_size = 1; - string page_token = 2; - string filter = 3; -} - -message ListUsersResponse { - repeated User users = 1; - string next_page_token = 2; - bool has_more = 3; - int32 total_count = 4; -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/parameter-names.mdx b/fern/products/api-def/grpc-pages/extensions/parameter-names.mdx deleted file mode 100644 index de31f385f..000000000 --- a/fern/products/api-def/grpc-pages/extensions/parameter-names.mdx +++ /dev/null @@ -1,302 +0,0 @@ ---- -title: Parameter Names -subtitle: Use `x-fern-parameter-name` to customize SDK parameter names for gRPC message fields ---- - -By default, Fern uses the field names from your Protocol Buffer message definitions as SDK parameter names. You can customize these using the `x-fern-parameter-name` extension. - -## Customize field names - -Use `x-fern-parameter-name` to specify custom parameter names for message fields: - -```protobuf title="user_service.proto" -syntax = "proto3"; - -package userservice.v1; - -message CreateUserRequest { - string email_address = 1 [(x_fern_parameter_name) = "email"]; - string full_name = 2 [(x_fern_parameter_name) = "name"]; - int32 age_in_years = 3 [(x_fern_parameter_name) = "age"]; - string phone_number = 4 [(x_fern_parameter_name) = "phone"]; - UserPreferences user_preferences = 5 [(x_fern_parameter_name) = "preferences"]; -} - -message User { - string user_id = 1 [(x_fern_parameter_name) = "id"]; - string email_address = 2 [(x_fern_parameter_name) = "email"]; - string full_name = 3 [(x_fern_parameter_name) = "name"]; - google.protobuf.Timestamp created_timestamp = 4 [(x_fern_parameter_name) = "createdAt"]; - google.protobuf.Timestamp updated_timestamp = 5 [(x_fern_parameter_name) = "updatedAt"]; -} -``` - -This generates SDK methods with cleaner parameter names: - -```typescript -// Instead of email_address, full_name, age_in_years, phone_number, user_preferences -await client.users.create({ - email: "john@example.com", - name: "John Doe", - age: 30, - phone: "+1-555-0123", - preferences: { theme: "dark" } -}); -``` - -## Language-specific parameter names - -You can specify different parameter names for different programming languages: - -```protobuf title="language_specific.proto" -syntax = "proto3"; - -package userservice.v1; - -message SearchUsersRequest { - string search_query = 1 [ - (x_fern_parameter_name_python) = "search_query", - (x_fern_parameter_name_typescript) = "searchQuery", - (x_fern_parameter_name_go) = "SearchQuery", - (x_fern_parameter_name_java) = "searchQuery", - (x_fern_parameter_name_csharp) = "SearchQuery" - ]; - - int32 page_size = 2 [ - (x_fern_parameter_name_python) = "page_size", - (x_fern_parameter_name_typescript) = "pageSize", - (x_fern_parameter_name_go) = "PageSize", - (x_fern_parameter_name_java) = "pageSize", - (x_fern_parameter_name_csharp) = "PageSize" - ]; - - string page_token = 3 [ - (x_fern_parameter_name_python) = "page_token", - (x_fern_parameter_name_typescript) = "pageToken", - (x_fern_parameter_name_go) = "PageToken", - (x_fern_parameter_name_java) = "pageToken", - (x_fern_parameter_name_csharp) = "PageToken" - ]; -} -``` - -## Nested message naming - -Customize parameter names for nested message fields: - -```protobuf title="nested_messages.proto" -syntax = "proto3"; - -package userservice.v1; - -message CreateUserRequest { - UserProfile user_profile = 1 [(x_fern_parameter_name) = "profile"]; - ContactInfo contact_info = 2 [(x_fern_parameter_name) = "contact"]; - AccountSettings account_settings = 3 [(x_fern_parameter_name) = "settings"]; -} - -message UserProfile { - string first_name = 1 [(x_fern_parameter_name) = "firstName"]; - string last_name = 2 [(x_fern_parameter_name) = "lastName"]; - string display_name = 3 [(x_fern_parameter_name) = "displayName"]; - string bio_text = 4 [(x_fern_parameter_name) = "bio"]; - string avatar_url = 5 [(x_fern_parameter_name) = "avatarUrl"]; -} - -message ContactInfo { - string email_address = 1 [(x_fern_parameter_name) = "email"]; - string phone_number = 2 [(x_fern_parameter_name) = "phone"]; - Address mailing_address = 3 [(x_fern_parameter_name) = "address"]; -} - -message Address { - string street_address = 1 [(x_fern_parameter_name) = "street"]; - string city_name = 2 [(x_fern_parameter_name) = "city"]; - string state_province = 3 [(x_fern_parameter_name) = "state"]; - string postal_code = 4 [(x_fern_parameter_name) = "zipCode"]; - string country_code = 5 [(x_fern_parameter_name) = "country"]; -} -``` - -## Repeated field naming - -Handle repeated fields with custom naming: - -```protobuf title="repeated_fields.proto" -syntax = "proto3"; - -package userservice.v1; - -message User { - string user_id = 1 [(x_fern_parameter_name) = "id"]; - repeated string role_names = 2 [(x_fern_parameter_name) = "roles"]; - repeated string permission_codes = 3 [(x_fern_parameter_name) = "permissions"]; - repeated SocialAccount social_accounts = 4 [(x_fern_parameter_name) = "socialAccounts"]; - repeated string tag_list = 5 [(x_fern_parameter_name) = "tags"]; -} - -message SocialAccount { - string platform_name = 1 [(x_fern_parameter_name) = "platform"]; - string account_handle = 2 [(x_fern_parameter_name) = "handle"]; - string profile_url = 3 [(x_fern_parameter_name) = "url"]; - bool is_verified = 4 [(x_fern_parameter_name) = "verified"]; -} - -message BatchCreateUsersRequest { - repeated CreateUserRequest user_requests = 1 [(x_fern_parameter_name) = "users"]; - bool send_welcome_email = 2 [(x_fern_parameter_name) = "sendWelcomeEmail"]; - bool skip_validation = 3 [(x_fern_parameter_name) = "skipValidation"]; -} -``` - -## Map field naming - -Customize names for map fields: - -```protobuf title="map_fields.proto" -syntax = "proto3"; - -package userservice.v1; - -message UserPreferences { - map notification_settings = 1 [(x_fern_parameter_name) = "notifications"]; - map feature_flags = 2 [(x_fern_parameter_name) = "features"]; - map display_settings = 3 [(x_fern_parameter_name) = "display"]; - map theme_overrides = 4 [(x_fern_parameter_name) = "themes"]; -} - -message MetricsData { - map performance_metrics = 1 [(x_fern_parameter_name) = "performance"]; - map usage_counters = 2 [(x_fern_parameter_name) = "usage"]; - map event_timestamps = 3 [(x_fern_parameter_name) = "events"]; -} -``` - -## Optional and required field naming - -Customize names for optional and required fields: - -```protobuf title="optional_fields.proto" -syntax = "proto3"; - -package userservice.v1; - -message UpdateUserRequest { - // Required fields - string user_id = 1 [(x_fern_parameter_name) = "id"]; - - // Optional fields with custom names - optional string email_address = 2 [(x_fern_parameter_name) = "email"]; - optional string full_name = 3 [(x_fern_parameter_name) = "name"]; - optional int32 age_in_years = 4 [(x_fern_parameter_name) = "age"]; - optional string profile_picture_url = 5 [(x_fern_parameter_name) = "avatarUrl"]; - - // Field mask for partial updates - google.protobuf.FieldMask update_mask = 6 [(x_fern_parameter_name) = "updateMask"]; -} -``` - -## Oneof field naming - -Handle oneof fields with meaningful names: - -```protobuf title="oneof_fields.proto" -syntax = "proto3"; - -package userservice.v1; - -message SearchRequest { - oneof search_criteria { - string search_by_email = 1 [(x_fern_parameter_name) = "email"]; - string search_by_username = 2 [(x_fern_parameter_name) = "username"]; - string search_by_phone = 3 [(x_fern_parameter_name) = "phone"]; - UserIdSearch search_by_id = 4 [(x_fern_parameter_name) = "id"]; - } - - SearchOptions search_options = 5 [(x_fern_parameter_name) = "options"]; -} - -message UserIdSearch { - string user_id = 1 [(x_fern_parameter_name) = "id"]; - bool include_deleted = 2 [(x_fern_parameter_name) = "includeDeleted"]; -} - -message NotificationRequest { - oneof notification_target { - string target_user_id = 1 [(x_fern_parameter_name) = "userId"]; - string target_group_id = 2 [(x_fern_parameter_name) = "groupId"]; - BroadcastTarget target_broadcast = 3 [(x_fern_parameter_name) = "broadcast"]; - } - - string message_content = 4 [(x_fern_parameter_name) = "message"]; - NotificationPriority priority_level = 5 [(x_fern_parameter_name) = "priority"]; -} -``` - -## Timestamp and duration naming - -Customize names for time-related fields: - -```protobuf title="time_fields.proto" -syntax = "proto3"; - -package userservice.v1; - -message UserSession { - string session_id = 1 [(x_fern_parameter_name) = "id"]; - string user_id = 2 [(x_fern_parameter_name) = "userId"]; - google.protobuf.Timestamp created_timestamp = 3 [(x_fern_parameter_name) = "createdAt"]; - google.protobuf.Timestamp last_accessed_timestamp = 4 [(x_fern_parameter_name) = "lastAccessedAt"]; - google.protobuf.Timestamp expires_timestamp = 5 [(x_fern_parameter_name) = "expiresAt"]; - google.protobuf.Duration session_duration = 6 [(x_fern_parameter_name) = "duration"]; - google.protobuf.Duration idle_timeout = 7 [(x_fern_parameter_name) = "idleTimeout"]; -} - -message ScheduledTask { - string task_id = 1 [(x_fern_parameter_name) = "id"]; - google.protobuf.Timestamp scheduled_time = 2 [(x_fern_parameter_name) = "scheduledAt"]; - google.protobuf.Duration execution_timeout = 3 [(x_fern_parameter_name) = "timeout"]; - google.protobuf.Duration retry_delay = 4 [(x_fern_parameter_name) = "retryDelay"]; -} -``` - -## Complex nested naming - -Handle complex nested structures: - -```protobuf title="complex_nested.proto" -syntax = "proto3"; - -package userservice.v1; - -message CreateOrderRequest { - OrderDetails order_details = 1 [(x_fern_parameter_name) = "order"]; - PaymentInfo payment_info = 2 [(x_fern_parameter_name) = "payment"]; - ShippingInfo shipping_info = 3 [(x_fern_parameter_name) = "shipping"]; -} - -message OrderDetails { - repeated OrderItem order_items = 1 [(x_fern_parameter_name) = "items"]; - string promo_code = 2 [(x_fern_parameter_name) = "promoCode"]; - string special_instructions = 3 [(x_fern_parameter_name) = "instructions"]; -} - -message OrderItem { - string product_id = 1 [(x_fern_parameter_name) = "productId"]; - int32 quantity_ordered = 2 [(x_fern_parameter_name) = "quantity"]; - double unit_price = 3 [(x_fern_parameter_name) = "price"]; - repeated string product_options = 4 [(x_fern_parameter_name) = "options"]; -} - -message PaymentInfo { - oneof payment_method { - CreditCardInfo credit_card_info = 1 [(x_fern_parameter_name) = "creditCard"]; - PayPalInfo paypal_info = 2 [(x_fern_parameter_name) = "paypal"]; - BankTransferInfo bank_transfer_info = 3 [(x_fern_parameter_name) = "bankTransfer"]; - } - - BillingAddress billing_address = 4 [(x_fern_parameter_name) = "billingAddress"]; -} -``` - -Using custom parameter names ensures consistent naming conventions across your SDK while maintaining compatibility with your existing Protocol Buffer schemas. \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/retry.mdx b/fern/products/api-def/grpc-pages/extensions/retry.mdx deleted file mode 100644 index 86a54cca5..000000000 --- a/fern/products/api-def/grpc-pages/extensions/retry.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Retry behavior -description: Configure retry behavior for methods using `x-fern-retry` extension ---- - -Configure retry behavior for methods: - -```protobuf title="retry_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc ProcessPayment(ProcessPaymentRequest) returns (PaymentResult) { - option (x_fern_retry) = '{ - "max_attempts": 3, - "exponential_backoff": true, - "initial_delay_ms": 1000, - "max_delay_ms": 30000, - "retry_on_status": ["UNAVAILABLE", "DEADLINE_EXCEEDED", "INTERNAL"] - }'; - } - - rpc UploadFile(UploadFileRequest) returns (UploadFileResponse) { - option (x_fern_retry) = '{ - "max_attempts": 5, - "exponential_backoff": true, - "initial_delay_ms": 2000, - "max_delay_ms": 60000 - }'; - } -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/sdk-group-name.mdx b/fern/products/api-def/grpc-pages/extensions/sdk-group-name.mdx deleted file mode 100644 index 1b6a0c6b7..000000000 --- a/fern/products/api-def/grpc-pages/extensions/sdk-group-name.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: SDK group names -description: Group related services in the SDK using `x-fern-sdk-group-name` extension ---- - -Group related services in the SDK: - -```protobuf title="grouped_services.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - option (x_fern_sdk_group_name) = "users"; - - rpc CreateUser(CreateUserRequest) returns (User); - rpc GetUser(GetUserRequest) returns (User); -} - -service UserProfileService { - option (x_fern_sdk_group_name) = "users"; - - rpc GetProfile(GetProfileRequest) returns (UserProfile); - rpc UpdateProfile(UpdateProfileRequest) returns (UserProfile); -} - -service AuthService { - option (x_fern_sdk_group_name) = "auth"; - - rpc Login(LoginRequest) returns (LoginResponse); - rpc Logout(LogoutRequest) returns (google.protobuf.Empty); -} -``` - -This generates SDKs with grouped services: - -```typescript -client.users.createUser(...) -client.users.getUser(...) -client.users.getProfile(...) -client.users.updateProfile(...) -client.auth.login(...) -client.auth.logout(...) -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/server-name.mdx b/fern/products/api-def/grpc-pages/extensions/server-name.mdx deleted file mode 100644 index 5adb06d9f..000000000 --- a/fern/products/api-def/grpc-pages/extensions/server-name.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Server names -description: Specify custom names for different server environments using `x-fern-server-name` extension ---- - -Specify custom names for different server environments: - -```protobuf title="server_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - option (x_fern_server_name_production) = "Production"; - option (x_fern_server_name_staging) = "Staging"; - option (x_fern_server_name_development) = "Development"; - - rpc GetUser(GetUserRequest) returns (User); -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/streaming.mdx b/fern/products/api-def/grpc-pages/extensions/streaming.mdx deleted file mode 100644 index bad97eb51..000000000 --- a/fern/products/api-def/grpc-pages/extensions/streaming.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Streaming operations -description: Mark methods as streaming for appropriate SDK generation using `x-fern-streaming` extension ---- - -Mark methods as streaming for appropriate SDK generation: - -```protobuf title="streaming_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc StreamEvents(StreamEventsRequest) returns (stream Event) { - option (x_fern_streaming) = '{ - "type": "server_streaming", - "termination": "client_closes" - }'; - } - - rpc UploadData(stream UploadDataRequest) returns (UploadResult) { - option (x_fern_streaming) = '{ - "type": "client_streaming", - "termination": "client_closes" - }'; - } - - rpc Chat(stream ChatMessage) returns (stream ChatMessage) { - option (x_fern_streaming) = '{ - "type": "bidirectional_streaming", - "termination": "either_closes" - }'; - } -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/timeout.mdx b/fern/products/api-def/grpc-pages/extensions/timeout.mdx deleted file mode 100644 index f028b9475..000000000 --- a/fern/products/api-def/grpc-pages/extensions/timeout.mdx +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Timeout settings -description: Configure timeout settings for methods using `x-fern-timeout` extension ---- - -Configure timeout settings for methods: - -```protobuf title="timeout_service.proto" -syntax = "proto3"; - -package userservice.v1; - -service UserService { - rpc GenerateReport(GenerateReportRequest) returns (ReportResult) { - option (x_fern_timeout) = '{ - "seconds": 300, - "description": "Report generation can take up to 5 minutes" - }'; - } - - rpc QuickUserLookup(UserLookupRequest) returns (User) { - option (x_fern_timeout) = '{ - "seconds": 5, - "description": "Quick lookup should complete within 5 seconds" - }'; - } -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/union-naming.mdx b/fern/products/api-def/grpc-pages/extensions/union-naming.mdx deleted file mode 100644 index 49fe4a783..000000000 --- a/fern/products/api-def/grpc-pages/extensions/union-naming.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Union naming -description: Configure naming for oneof fields in SDKs using `x-fern-union-naming` extension ---- - -Configure naming for oneof fields in SDKs: - -```protobuf title="union_naming.proto" -syntax = "proto3"; - -package userservice.v1; - -message NotificationTarget { - oneof target { - option (x_fern_union_naming) = "discriminated"; - - string user_id = 1 [(x_fern_parameter_name) = "userId"]; - string group_id = 2 [(x_fern_parameter_name) = "groupId"]; - BroadcastTarget broadcast = 3; - } -} -``` \ No newline at end of file diff --git a/fern/products/api-def/grpc-pages/extensions/validation.mdx b/fern/products/api-def/grpc-pages/extensions/validation.mdx deleted file mode 100644 index 2cd41b20d..000000000 --- a/fern/products/api-def/grpc-pages/extensions/validation.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Validation -description: Add validation rules for message fields using `x-fern-validation` extension ---- - -Add validation rules for message fields: - -```protobuf title="validation_service.proto" -syntax = "proto3"; - -package userservice.v1; - -message CreateUserRequest { - string email = 1 [ - (x_fern_validation) = '{ - "format": "email", - "required": true - }' - ]; - - string name = 2 [ - (x_fern_validation) = '{ - "min_length": 1, - "max_length": 100, - "required": true - }' - ]; - - int32 age = 3 [ - (x_fern_validation) = '{ - "minimum": 0, - "maximum": 120 - }' - ]; -} -``` \ No newline at end of file diff --git a/fern/products/api-def/pages/overrides.mdx b/fern/products/api-def/pages/overrides.mdx index 5b4bfd19d..b1b03a590 100644 --- a/fern/products/api-def/pages/overrides.mdx +++ b/fern/products/api-def/pages/overrides.mdx @@ -3,12 +3,12 @@ title: Overrides description: Customize your API definition using a separate overrides file. --- -Use an overrides file to customize your OpenAPI, AsyncAPI, OpenRPC, or gRPC definition without modifying the original spec. This is useful when: +Use an overrides file to customize your OpenAPI, AsyncAPI, or OpenRPC definition without modifying the original spec. This is useful when: * Your API specification is auto-generated from server code * You need different configurations for SDKs versus documentation -Overrides are available for OpenAPI, AsyncAPI, OpenRPC, and gRPC specifications. They are not needed for [Fern Definition](/api-definitions/ferndef/overview) since you can directly edit those files. +Overrides are available for OpenAPI, AsyncAPI, and OpenRPC specifications. They are not needed for [Fern Definition](/api-definitions/ferndef/overview) since you can directly edit those files. While you can also embed [Fern extensions](/api-definitions/overview/overrides#definition-specific-extensions) directly in your API specification, using overrides files is the recommended approach as it keeps your original spec clean and separates concerns. @@ -35,7 +35,7 @@ fern/ -For OpenAPI, AsyncAPI, and OpenRPC, and gRPC, you can use [Fern's extensions](/api-definitions/overview/overrides#definition-specific-extensions) to apply customizations. +For OpenAPI, AsyncAPI, and OpenRPC, you can use [Fern's extensions](/api-definitions/overview/overrides#definition-specific-extensions) to apply customizations. ```yml title="overrides.yml" {4-5} paths: @@ -174,6 +174,4 @@ Learn more about the Fern extensions you can use to customize your definition: - -