@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.
- package/LICENSE-THIRD-PARTY +28 -41
- package/generators.json +27 -0
- package/package.json +6 -6
- package/src/connection/generator.js +12 -1
- package/src/connection/generator.js.map +1 -1
- package/src/connection/supported-connections.d.ts +10 -1
- package/src/connection/supported-connections.js +13 -0
- package/src/connection/supported-connections.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +6 -6
- package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +12 -12
- package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +74 -10
- package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +22 -4
- package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +53 -8
- package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +32 -4
- package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
- package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +86 -11
- package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +21 -3
- package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +2 -2
- package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +6 -6
- package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +2 -2
- package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
- package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +4 -4
- package/src/open-api/ts-client/files/client.gen.ts.template +195 -12
- package/src/open-api/ts-client/files/types.gen.ts.template +2 -0
- package/src/open-api/ts-client/generator.js +22 -1
- package/src/open-api/ts-client/generator.js.map +1 -1
- package/src/open-api/utils/codegen-data/languages.js +6 -0
- package/src/open-api/utils/codegen-data/languages.js.map +1 -1
- package/src/open-api/utils/codegen-data/types.d.ts +16 -1
- package/src/open-api/utils/codegen-data/types.js.map +1 -1
- package/src/open-api/utils/codegen-data.js +71 -0
- package/src/open-api/utils/codegen-data.js.map +1 -1
- package/src/open-api/utils/normalise.js +53 -8
- package/src/open-api/utils/normalise.js.map +1 -1
- package/src/open-api/utils/parser.js +48 -15
- package/src/open-api/utils/parser.js.map +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +4 -2
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +1 -1
- package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2038 -0
- package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +104 -0
- package/src/py/rdb/agent-connection/generator.d.ts +10 -0
- package/src/py/rdb/agent-connection/generator.js +46 -0
- package/src/py/rdb/agent-connection/generator.js.map +1 -0
- package/src/py/rdb/agent-connection/schema.d.js +8 -0
- package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
- package/src/py/rdb/agent-connection/schema.d.ts +15 -0
- package/src/py/rdb/agent-connection/schema.json +27 -0
- package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +44 -0
- package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
- package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
- package/src/py/rdb/fast-api-connection/generator.js +54 -0
- package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
- package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
- package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
- package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
- package/src/py/rdb/fast-api-connection/schema.json +23 -0
- package/src/py/rdb/files/Dockerfile.create-db-user.template +10 -0
- package/src/py/rdb/files/Dockerfile.migration.template +10 -0
- package/src/py/rdb/files/__name__/__init__.py.template +3 -0
- package/src/py/rdb/files/__name__/connection.py.template +55 -0
- package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
- package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
- package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
- package/src/py/rdb/files/__name__/models/example.py.template +8 -0
- package/src/py/rdb/files/__name__/utils.py.template +104 -0
- package/src/py/rdb/files/alembic.ini.template +38 -0
- package/src/py/rdb/files/config.json.template +14 -0
- package/src/py/rdb/files/migrations/env.py.template +80 -0
- package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
- package/src/py/rdb/generator.d.ts +6 -0
- package/src/py/rdb/generator.js +263 -0
- package/src/py/rdb/generator.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +101 -0
- package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/rdb/mcp-server-connection/generator.js +46 -0
- package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
- package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
- package/src/py/rdb/mcp-server-connection/schema.json +27 -0
- package/src/py/rdb/schema.d.js +6 -0
- package/src/py/rdb/schema.d.js.map +1 -0
- package/src/py/rdb/schema.d.ts +16 -0
- package/src/py/rdb/schema.json +77 -0
- package/src/py/rdb/utils.d.ts +6 -0
- package/src/py/rdb/utils.js +16 -0
- package/src/py/rdb/utils.js.map +1 -0
- package/src/sdk/py.d.ts +2 -0
- package/src/sdk/py.js +1 -0
- package/src/sdk/py.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +145 -173
- package/src/ts/rdb/generator.js +4 -3
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/schema.json +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +16 -16
- package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +58 -14
- package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +68 -78
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +88 -8
- package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +5 -32
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +11 -1
- package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
- package/src/utils/shared-constructs.js +9 -21
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-rdb-scripts.js +5 -1
- package/src/utils/shared-rdb-scripts.js.map +1 -1
- package/src/utils/versions.d.ts +34 -30
- package/src/utils/versions.js +34 -30
- package/src/utils/versions.js.map +1 -1
- 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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"}
|
package/src/ts/rdb/schema.json
CHANGED
|
@@ -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.
|
|
1117
|
-
"@cloudscape-design/components": "3.0.
|
|
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.
|
|
1127
|
-
"@nx/react": "23.0.
|
|
1128
|
-
"@nx/vite": "23.0.
|
|
1129
|
-
"@nx/vitest": "23.0.
|
|
1130
|
-
"@nx/web": "23.0.
|
|
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.
|
|
2688
|
-
"@cloudscape-design/components": "3.0.
|
|
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.
|
|
2699
|
-
"@nx/react": "23.0.
|
|
2700
|
-
"@nx/vite": "23.0.
|
|
2701
|
-
"@nx/vitest": "23.0.
|
|
2702
|
-
"@nx/web": "23.0.
|
|
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.
|
|
4994
|
-
"@cloudscape-design/components": "3.0.
|
|
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
|
-
| '
|
|
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
|
|
2
|
-
import { CustomResource } from
|
|
3
|
-
import { IConnectable, IVpc, Port, SubnetType } from
|
|
4
|
-
import { IGrantable, Role, ServicePrincipal } from
|
|
5
|
-
import { Key } from
|
|
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
|
-
|
|
9
|
+
FunctionOptions,
|
|
14
10
|
Tracing,
|
|
15
|
-
} from
|
|
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
|
|
28
|
-
import { Provider } from
|
|
29
|
-
import { Trigger } from
|
|
30
|
-
import { Construct } from
|
|
31
|
-
import { RuntimeConfig } from
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
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[
|
|
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,
|
|
234
|
-
this.cluster = new DatabaseCluster(this,
|
|
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(
|
|
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 ===
|
|
254
|
-
? [
|
|
255
|
-
: [
|
|
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,
|
|
275
|
-
assumedBy: new ServicePrincipal(
|
|
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(
|
|
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
|
|
293
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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 =
|
|
346
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|