feat: Cloudformation + RDS
This commit is contained in:
@@ -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)}
|
||||
}
|
||||
Reference in New Issue
Block a user