feat: Cloudformation + RDS

This commit is contained in:
Zakaria
2026-09-30 17:43:42 -04:00
parent 548a15d7ec
commit 7764ea0dc1
411 changed files with 10182 additions and 1063 deletions
+46
View File
@@ -0,0 +1,46 @@
import type {CloudResource} from '@/types/resource'
export interface DynamoKeyField {
name: string
type?: 'S' | 'N' | 'B'
}
export function dynamoKeyFields(resource?: CloudResource): DynamoKeyField[] {
const keySchema = Array.isArray(resource?.metadata.keySchema) ? resource.metadata.keySchema : []
const definitions = Array.isArray(resource?.metadata.attributeDefinitions) ? resource.metadata.attributeDefinitions : []
const types = new Map(definitions.flatMap((definition) => {
if (!definition || typeof definition !== 'object') return []
const {AttributeName, AttributeType} = definition as {AttributeName?: unknown; AttributeType?: unknown}
return typeof AttributeName === 'string' && isDynamoKeyType(AttributeType) ? [[AttributeName, AttributeType] as const] : []
}))
return keySchema.flatMap((key) => {
if (!key || typeof key !== 'object') return []
const name = (key as {AttributeName?: unknown}).AttributeName
return typeof name === 'string' ? [{name, type: types.get(name)}] : []
})
}
export function documentToAttributeValues(document: Record<string, unknown>, keyFields: DynamoKeyField[] = []): Record<string, unknown> {
return Object.fromEntries(Object.entries(document).map(([name, value]) => {
const keyType = keyFields.find((key) => key.name === name)?.type
if (keyType === 'N') return [name, {N: String(value)}]
if (keyType === 'B') return [name, {B: String(value)}]
if (keyType === 'S') return [name, {S: String(value)}]
return [name, valueToAttributeValue(value)]
}))
}
function isDynamoKeyType(value: unknown): value is 'S' | 'N' | 'B' {
return value === 'S' || value === 'N' || value === 'B'
}
function valueToAttributeValue(value: unknown): Record<string, unknown> {
if (value === null) return {NULL: true}
if (typeof value === 'string') return {S: value}
if (typeof value === 'number') return {N: String(value)}
if (typeof value === 'boolean') return {BOOL: value}
if (Array.isArray(value)) return {L: value.map(valueToAttributeValue)}
if (typeof value === 'object') return {M: documentToAttributeValues(value as Record<string, unknown>)}
return {S: String(value)}
}