@aws/nx-plugin 1.0.0-rc.33 → 1.0.0-rc.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE-THIRD-PARTY +28 -41
  2. package/generators.json +27 -0
  3. package/package.json +6 -6
  4. package/src/connection/generator.js +12 -1
  5. package/src/connection/generator.js.map +1 -1
  6. package/src/connection/supported-connections.d.ts +10 -1
  7. package/src/connection/supported-connections.js +13 -0
  8. package/src/connection/supported-connections.js.map +1 -1
  9. package/src/infra/app/__snapshots__/generator.spec.ts.snap +6 -6
  10. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +12 -12
  11. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +74 -10
  12. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +22 -4
  13. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +53 -8
  14. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +32 -4
  15. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  16. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +86 -11
  17. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +21 -3
  18. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +2 -2
  19. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +6 -6
  20. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +2 -2
  21. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  22. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +4 -4
  23. package/src/open-api/ts-client/files/client.gen.ts.template +195 -12
  24. package/src/open-api/ts-client/files/types.gen.ts.template +2 -0
  25. package/src/open-api/ts-client/generator.js +22 -1
  26. package/src/open-api/ts-client/generator.js.map +1 -1
  27. package/src/open-api/utils/codegen-data/languages.js +6 -0
  28. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  29. package/src/open-api/utils/codegen-data/types.d.ts +16 -1
  30. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  31. package/src/open-api/utils/codegen-data.js +71 -0
  32. package/src/open-api/utils/codegen-data.js.map +1 -1
  33. package/src/open-api/utils/normalise.js +53 -8
  34. package/src/open-api/utils/normalise.js.map +1 -1
  35. package/src/open-api/utils/parser.js +48 -15
  36. package/src/open-api/utils/parser.js.map +1 -1
  37. package/src/preset/__snapshots__/generator.spec.ts.snap +4 -2
  38. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +1 -1
  39. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2038 -0
  40. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +104 -0
  41. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  42. package/src/py/rdb/agent-connection/generator.js +46 -0
  43. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  44. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  45. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  46. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  47. package/src/py/rdb/agent-connection/schema.json +27 -0
  48. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +44 -0
  49. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  50. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  51. package/src/py/rdb/fast-api-connection/generator.js +54 -0
  52. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  53. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  54. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  55. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  56. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  57. package/src/py/rdb/files/Dockerfile.create-db-user.template +10 -0
  58. package/src/py/rdb/files/Dockerfile.migration.template +10 -0
  59. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  60. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  61. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  62. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  63. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  64. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  65. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  66. package/src/py/rdb/files/alembic.ini.template +38 -0
  67. package/src/py/rdb/files/config.json.template +14 -0
  68. package/src/py/rdb/files/migrations/env.py.template +80 -0
  69. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  70. package/src/py/rdb/generator.d.ts +6 -0
  71. package/src/py/rdb/generator.js +263 -0
  72. package/src/py/rdb/generator.js.map +1 -0
  73. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +101 -0
  74. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  75. package/src/py/rdb/mcp-server-connection/generator.js +46 -0
  76. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  77. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  78. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  79. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  80. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  81. package/src/py/rdb/schema.d.js +6 -0
  82. package/src/py/rdb/schema.d.js.map +1 -0
  83. package/src/py/rdb/schema.d.ts +16 -0
  84. package/src/py/rdb/schema.json +77 -0
  85. package/src/py/rdb/utils.d.ts +6 -0
  86. package/src/py/rdb/utils.js +16 -0
  87. package/src/py/rdb/utils.js.map +1 -0
  88. package/src/sdk/py.d.ts +2 -0
  89. package/src/sdk/py.js +1 -0
  90. package/src/sdk/py.js.map +1 -1
  91. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +145 -173
  92. package/src/ts/rdb/generator.js +4 -3
  93. package/src/ts/rdb/generator.js.map +1 -1
  94. package/src/ts/rdb/schema.json +1 -1
  95. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +16 -16
  96. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +58 -14
  97. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +68 -78
  98. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +88 -8
  99. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +5 -32
  100. package/src/utils/rdb-constructs/rdb-constructs.d.ts +11 -1
  101. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  102. package/src/utils/shared-constructs.js +9 -21
  103. package/src/utils/shared-constructs.js.map +1 -1
  104. package/src/utils/shared-rdb-scripts.js +5 -1
  105. package/src/utils/shared-rdb-scripts.js.map +1 -1
  106. package/src/utils/versions.d.ts +34 -30
  107. package/src/utils/versions.js +34 -30
  108. package/src/utils/versions.js.map +1 -1
  109. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n addDependenciesToPackageJson,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FsCommands } from '../../utils/fs';\nimport { updateGitIgnore } from '../../utils/git';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names';\nimport { getNpmScope, toScopeAlias } from '../../utils/npm-scope';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace';\nimport { assignPort } from '../../utils/port';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport {\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants';\nimport { sharedRdbScriptsGenerator } from '../../utils/shared-rdb-scripts';\nimport { TS_VERSIONS, withVersions } from '../../utils/versions';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator';\nimport type { TsRdbGeneratorSchema } from './schema';\n\nexport const TS_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsRdbGenerator = async (\n tree: Tree,\n options: TsRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n });\n\n let projectExists: boolean;\n try {\n readProjectConfiguration(tree, fullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n preferInstallDependencies: false,\n });\n }\n\n updateJson(tree, joinPathFragments(dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n include: ['src/**/*.ts', 'generated/prisma/**/*.ts'],\n }));\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n const localDbPort = assignPort(\n tree,\n projectConfig,\n options.engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = options.engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n options.engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n engine: options.engine,\n runtimeConfigKey: nameClassName,\n databasePackageAlias: toScopeAlias(fullyQualifiedName),\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n prismaAdapterPackage:\n options.engine === 'mysql'\n ? '@prisma/adapter-mariadb'\n : '@prisma/adapter-pg',\n prismaAdapterClassName:\n options.engine === 'mysql' ? 'PrismaMariaDb' : 'PrismaPg',\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n ...esmVars(tree),\n };\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n );\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine);\n const waitForDbScript =\n options.engine === 'mysql'\n ? 'wait-for-mysql-db.ts'\n : 'wait-for-postgres-db.ts';\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const relativePathToRoot = getRelativePathToRootByDirectory(\n projectConfig.root,\n );\n const fs = new FsCommands(tree);\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'migration',\n );\n const dockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n\n if (options.infra !== 'none') {\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n });\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n });\n const bundleTarget = projectConfig.targets['bundle'];\n // The bundle target starts with a single rolldown `command`. Wrap it with\n // the migration asset copy steps, unless it has already been transformed\n // into a `commands` array on a previous run.\n if (!bundleTarget.options.commands) {\n const rolldownCommand = bundleTarget.options.command;\n delete bundleTarget.options.command;\n bundleTarget.options = {\n ...bundleTarget.options,\n commands: [\n fs.rm(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.mkdir(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.cp(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cp(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cp(\n 'Dockerfile',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/Dockerfile`,\n ),\n rolldownCommand,\n ],\n parallel: false,\n };\n }\n }\n\n projectConfig.targets.generate = {\n executor: 'nx:run-commands',\n outputs: ['{projectRoot}/generated/prisma'],\n options: {\n command: 'prisma generate',\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n continuous: true,\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/${waitForDbScript}`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.prisma = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n cwd: '{projectRoot}',\n command: 'prisma',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n if (iac === 'terraform') {\n projectConfig.targets['docker'] = {\n cache: true,\n executor: 'nx:run-commands',\n options: {\n command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${dockerImageTag} ${migrationBundleDir}`,\n },\n dependsOn: ['bundle'],\n };\n addDependencyToTargetIfNotPresent(projectConfig, 'build', 'docker');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'build', 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n addGeneratorMetadata(tree, fullyQualifiedName, TS_RDB_GENERATOR_INFO, {\n engine: options.engine,\n });\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: toScopeAlias(fullyQualifiedName),\n databaseName,\n adminUser: databaseUser,\n engine: options.engine,\n migrationBundleDir,\n createDbUserBundleDir: joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'create-db-user',\n ),\n dockerImageTag,\n containerEngine,\n });\n }\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n '@aws-sdk/client-secrets-manager',\n '@aws-sdk/rds-signer',\n '@prisma/client',\n ...(options.engine === 'mysql'\n ? (['@prisma/adapter-mariadb', 'mariadb'] as const)\n : (['@prisma/adapter-pg', 'pg'] as const)),\n ]),\n withVersions([\n 'prisma',\n 'tsx',\n '@types/aws-lambda',\n ...(options.engine === 'mysql'\n ? ([] as const)\n : (['@types/pg'] as const)),\n ]),\n );\n\n registerPnpmBuiltDependencies(tree, {\n '@prisma/engines': false,\n prisma: false,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsRdbGenerator;\n"],"names":["relative","addDependenciesToPackageJson","generateFiles","joinPathFragments","readProjectConfiguration","updateJson","updateProjectConfiguration","addTypeScriptBundleTarget","resolveContainers","formatFilesInSubtree","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","toScopeAlias","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","sharedRdbScriptsGenerator","TS_VERSIONS","withVersions","tsProjectGenerator","getTsLibDetails","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","name","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","engine","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","patterns","waitForDbScript","scriptsDir","relativePathToRoot","root","fs","migrationBundleDir","dockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cp","parallel","generate","executor","outputs","cwd","continuous","dependsOn","env","LOCAL_DEV","iac","cache","projectName","projectRoot","adminUser","createDbUserBundleDir","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n addDependenciesToPackageJson,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FsCommands } from '../../utils/fs';\nimport { updateGitIgnore } from '../../utils/git';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names';\nimport { getNpmScope, toScopeAlias } from '../../utils/npm-scope';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace';\nimport { assignPort } from '../../utils/port';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport {\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants';\nimport { sharedRdbScriptsGenerator } from '../../utils/shared-rdb-scripts';\nimport { TS_VERSIONS, withVersions } from '../../utils/versions';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator';\nimport type { TsRdbGeneratorSchema } from './schema';\n\nexport const TS_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsRdbGenerator = async (\n tree: Tree,\n options: TsRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n });\n\n let projectExists: boolean;\n try {\n readProjectConfiguration(tree, fullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n preferInstallDependencies: false,\n });\n }\n\n updateJson(tree, joinPathFragments(dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n include: ['src/**/*.ts', 'generated/prisma/**/*.ts'],\n }));\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n const localDbPort = assignPort(\n tree,\n projectConfig,\n options.engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = options.engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n options.engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n engine: options.engine,\n runtimeConfigKey: nameClassName,\n databasePackageAlias: toScopeAlias(fullyQualifiedName),\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n prismaAdapterPackage:\n options.engine === 'mysql'\n ? '@prisma/adapter-mariadb'\n : '@prisma/adapter-pg',\n prismaAdapterClassName:\n options.engine === 'mysql' ? 'PrismaMariaDb' : 'PrismaPg',\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n ...esmVars(tree),\n };\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n );\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine);\n const waitForDbScript =\n options.engine === 'mysql'\n ? 'wait-for-mysql-db.ts'\n : 'wait-for-postgres-db.ts';\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const relativePathToRoot = getRelativePathToRootByDirectory(\n projectConfig.root,\n );\n const fs = new FsCommands(tree);\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'migration',\n );\n const migrationDockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n\n if (options.infra !== 'none') {\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n });\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n });\n const bundleTarget = projectConfig.targets['bundle'];\n // The bundle target starts with a single rolldown `command`. Wrap it with\n // the migration asset copy steps, unless it has already been transformed\n // into a `commands` array on a previous run.\n if (!bundleTarget.options.commands) {\n const rolldownCommand = bundleTarget.options.command;\n delete bundleTarget.options.command;\n bundleTarget.options = {\n ...bundleTarget.options,\n commands: [\n fs.rm(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.mkdir(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.cp(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cp(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cp(\n 'Dockerfile',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/Dockerfile`,\n ),\n rolldownCommand,\n ],\n parallel: false,\n };\n }\n }\n\n projectConfig.targets.generate = {\n executor: 'nx:run-commands',\n outputs: ['{projectRoot}/generated/prisma'],\n options: {\n command: 'prisma generate',\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n continuous: true,\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/${waitForDbScript}`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.prisma = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n cwd: '{projectRoot}',\n command: 'prisma',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n if (iac === 'terraform') {\n projectConfig.targets['docker'] = {\n cache: true,\n executor: 'nx:run-commands',\n options: {\n command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,\n },\n dependsOn: ['bundle'],\n };\n addDependencyToTargetIfNotPresent(projectConfig, 'build', 'docker');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'build', 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n addGeneratorMetadata(tree, fullyQualifiedName, TS_RDB_GENERATOR_INFO, {\n engine: options.engine,\n });\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: toScopeAlias(fullyQualifiedName),\n databaseName,\n adminUser: databaseUser,\n engine: options.engine,\n migrationBundleDir,\n createDbUserBundleDir: joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'create-db-user',\n ),\n framework: options.framework,\n migrationDockerImageTag,\n containerEngine,\n });\n }\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n '@aws-sdk/client-secrets-manager',\n '@aws-sdk/rds-signer',\n '@prisma/client',\n ...(options.engine === 'mysql'\n ? (['@prisma/adapter-mariadb', 'mariadb'] as const)\n : (['@prisma/adapter-pg', 'pg'] as const)),\n ]),\n withVersions([\n 'prisma',\n 'tsx',\n '@types/aws-lambda',\n ...(options.engine === 'mysql'\n ? ([] as const)\n : (['@types/pg'] as const)),\n ]),\n );\n\n registerPnpmBuiltDependencies(tree, {\n '@prisma/engines': false,\n prisma: false,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsRdbGenerator;\n"],"names":["relative","addDependenciesToPackageJson","generateFiles","joinPathFragments","readProjectConfiguration","updateJson","updateProjectConfiguration","addTypeScriptBundleTarget","resolveContainers","formatFilesInSubtree","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","toScopeAlias","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","sharedRdbScriptsGenerator","TS_VERSIONS","withVersions","tsProjectGenerator","getTsLibDetails","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","name","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","engine","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","patterns","waitForDbScript","scriptsDir","relativePathToRoot","root","fs","migrationBundleDir","migrationDockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cp","parallel","generate","executor","outputs","cwd","continuous","dependsOn","env","LOCAL_DEV","iac","cache","projectName","projectRoot","adminUser","createDbUserBundleDir","framework","languages"],"mappings":"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"}
