{
  "version": 3,
  "sources": ["../../src/plugin.ts"],
  "sourcesContent": ["import assert from 'assert';\nimport {readFile, mkdir, writeFile} from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type {PluginFunction} from '@graphql-codegen/plugin-helpers';\nimport yml from 'js-yaml';\nimport {CLOUDFORMATION_SCHEMA} from 'js-yaml-cloudformation-schema';\n\nimport {parse} from '@code-like-a-carpenter/foundation-parser';\nimport {makePlugin} from '@code-like-a-carpenter/graphql-codegen-helpers';\n\nimport {defineEnricher, defineReactor, defineTableCdc} from './cdc/index.ts';\nimport {defineReducer} from './cdc/reducer.ts';\nimport type {Config} from './config.ts';\nimport {ConfigSchema} from './config.ts';\nimport {combineFragments} from './fragments/combine-fragments.ts';\nimport {defineTable} from './table.ts';\nimport {applyTransforms} from './transforms.ts';\nimport type {ServerlessApplicationModel} from './types.ts';\n\nexport {schema as addToSchema} from '@code-like-a-carpenter/foundation-intermediate-representation';\n\n/**\n * Loads an existing consumer-generated CF template or returns a basic template\n */\nasync function getInitialTemplate({\n  sourceTemplate,\n}: Config): Promise<ServerlessApplicationModel> {\n  if (sourceTemplate) {\n    const raw = await readFile(sourceTemplate, 'utf8');\n    try {\n      return JSON.parse(raw);\n    } catch {\n      return yml.load(raw, {\n        schema: CLOUDFORMATION_SCHEMA,\n      }) as ServerlessApplicationModel;\n    }\n  }\n\n  return {\n    AWSTemplateFormatVersion: '2010-09-09',\n    Resources: {},\n    Transform: 'AWS::Serverless-2016-10-31',\n  };\n}\n\n/** @override */\nexport const plugin: PluginFunction<Config> = makePlugin(\n  ConfigSchema,\n  async (schema, documents, config, info) => {\n    const outputFile = info?.outputFile;\n    assert(outputFile, 'outputFile is required');\n\n    const ir = parse(schema, documents, config, info);\n    const {models, tables} = ir;\n\n    const stacks = new Map<string, ServerlessApplicationModel>();\n\n    const allResources = combineFragments(\n      ...tables.map((table) => {\n        if (table.hasCdc) {\n          const {fragment, stack} = defineTableCdc(table, config);\n          stacks.set('dispatcher.yml', stack);\n          return combineFragments(fragment, defineTable(table));\n        }\n        return defineTable(table);\n      }),\n      ...models.flatMap((model) =>\n        model.changeDataCaptureConfig.map((cdc) => {\n          const {type} = cdc;\n          if (type === 'ENRICHER') {\n            const {fragment, stack} = defineEnricher(config, model, cdc);\n            stacks.set(cdc.nestedStackLocation, stack);\n            return fragment;\n          } else if (type === 'REACTOR') {\n            const {fragment, stack} = defineReactor(config, model, cdc);\n            stacks.set(cdc.nestedStackLocation, stack);\n            return fragment;\n          } else if (type === 'REDUCER') {\n            const {fragment, stack} = defineReducer(config, model, cdc);\n            stacks.set(cdc.nestedStackLocation, stack);\n            return fragment;\n          }\n          throw new Error(`Unexpected CDC type ${type}`);\n        })\n      )\n    );\n\n    const initialTemplate = await getInitialTemplate(config);\n\n    const tpl: ServerlessApplicationModel = combineFragments(\n      initialTemplate,\n      allResources,\n      {\n        Globals: {\n          Function: {\n            Handler: 'index.handler',\n            MemorySize: 256,\n            Runtime: 'nodejs22.x',\n            Timeout: 30,\n            Tracing: 'Active',\n          },\n        },\n        Parameters: {\n          StageName: {\n            AllowedValues: ['development', 'production', 'test'],\n            Default: 'development',\n            Description: 'The name of the stage',\n            Type: 'String',\n          },\n        },\n        Resources: {},\n        // Transform: 'AWS::LanguageExtensions',\n      }\n    );\n\n    await applyTransforms(config, ir, tpl, stacks);\n\n    const outDir = path.dirname(outputFile);\n    for (const [filename, stack] of stacks) {\n      await writeNestedTemplate(config, path.join(outDir, filename), stack);\n    }\n\n    return formatTemplate(config, tpl);\n  }\n);\n\nfunction formatTemplate(config: Config, tpl: ServerlessApplicationModel) {\n  const {format} = config.outputConfig;\n  if (format === 'json') {\n    return JSON.stringify(tpl, null, 2);\n  }\n\n  return yml.dump(tpl, config.outputConfig.yamlConfig);\n}\n\nasync function writeNestedTemplate(\n  config: Config,\n  outputFile: string,\n  tpl: ServerlessApplicationModel\n) {\n  await mkdir(path.dirname(outputFile), {recursive: true});\n  await writeFile(outputFile, formatTemplate(config, tpl));\n}\n"],
  "mappings": "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",
  "names": ["schema"]
}
