Files
floci-ui/packages/api/src/cloud-spi/cloudformationSchema.ts
T
2026-09-30 17:43:42 -04:00

62 lines
2.6 KiB
TypeScript

import type {CapabilitySchema, CloudProvider, FieldSchema, ResourceActionName, ServiceSchema, TableColumnSchema} from './types'
const cloudformationColumns: TableColumnSchema[] = [
{name: 'name', label: 'Stack Name'},
{name: 'status', label: 'Status', format: 'badge'},
{name: 'createdAt', label: 'Created At', format: 'datetime'},
]
const cloudformationFilters: FieldSchema[] = [
{name: 'search', label: 'Search', type: 'text', required: false},
]
const cloudformationResourceActions: CapabilitySchema<ResourceActionName>[] = [
{name: 'list', label: 'List stacks', enabled: true, status: 'available', runtimeRequired: true},
{name: 'create', label: 'Create stack', enabled: true, status: 'available', runtimeRequired: true},
{name: 'update', label: 'Update stack', enabled: true, status: 'available', runtimeRequired: true},
{name: 'delete', label: 'Delete stack', enabled: true, status: 'available', runtimeRequired: true},
{name: 'inspect', label: 'Inspect stack', enabled: true, status: 'available', runtimeRequired: false},
]
export function awsCloudformationSchema(): ServiceSchema {
return {
cloud: 'aws',
service: 'iac',
displayName: 'CloudFormation',
fields: [
{
name: 'stackName',
label: 'Stack Name',
type: 'text',
required: true,
description: 'Must start with a letter. Letters, numbers, and hyphens, up to 128 characters.',
validation: {
pattern: '^[a-zA-Z][a-zA-Z0-9\\-]{0,127}$',
maxLength: 128,
message: 'Use a valid stack name: start with a letter, then letters, numbers, or hyphens.',
},
},
{
name: 'templateBody',
label: 'Template Body',
type: 'textarea',
required: true,
span: true,
description: 'CloudFormation JSON or YAML template.',
},
],
actions: ['list', 'create', 'update', 'delete', 'inspect'],
capabilities: {
resourceActions: cloudformationResourceActions,
},
filters: cloudformationFilters,
columns: cloudformationColumns,
updateFields: [{name: 'templateBody', label: 'Template Body', type: 'textarea', required: true, span: true, valuePath: 'metadata.templateBody'}],
}
}
export function cloudformationSchemaFor(cloud: CloudProvider): ServiceSchema | null {
if (cloud === 'aws') return awsCloudformationSchema()
return null
}