@@ -74,5 +74,5 @@
74
74
  "default": true
75
75
  }
76
76
  },
77
- "required": ["name", "infra", "engine", "framework"]
77
+ "required": ["name"]
78
78
  }
@@ -1113,8 +1113,8 @@ exports[`react-website generator > Tanstack router integration > should generate
1113
1113
  "{
1114
1114
  "name": "@proj/source",
1115
1115
  "dependencies": {
1116
- "@cloudscape-design/board-components": "3.0.200",
1117
- "@cloudscape-design/components": "3.0.1324",
1116
+ "@cloudscape-design/board-components": "3.0.201",
1117
+ "@cloudscape-design/components": "3.0.1325",
1118
1118
  "@cloudscape-design/global-styles": "1.0.62",
1119
1119
  "aws-cdk-lib": "2.261.0",
1120
1120
  "constructs": "10.6.0",
@@ -1123,11 +1123,11 @@ exports[`react-website generator > Tanstack router integration > should generate
1123
1123
  "tailwindcss": "4.3.2"
1124
1124
  },
1125
1125
  "devDependencies": {
1126
- "@nx/js": "23.0.1",
1127
- "@nx/react": "23.0.1",
1128
- "@nx/vite": "23.0.1",
1129
- "@nx/vitest": "23.0.1",
1130
- "@nx/web": "23.0.1",
1126
+ "@nx/js": "23.0.2",
1127
+ "@nx/react": "23.0.2",
1128
+ "@nx/vite": "23.0.2",
1129
+ "@nx/vitest": "23.0.2",
1130
+ "@nx/web": "23.0.2",
1131
1131
  "@swc/helpers": "~0.5.18",
1132
1132
  "@tailwindcss/vite": "4.3.2",
1133
1133
  "@testing-library/dom": "10.4.0",
@@ -2684,8 +2684,8 @@ exports[`react-website generator > Tanstack router integration > should generate
2684
2684
  "{
2685
2685
  "name": "@proj/source",
2686
2686
  "dependencies": {
2687
- "@cloudscape-design/board-components": "3.0.200",
2688
- "@cloudscape-design/components": "3.0.1324",
2687
+ "@cloudscape-design/board-components": "3.0.201",
2688
+ "@cloudscape-design/components": "3.0.1325",
2689
2689
  "@cloudscape-design/global-styles": "1.0.62",
2690
2690
  "@tanstack/react-router": "1.170.17",
2691
2691
  "aws-cdk-lib": "2.261.0",
@@ -2695,11 +2695,11 @@ exports[`react-website generator > Tanstack router integration > should generate
2695
2695
  "tailwindcss": "4.3.2"
2696
2696
  },
2697
2697
  "devDependencies": {
2698
- "@nx/js": "23.0.1",
2699
- "@nx/react": "23.0.1",
2700
- "@nx/vite": "23.0.1",
2701
- "@nx/vitest": "23.0.1",
2702
- "@nx/web": "23.0.1",
2698
+ "@nx/js": "23.0.2",
2699
+ "@nx/react": "23.0.2",
2700
+ "@nx/vite": "23.0.2",
2701
+ "@nx/vitest": "23.0.2",
2702
+ "@nx/web": "23.0.2",
2703
2703
  "@swc/helpers": "~0.5.18",
2704
2704
  "@tailwindcss/vite": "4.3.2",
2705
2705
  "@tanstack/router-generator": "1.167.18",
@@ -4990,8 +4990,8 @@ root &&
4990
4990
 
4991
4991
  exports[`react-website generator > should handle npm scope prefix correctly > scoped-dependencies 1`] = `
4992
4992
  {
4993
- "@cloudscape-design/board-components": "3.0.200",
4994
- "@cloudscape-design/components": "3.0.1324",
4993
+ "@cloudscape-design/board-components": "3.0.201",
4994
+ "@cloudscape-design/components": "3.0.1325",
4995
4995
  "@cloudscape-design/global-styles": "1.0.62",
4996
4996
  "@tanstack/react-router": "1.170.17",
4997
4997
  "aws-cdk-lib": "2.261.0",
@@ -2,6 +2,19 @@ import * as path from 'path';
2
2
  import * as url from 'url';
3
3
  import { readFileSync } from 'fs';
4
4
  import { Construct } from 'constructs';
5
+ import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
6
+ import {
7
+ <%_ if (framework !== 'sqlmodel') { _%>
8
+ Code,
9
+ <%_ } _%>
10
+ DockerImageCode,
11
+ DockerImageFunction,
12
+ Function,
13
+ FunctionOptions,
14
+ <%_ if (framework !== 'sqlmodel') { _%>
15
+ Runtime,
16
+ <%_ } _%>
17
+ } from 'aws-cdk-lib/aws-lambda';
5
18
  import {
6
19
  AuroraDatabase,
7
20
  AuroraDatabaseEngines,
@@ -19,14 +32,19 @@ const { runtimeConfigKey } = JSON.parse(
19
32
  ),
20
33
  ) as { runtimeConfigKey: string };
21
34
 
35
+ const migrationBundleDir = path.join(
36
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
37
+ '<%- migrationBundleDir %>',
38
+ );
39
+
40
+ const createDbUserBundleDir = path.join(
41
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
42
+ '<%- createDbUserBundleDir %>',
43
+ );
44
+
22
45
  export type <%= nameClassName %>Props = Omit<
23
46
  AuroraDatabaseProps,
24
- | 'databaseName'
25
- | 'adminUser'
26
- | 'createDbUserBundleDir'
27
- | 'engine'
28
- | 'runtimeConfigKey'
29
- | 'migrationBundleDir'
47
+ 'databaseName' | 'adminUser' | 'runtimeConfigKey' | 'engine'
30
48
  >;
31
49
 
32
50
  /**
@@ -39,15 +57,41 @@ export class <%= nameClassName %> extends AuroraDatabase {
39
57
  databaseName: '<%= databaseName %>',
40
58
  adminUser: '<%= adminUser %>',
41
59
  runtimeConfigKey,
42
- migrationBundleDir: path.join(
43
- findWorkspaceRoot(url.fileURLToPath(new URL(<% if (esm) { %>import.meta.url<% } else { %>require('url').pathToFileURL(__filename).href<% } %>))),
44
- '<%- migrationBundleDir %>',
45
- ),
46
- createDbUserBundleDir: path.join(
47
- findWorkspaceRoot(url.fileURLToPath(new URL(<% if (esm) { %>import.meta.url<% } else { %>require('url').pathToFileURL(__filename).href<% } %>))),
48
- '<%- createDbUserBundleDir %>',
49
- ),
50
60
  engine: AuroraDatabaseEngines.<%= engine %>({}),
51
61
  });
52
62
  }
63
+
64
+ <%_ if (framework === 'sqlmodel') { _%>
65
+ protected override createDbUserHandler(baseProps: FunctionOptions): Function {
66
+ return new DockerImageFunction(this, 'CreateDbUserHandler', {
67
+ ...baseProps,
68
+ code: DockerImageCode.fromImageAsset(createDbUserBundleDir, {
69
+ platform: Platform.LINUX_ARM64,
70
+ }),
71
+ });
72
+ }
73
+ <%_ } else { _%>
74
+ protected override createDbUserHandler(baseProps: FunctionOptions): Function {
75
+ return new Function(this, 'CreateDbUserHandler', {
76
+ ...baseProps,
77
+ code: Code.fromAsset(createDbUserBundleDir),
78
+ handler: 'index.handler',
79
+ runtime: Runtime.NODEJS_LATEST,
80
+ environment: {
81
+ NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
82
+ },
83
+ });
84
+ }
85
+ <%_ } _%>
86
+
87
+ protected override createMigrationHandler(
88
+ baseProps: FunctionOptions,
89
+ ): Function {
90
+ return new DockerImageFunction(this, 'MigrationHandler', {
91
+ ...baseProps,
92
+ code: DockerImageCode.fromImageAsset(migrationBundleDir, {
93
+ platform: Platform.LINUX_ARM64,
94
+ }),
95
+ });
96
+ }
53
97
  }
@@ -1,18 +1,14 @@
1
- import { CfnOutput, Duration, RemovalPolicy, Stack } from 'aws-cdk-lib';
2
- import { CustomResource } from 'aws-cdk-lib';
3
- import { IConnectable, IVpc, Port, SubnetType } from 'aws-cdk-lib/aws-ec2';
4
- import { IGrantable, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
5
- import { Key } from 'aws-cdk-lib/aws-kms';
6
- import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
1
+ import { CfnOutput, Duration, RemovalPolicy, Stack } from "aws-cdk-lib";
2
+ import { CustomResource } from "aws-cdk-lib";
3
+ import { IConnectable, IVpc, Port, SubnetType } from "aws-cdk-lib/aws-ec2";
4
+ import { IGrantable, Role, ServicePrincipal } from "aws-cdk-lib/aws-iam";
5
+ import { Key } from "aws-cdk-lib/aws-kms";
7
6
  import {
8
7
  Architecture,
9
- Code,
10
- DockerImageCode,
11
- DockerImageFunction,
12
8
  Function,
13
- Runtime,
9
+ FunctionOptions,
14
10
  Tracing,
15
- } from 'aws-cdk-lib/aws-lambda';
11
+ } from "aws-cdk-lib/aws-lambda";
16
12
  import {
17
13
  AuroraMysqlEngineVersion,
18
14
  AuroraPostgresEngineVersion,
@@ -24,11 +20,11 @@ import {
24
20
  DatabaseProxy,
25
21
  DefaultAuthScheme,
26
22
  IClusterEngine,
27
- } from 'aws-cdk-lib/aws-rds';
28
- import { Provider } from 'aws-cdk-lib/custom-resources';
29
- import { Trigger } from 'aws-cdk-lib/triggers';
30
- import { Construct } from 'constructs';
31
- import { RuntimeConfig } from '../runtime-config<% if (esm) { %>.js<% } %>';
23
+ } from "aws-cdk-lib/aws-rds";
24
+ import { Provider } from "aws-cdk-lib/custom-resources";
25
+ import { Trigger } from "aws-cdk-lib/triggers";
26
+ import { Construct } from "constructs";
27
+ import { RuntimeConfig } from "../runtime-config<% if (esm) { %>.js<% } %>";
32
28
 
33
29
  export type AuroraDatabaseEngineVersion =
34
30
  | AuroraMysqlEngineVersion
@@ -38,7 +34,7 @@ export interface AuroraDatabaseEngine {
38
34
  /**
39
35
  * Discriminant identifying the engine type.
40
36
  */
41
- readonly type: 'mysql' | 'postgres';
37
+ readonly type: "mysql" | "postgres";
42
38
 
43
39
  /**
44
40
  * Default Aurora engine version used when one is not explicitly provided.
@@ -58,7 +54,7 @@ export class AuroraDatabaseEngines {
58
54
  defaultVersion?: AuroraMysqlEngineVersion;
59
55
  }): AuroraDatabaseEngine {
60
56
  return {
61
- type: 'mysql',
57
+ type: "mysql",
62
58
  defaultVersion,
63
59
  clusterEngine: (version) =>
64
60
  DatabaseClusterEngine.auroraMysql({
@@ -73,7 +69,7 @@ export class AuroraDatabaseEngines {
73
69
  defaultVersion?: AuroraPostgresEngineVersion;
74
70
  }): AuroraDatabaseEngine {
75
71
  return {
76
- type: 'postgres',
72
+ type: "postgres",
77
73
  defaultVersion,
78
74
  clusterEngine: (version) =>
79
75
  DatabaseClusterEngine.auroraPostgres({
@@ -85,12 +81,12 @@ export class AuroraDatabaseEngines {
85
81
 
86
82
  type _AuroraDatabaseProps = Omit<
87
83
  DatabaseClusterProps,
88
- | 'credentials'
89
- | 'defaultDatabaseName'
90
- | 'engine'
91
- | 'iamAuthentication'
92
- | 'instanceProps'
93
- | 'writer'
84
+ | "credentials"
85
+ | "defaultDatabaseName"
86
+ | "engine"
87
+ | "iamAuthentication"
88
+ | "instanceProps"
89
+ | "writer"
94
90
  >;
95
91
 
96
92
  export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
@@ -126,20 +122,10 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
126
122
  */
127
123
  readonly runtimeConfigKey: string;
128
124
 
129
- /**
130
- * Migration bundle used to create a migration handler Lambda.
131
- */
132
- readonly migrationBundleDir: string;
133
-
134
- /**
135
- * Bundle used to create or reconcile the application database user.
136
- */
137
- readonly createDbUserBundleDir: string;
138
-
139
125
  /**
140
126
  * Writer instance for the Aurora cluster.
141
127
  */
142
- readonly writer?: DatabaseClusterProps['writer'];
128
+ readonly writer?: DatabaseClusterProps["writer"];
143
129
 
144
130
  /**
145
131
  * Whether to provision an RDS Proxy in front of the Aurora cluster.
@@ -210,8 +196,6 @@ export abstract class AuroraDatabase extends Construct {
210
196
  adminUser,
211
197
  databaseName,
212
198
  runtimeConfigKey,
213
- migrationBundleDir,
214
- createDbUserBundleDir,
215
199
  vpcSubnets,
216
200
  writer,
217
201
  enableRdsProxy = true,
@@ -230,15 +214,15 @@ export abstract class AuroraDatabase extends Construct {
230
214
 
231
215
  this.adminUser = adminUser;
232
216
 
233
- const key = new Key(this, 'EncryptionKey', { enableKeyRotation });
234
- this.cluster = new DatabaseCluster(this, 'DatabaseCluster', {
217
+ const key = new Key(this, "EncryptionKey", { enableKeyRotation });
218
+ this.cluster = new DatabaseCluster(this, "DatabaseCluster", {
235
219
  ...clusterProps,
236
220
  vpc,
237
221
  vpcSubnets,
238
222
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
239
223
  writer:
240
224
  writer ??
241
- ClusterInstance.serverlessV2('writer', {
225
+ ClusterInstance.serverlessV2("writer", {
242
226
  enablePerformanceInsights,
243
227
  performanceInsightEncryptionKey: enablePerformanceInsights
244
228
  ? key
@@ -250,9 +234,9 @@ export abstract class AuroraDatabase extends Construct {
250
234
  iamAuthentication: true,
251
235
  monitoringInterval: Duration.seconds(5),
252
236
  cloudwatchLogsExports: enableCloudwatchLogs
253
- ? engine.type === 'mysql'
254
- ? ['audit', 'error', 'general', 'slowquery']
255
- : ['postgresql']
237
+ ? engine.type === "mysql"
238
+ ? ["audit", "error", "general", "slowquery"]
239
+ : ["postgresql"]
256
240
  : undefined,
257
241
  defaultDatabaseName: databaseName,
258
242
  storageEncrypted: true,
@@ -271,13 +255,13 @@ export abstract class AuroraDatabase extends Construct {
271
255
  }
272
256
 
273
257
  const proxyRole = enableRdsProxy
274
- ? new Role(this, 'DatabaseProxyRole', {
275
- assumedBy: new ServicePrincipal('rds.amazonaws.com'),
258
+ ? new Role(this, "DatabaseProxyRole", {
259
+ assumedBy: new ServicePrincipal("rds.amazonaws.com"),
276
260
  })
277
261
  : undefined;
278
262
 
279
263
  if (enableRdsProxy) {
280
- this.proxy = this.cluster.addProxy('DatabaseProxy', {
264
+ this.proxy = this.cluster.addProxy("DatabaseProxy", {
281
265
  vpc,
282
266
  vpcSubnets,
283
267
  defaultAuthScheme: DefaultAuthScheme.IAM_AUTH,
@@ -289,36 +273,36 @@ export abstract class AuroraDatabase extends Construct {
289
273
  this.proxy?.endpoint ?? this.cluster.clusterEndpoint.hostname;
290
274
  const databasePort = this.cluster.clusterEndpoint.port;
291
275
 
292
- const createDbUserHandler = new Function(this, 'CreateDbUserHandler', {
293
- code: Code.fromAsset(createDbUserBundleDir),
294
- handler: 'index.handler',
295
- runtime: Runtime.NODEJS_LATEST,
276
+ const commonProps: FunctionOptions = {
277
+ vpc,
296
278
  timeout: Duration.minutes(5),
297
279
  tracing: Tracing.ACTIVE,
298
- vpc,
280
+ architecture: Architecture.ARM_64,
281
+ };
282
+
283
+ const createDbUserHandler = this.createDbUserHandler({
284
+ ...commonProps,
299
285
  vpcSubnets: {
300
286
  subnetType: SubnetType.PRIVATE_WITH_EGRESS,
301
287
  },
302
- environment: {
303
- DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
304
- NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
305
- },
306
- architecture: Architecture.ARM_64,
307
288
  });
308
-
289
+ createDbUserHandler.addEnvironment(
290
+ "DATABASE_SECRET_ARN",
291
+ this.cluster.secret!.secretArn,
292
+ );
309
293
  this.cluster.connections.allowDefaultPortFrom(
310
294
  createDbUserHandler,
311
- 'Allow the create-db-user handler to connect to the database',
295
+ "Allow the create-db-user handler to connect to the database",
312
296
  );
313
297
  this.grantSecretRead(createDbUserHandler);
314
298
 
315
- const createDbUserProvider = new Provider(this, 'CreateDbUserProvider', {
299
+ const createDbUserProvider = new Provider(this, "CreateDbUserProvider", {
316
300
  onEventHandler: createDbUserHandler,
317
301
  });
318
302
 
319
303
  const createDbUserResource = new CustomResource(
320
304
  this,
321
- 'CreateDbUserResource',
305
+ "CreateDbUserResource",
322
306
  {
323
307
  serviceToken: createDbUserProvider.serviceToken,
324
308
  properties: {
@@ -327,13 +311,13 @@ export abstract class AuroraDatabase extends Construct {
327
311
  },
328
312
  );
329
313
  createDbUserResource.node.addDependency(this.cluster);
330
- this.dbUser = createDbUserResource.getAttString('dbUser');
314
+ this.dbUser = createDbUserResource.getAttString("dbUser");
331
315
  if (this.proxy && proxyRole) {
332
316
  this.cluster.grantConnect(proxyRole, this.dbUser);
333
317
  }
334
318
 
335
319
  const rc = RuntimeConfig.ensure(this);
336
- rc.set('database', runtimeConfigKey, {
320
+ rc.set("database", runtimeConfigKey, {
337
321
  hostname: databaseHostname,
338
322
  port: databasePort,
339
323
  database: databaseName,
@@ -342,39 +326,45 @@ export abstract class AuroraDatabase extends Construct {
342
326
  region: Stack.of(this).region,
343
327
  });
344
328
 
345
- const migrationHandler = new DockerImageFunction(this, 'MigrationHandler', {
346
- code: DockerImageCode.fromImageAsset(migrationBundleDir, {
347
- platform: Platform.LINUX_ARM64,
348
- }),
329
+ const migrationHandler = this.createMigrationHandler({
330
+ ...commonProps,
349
331
  memorySize: 1024,
350
- timeout: Duration.minutes(5),
351
- tracing: Tracing.ACTIVE,
352
- vpc,
353
- environment: {
354
- DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
355
- },
356
- architecture: Architecture.ARM_64,
357
332
  });
358
-
333
+ migrationHandler.addEnvironment(
334
+ "DATABASE_SECRET_ARN",
335
+ this.cluster.secret!.secretArn,
336
+ );
359
337
  this.cluster.connections.allowDefaultPortFrom(migrationHandler);
360
338
  this.grantSecretRead(migrationHandler);
361
339
 
362
- const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
340
+ const migrationTrigger = new Trigger(this, "MigrationTrigger", {
363
341
  handler: migrationHandler,
364
342
  });
365
343
  migrationTrigger.node.addDependency(createDbUserResource);
366
344
 
367
- new CfnOutput(this, 'ClusterEndpoint', {
345
+ new CfnOutput(this, "ClusterEndpoint", {
368
346
  value: this.cluster.clusterEndpoint.hostname,
369
347
  });
370
348
 
371
349
  if (this.proxy?.endpoint) {
372
- new CfnOutput(this, 'ProxyEndpoint', {
350
+ new CfnOutput(this, "ProxyEndpoint", {
373
351
  value: this.proxy?.endpoint,
374
352
  });
375
353
  }
376
354
  }
377
355
 
356
+ /**
357
+ * Creates the Lambda handler used to create or reconcile the application database user.
358
+ */
359
+ protected abstract createDbUserHandler(baseProps: FunctionOptions): Function;
360
+
361
+ /**
362
+ * Creates the Lambda handler used to run database migrations.
363
+ */
364
+ protected abstract createMigrationHandler(
365
+ baseProps: FunctionOptions,
366
+ ): Function;
367
+
378
368
  public allowDefaultPortFrom(other: IConnectable, description?: string): void {
379
369
  if (this.proxy) {
380
370
  this.proxy.connections.allowFrom(