-
Notifications
You must be signed in to change notification settings - Fork 14
/
cloudformation.ts
51 lines (46 loc) · 1.86 KB
/
cloudformation.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* eslint-disable @typescript-eslint/no-var-requires */
import { readdir } from 'fs/promises'
import * as _ from 'lodash'
import { join } from 'path'
import { Table } from '../table'
import type { MigrateTablesInput } from './migrate'
export default async function createCloudFormationResources(input: MigrateTablesInput): Promise<any> {
const tableFiles = await readdir(input.tablesDirectory)
const tables: Array<typeof Table> = []
const resources: any = {}
const log = input.log == null ? console.log : input.log
const prefix = input.tableNamePrefix == null ? '' : input.tableNamePrefix
const suffix = input.tableNameSuffix == null ? '' : input.tableNameSuffix
log('Running Dyngoose CloudFormation template generation utility…')
for (const file of tableFiles) {
if (file.endsWith(input.tableFileSuffix)) {
const tableFile = join(input.tablesDirectory, file)
const tableFileExports = require(tableFile)
for (const exportedProperty of _.values(tableFileExports)) {
if (exportedProperty.prototype instanceof Table) {
tables.push(exportedProperty)
}
}
}
}
for (const SomeTable of tables) {
const properties = SomeTable.schema.createCloudFormationResource()
const tableName = properties.TableName as string
let resourceName: string
if (typeof SomeTable.schema.options.cloudFormationResourceName === 'string') {
resourceName = SomeTable.schema.options.cloudFormationResourceName
} else {
resourceName = _.upperFirst(SomeTable.name)
if (!resourceName.toLowerCase().endsWith('table')) {
resourceName += 'Table'
}
}
properties.TableName = `${prefix}${tableName}${suffix}`
log(`Generated ${tableName} into ${resourceName} resource`)
resources[resourceName] = {
Type: 'AWS::DynamoDB::Table',
Properties: properties,
}
}
return resources
}