import type {CapabilitySchema, HttpApiActionName, ResourceActionName, ServiceSchema} from './types' const resourceActions: CapabilitySchema[] = [ {name: 'list', label: 'List APIs', enabled: true, status: 'available', runtimeRequired: true}, {name: 'create', label: 'Create API', enabled: true, status: 'available', runtimeRequired: true}, {name: 'delete', label: 'Delete API', enabled: true, status: 'available', runtimeRequired: true}, {name: 'inspect', label: 'Inspect API', enabled: true, status: 'available', runtimeRequired: false}, ] const httpApiActions: CapabilitySchema[] = [ {name: 'describe', label: 'Show routes, stages and authorizers', enabled: true, status: 'available', runtimeRequired: true}, {name: 'createRoute', label: 'Add a route', enabled: true, status: 'available', runtimeRequired: true}, {name: 'deleteRoute', label: 'Delete a route', enabled: true, status: 'available', runtimeRequired: true}, {name: 'setRouteAuthorizer', label: 'Protect a route with an authorizer', enabled: true, status: 'available', runtimeRequired: true}, {name: 'createStage', label: 'Add a stage', enabled: true, status: 'available', runtimeRequired: true}, {name: 'deleteStage', label: 'Delete a stage', enabled: true, status: 'available', runtimeRequired: true}, {name: 'deploy', label: 'Deploy to a stage', enabled: true, status: 'available', runtimeRequired: true}, {name: 'createAuthorizer', label: 'Add a JWT authorizer', enabled: true, status: 'available', runtimeRequired: true}, {name: 'deleteAuthorizer', label: 'Delete an authorizer', enabled: true, status: 'available', runtimeRequired: true}, {name: 'updateCors', label: 'Configure CORS', enabled: true, status: 'available', runtimeRequired: true}, {name: 'sendRequest', label: 'Send a request to a stage', enabled: true, status: 'available', runtimeRequired: true}, {name: 'testWebSocket', label: 'Connect and send a WebSocket message', enabled: true, status: 'available', runtimeRequired: true}, ] const httpOnly = {field: 'protocol', values: ['HTTP']} const webSocketOnly = {field: 'protocol', values: ['WEBSOCKET']} export function awsApiGatewaySchema(): ServiceSchema { return { cloud: 'aws', service: 'apigateway', displayName: 'AWS API Gateway', fields: [ { name: 'protocol', label: 'API type', type: 'select', required: true, defaultValue: 'REST', options: [ {label: 'REST API (resources, methods and stages)', value: 'REST'}, {label: 'HTTP API (routes to Lambda or HTTP backends, JWT authorizers)', value: 'HTTP'}, {label: 'WebSocket API (two-way messages routed to Lambda)', value: 'WEBSOCKET'}, ], }, { name: 'name', label: 'API Name', type: 'text', required: true, description: '1-1024 characters.', validation: { minLength: 1, maxLength: 1024, message: 'API name is required and must be 1-1024 characters.', }, }, { name: 'description', label: 'Description', type: 'text', required: false, description: 'Optional description for the API.', validation: { maxLength: 1024, message: 'Description must be 1024 characters or fewer.', }, }, { name: 'functionName', label: 'Lambda function', type: 'text', required: false, visibleWhen: httpOnly, description: 'Optional. Sends every request to this function through a catch-all route, on a $default stage that deploys automatically. Leave empty to add routes yourself.', }, { name: 'routeSelectionExpression', label: 'Route selection expression', type: 'text', required: false, defaultValue: '$request.body.action', visibleWhen: webSocketOnly, description: 'Which field of each message picks its route. With $request.body.action, {"action": "sendMessage"} goes to the sendMessage route.', }, { name: 'stageName', label: 'Stage', type: 'text', required: false, defaultValue: 'dev', visibleWhen: webSocketOnly, description: 'Created with automatic deployment, so route changes go live right away.', validation: {pattern: '^[A-Za-z0-9_-]{1,128}$', message: 'Use letters, numbers, hyphens and underscores'}, }, ], actions: ['list', 'create', 'delete', 'inspect'], capabilities: {resourceActions, httpApiActions}, filters: [{name: 'search', label: 'Search', type: 'text', required: false}], columns: [ {name: 'name', label: 'API Name'}, {name: 'protocol', label: 'Type', path: 'metadata.protocol', format: 'badge'}, {name: 'createdAt', label: 'Created At', format: 'relative'}, ], } }