@aws/nx-plugin 1.0.7 → 1.0.9
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/migrations.json +21 -1
- package/package.json +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +10 -0
- package/src/infra/app/files/app/README.md.template +12 -0
- package/src/infra/app/generator.js +8 -0
- package/src/infra/app/generator.js.map +1 -1
- package/src/migrations/latest/cache-inputs-outputs/metadata.json +3 -0
- package/src/migrations/latest/cache-inputs-outputs/migration.d.ts +6 -0
- package/src/migrations/latest/cache-inputs-outputs/migration.js +176 -0
- package/src/migrations/latest/cache-inputs-outputs/migration.js.map +1 -0
- package/src/migrations/latest/infra-test-loop/metadata.json +3 -0
- package/src/migrations/latest/infra-test-loop/migration.d.ts +6 -0
- package/src/migrations/latest/infra-test-loop/migration.js +110 -0
- package/src/migrations/latest/infra-test-loop/migration.js.map +1 -0
- package/src/migrations/latest/py-dynamodb-bind-base-model-meta/metadata.json +3 -0
- package/src/migrations/latest/py-dynamodb-bind-base-model-meta/migration.d.ts +6 -0
- package/src/migrations/latest/py-dynamodb-bind-base-model-meta/migration.js +56 -0
- package/src/migrations/latest/py-dynamodb-bind-base-model-meta/migration.js.map +1 -0
- package/src/migrations/latest/py-dynamodb-type-base-model-meta/metadata.json +3 -0
- package/src/migrations/latest/py-dynamodb-type-base-model-meta/migration.d.ts +6 -0
- package/src/migrations/latest/py-dynamodb-type-base-model-meta/migration.js +54 -0
- package/src/migrations/latest/py-dynamodb-type-base-model-meta/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.90/0004-python-test-input-scoping/migration.js +8 -2
- package/src/migrations/v1.0.0-rc.90/0004-python-test-input-scoping/migration.js.map +1 -1
- package/src/open-api/py-client/files/client/__clientModuleName__.py.template +17 -6
- package/src/open-api/py-client/files/shared/errors.py.template +3 -5
- package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +8 -4
- package/src/py/dynamodb/base-model-meta.d.ts +39 -0
- package/src/py/dynamodb/base-model-meta.js +54 -0
- package/src/py/dynamodb/base-model-meta.js.map +1 -0
- package/src/py/dynamodb/files/__name__/entities/base.py.template +4 -2
- package/src/smithy/project/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/smithy/project/generator.d.ts +9 -0
- package/src/smithy/project/generator.js +15 -0
- package/src/smithy/project/generator.js.map +1 -1
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +2 -0
- package/src/terraform/project/generator.js +2 -4
- package/src/terraform/project/generator.js.map +1 -1
- package/src/ts/lib/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/ts/lib/generator.d.ts +14 -3
- package/src/ts/lib/generator.js +18 -7
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/rdb/generator.js +4 -0
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +102 -2
- package/src/utils/__snapshots__/cdk-test-setup.spec.ts.snap +25 -0
- package/src/utils/cdk-test-setup.d.ts +22 -0
- package/src/utils/cdk-test-setup.js +38 -0
- package/src/utils/cdk-test-setup.js.map +1 -0
- package/src/utils/files/cdk-test-setup/tests/global-setup.ts.template +45 -0
- package/src/utils/shared-constructs.js +2 -0
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/test/python-dependencies.d.ts +6 -0
- package/src/utils/test/python-dependencies.js +9 -0
- package/src/utils/test/python-dependencies.js.map +1 -1
- package/src/utils/test/warm-python-cache.js +40 -21
- package/src/utils/test/warm-python-cache.js.map +1 -1
- package/src/utils/version-lockstep/hold.d.ts +26 -0
- package/src/utils/version-lockstep/hold.js +33 -0
- package/src/utils/version-lockstep/hold.js.map +1 -0
- package/src/utils/versions.d.ts +1 -1
- package/src/utils/versions.js +1 -1
- package/src/utils/versions.js.map +1 -1
|
@@ -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 detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport { addStarExport } from '../../utils/ast.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n PRISMA_IMAGE_DEPENDENCIES,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { updateGitIgnore } from '../../utils/git.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { TS_VERSIONS } from '../../utils/versions.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport type { TsRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsRdbMetadata extends IacMetadata {\n readonly engine: TsRdbGeneratorSchema['engine'];\n}\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsRdbMetadata>()({\n ts: [\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@aws-sdk/client-secrets-manager' },\n { name: '@aws-sdk/rds-signer' },\n { name: '@prisma/client' },\n { name: '@prisma/adapter-mariadb', when: (m) => m.engine === 'mysql' },\n { name: 'mariadb', when: (m) => m.engine === 'mysql' },\n { name: '@prisma/adapter-pg', when: (m) => m.engine !== 'mysql' },\n { name: 'pg', when: (m) => m.engine !== 'mysql' },\n { name: '@types/aws-lambda', dev: true },\n { name: '@types/pg', when: (m) => m.engine !== 'mysql', dev: true },\n // The prisma CLI and tsx run migration/seed scripts from the root.\n { name: 'prisma', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(PRISMA_IMAGE_DEPENDENCIES),\n ],\n});\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 subDirectory: options.subDirectory,\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: fullyQualifiedName,\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n deepmergeTsVersion: TS_VERSIONS['deepmerge-ts'],\n mysql2Version: TS_VERSIONS.mysql2,\n ...nodeImageVersions(),\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 // The Prisma schema and models, the handlers and the prisma client module are\n // all user-editable, so a re-run (to add infrastructure, or after a failed\n // run) must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The barrel re-exports prisma.ts. `tsProjectGenerator` writes a stub index.ts\n // when it creates the project, so the re-export is added to whatever is there\n // rather than replacing it — which also leaves a user's own additions to the\n // barrel alone on a re-run.\n await addStarExport(\n tree,\n joinPathFragments(dir, 'src', 'index.ts'),\n './prisma.js',\n );\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: options.engine,\n },\n });\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine, DEPENDENCIES);\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, DEPENDENCIES);\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(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n },\n DEPENDENCIES,\n );\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n },\n DEPENDENCIES,\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.cpDir(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cpFile(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cpFile(\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 dependsOn: ['pull-image'],\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 // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated, in\n // which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (options.infra !== 'none') {\n // The migration image ships under both providers — Terraform pushes the\n // locally built tag, CDK builds the same context as an image asset — so the\n // build and its scan are wired up for either.\n projectConfig.targets['docker'] = {\n cache: IMAGE_BUILD_CACHE,\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 addArtifactDependencyToTargets(projectConfig, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag],\n },\n DEPENDENCIES,\n );\n addArtifactDependencyToTargets(projectConfig, 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsRdbMetadata = {\n engine: options.engine,\n ...(iac ? { iac } : {}),\n };\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n TS_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: 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 addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: projectConfig.root,\n });\n\n // @prisma/adapter-pg depends on @types/pg ^8.16.0. Yarn does not dedupe it to\n // the workspace's pinned @types/pg, so it installs a separate copy under the\n // adapter's own node_modules whenever a newer @types/pg is published. The two\n // copies declare structurally incompatible Pool types, so passing our `new\n // Pool(...)` to `new PrismaPg(...)` fails to compile. Scope the resolution to\n // the adapter so other @types/pg consumers are unaffected. Classic yarn only\n // honours the `**/`-prefixed descriptor in a workspace and berry only the\n // bare one, so declare both.\n if (options.engine === 'postgres' && detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n '@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n };\n return packageJson;\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","detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","writeJson","addTsDependencies","addStarExport","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","PRISMA_IMAGE_DEPENDENCIES","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","TS_VERSIONS","tsProjectGenerator","getTsLibDetails","DEPENDENCIES","ts","name","when","m","engine","dev","root","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","deepmergeTsVersion","mysql2Version","mysql2","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","overwriteStrategy","KeepExisting","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","patterns","waitForDbScript","scriptsDir","relativePathToRoot","fs","migrationBundleDir","migrationDockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cpDir","cpFile","parallel","generate","executor","outputs","cwd","dependsOn","continuous","env","LOCAL_DEV","iac","undefined","cache","project","trivyTargetName","dockerTargetName","imageTags","metadata","projectName","projectRoot","adminUser","createDbUserBundleDir","framework","packageJson","resolutions","languages"],"mappings":"AAAA;;;CAGC,GACD,SAASA,QAAQ,QAAQ,YAAY;AACrC,SACEC,oBAAoB,EAEpBC,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,EACjBC,wBAAwB,EAExBC,UAAU,EACVC,0BAA0B,EAC1BC,SAAS,QACJ,aAAa;AACpB,SAASC,iBAAiB,QAAQ,kCAAkC;AACpE,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SACEC,yBAAyB,EACzBC,mBAAmB,QACd,+BAA+B;AACtC,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SACEC,mBAAmB,EACnBC,cAAc,QACT,uCAAuC;AAC9C,SACEC,mBAAmB,EACnBC,mBAAmB,EACnBC,iBAAiB,EACjBC,uBAAuB,EACvBC,iBAAiB,EACjBC,yBAAyB,QACpB,wBAAwB;AAC/B,SAASC,oBAAoB,QAAQ,wBAAwB;AAC7D,SAASC,eAAe,EAAEC,UAAU,QAAQ,oBAAoB;AAChE,SAASC,eAAe,QAAQ,qBAAqB;AACrD,SAASC,UAAU,QAAQ,qBAAqB;AAChD,SAASC,mBAAmB,QAAQ,yBAAyB;AAC7D,SAASC,+BAA+B,QAAQ,yBAAyB;AACzE,SAASC,OAAO,QAAQ,+BAA+B;AACvD,SAASC,SAAS,EAAEC,SAAS,EAAEC,WAAW,QAAQ,uBAAuB;AACzE,SAASC,WAAW,QAAQ,2BAA2B;AACvD,SACEC,8BAA8B,EAC9BC,iCAAiC,EACjCC,oBAAoB,EACpBC,gBAAgB,QAEX,oBAAoB;AAC3B,SAASC,gCAAgC,QAAQ,uBAAuB;AACxE,SAASC,6BAA6B,QAAQ,gCAAgC;AAC9E,SAASC,UAAU,QAAQ,sBAAsB;AACjD,SAASC,WAAW,QAAQ,+CAA+C;AAC3E,SACEC,8BAA8B,EAC9BC,yBAAyB,QACpB,mCAAmC;AAC1C,SAEEC,YAAY,EACZC,kBAAkB,QACb,6CAA6C;AACpD,SACEC,+BAA+B,EAC/BC,yBAAyB,QACpB,oCAAoC;AAC3C,SAASC,WAAW,QAAQ,0BAA0B;AACtD,OAAOC,sBAAsBC,eAAe,QAAQ,sBAAsB;AAQ1E,4EAA4E;AAC5E,2CAA2C;AAC3C,OAAO,MAAMC,eAAerC,sBAAqC;IAC/DsC,IAAI;QACF;YAAEC,MAAM;QAAoC;QAC5C;YAAEA,MAAM;QAAgC;QACxC;YAAEA,MAAM;QAAkC;QAC1C;YAAEA,MAAM;QAAsB;QAC9B;YAAEA,MAAM;QAAiB;QACzB;YAAEA,MAAM;YAA2BC,MAAM,CAACC,IAAMA,EAAEC,MAAM,KAAK;QAAQ;QACrE;YAAEH,MAAM;YAAWC,MAAM,CAACC,IAAMA,EAAEC,MAAM,KAAK;QAAQ;QACrD;YAAEH,MAAM;YAAsBC,MAAM,CAACC,IAAMA,EAAEC,MAAM,KAAK;QAAQ;QAChE;YAAEH,MAAM;YAAMC,MAAM,CAACC,IAAMA,EAAEC,MAAM,KAAK;QAAQ;QAChD;YAAEH,MAAM;YAAqBI,KAAK;QAAK;QACvC;YAAEJ,MAAM;YAAaC,MAAM,CAACC,IAAMA,EAAEC,MAAM,KAAK;YAASC,KAAK;QAAK;QAClE,mEAAmE;QACnE;YAAEJ,MAAM;YAAUI,KAAK;YAAMC,MAAM;QAAK;QACxC;YAAEL,MAAM;YAAOI,KAAK;YAAMC,MAAM;QAAK;WAClC3C,eAAeH;WACfG,eAAeQ;WACfR,eAAeE;WACfF,eAAe2B;WACf3B,eAAe+B;WACf/B,eAAeI;WACfJ,eAAeM;KACnB;AACH,GAAG;AAEH,OAAO,MAAMsC,wBAAyCtB,iBACpD,YAAYuB,QAAQ,EACpB;AAEF,OAAO,MAAMC,iBAAiB,OAC5BC,MACAC;IAEA,MAAMC,gBAAgBlC,UAAUiC,QAAQV,IAAI;IAC5C,MAAMY,gBAAgBjC,YAAY+B,QAAQV,IAAI;IAC9C,MAAMa,eAAeH,QAAQG,YAAY,IAAI;IAC7C,MAAMC,eAAepC,UAAUgC,QAAQI,YAAY,IAAIJ,QAAQV,IAAI;IACnE,MAAMe,kBAAkB,MAAMvD,kBAAkBiD,MAAM;IACtD,MAAM,EAAEO,kBAAkB,EAAEC,GAAG,EAAE,GAAGpB,gBAAgBY,MAAM;QACxDT,MAAMU,QAAQV,IAAI;QAClBkB,WAAWR,QAAQQ,SAAS;QAC5BC,cAAcT,QAAQS,YAAY;IACpC;IAEA,IAAIC;IACJ,IAAI;QACFpE,yBAAyByD,MAAMO;QAC/BI,gBAAgB;IAClB,EAAE,OAAM;QACNA,gBAAgB;IAClB;IAEA,IAAI,CAACA,eAAe;QAClB,MAAMxB,mBAAmBa,MAAM;YAC7BT,MAAMU,QAAQV,IAAI;YAClBkB,WAAWR,QAAQQ,SAAS;YAC5BC,cAAcT,QAAQS,YAAY;YAClCE,2BAA2B;QAC7B;IACF;IAEApE,WAAWwD,MAAM3D,kBAAkBmE,KAAK,sBAAsB,CAACK,WAAc,CAAA;YAC3E,GAAGA,QAAQ;YACXC,SAAS;gBAAC;gBAAe;aAA2B;QACtD,CAAA;IAEA,MAAMC,gBAAgBxE,yBAAyByD,MAAMO;IACrD,MAAMS,cAActC,WAClBsB,MACAe,eACAd,QAAQP,MAAM,KAAK,UAAU,OAAO;IAEtC,MAAMuB,cAAc;IACpB,MAAMC,cAAcjB,QAAQP,MAAM,KAAK,UAAU,SAAS;IAC1D,MAAMyB,kBAAkB;IACxB,MAAMC,gBAAgB,GAAGjD,YAAY6B,MAAM,CAAC,EAAEK,cAAc;IAC5D,MAAMgB,cACJpB,QAAQP,MAAM,KAAK,UACf,+CACA;IAEN,MAAM4B,kBAAkB;QACtB5B,QAAQO,QAAQP,MAAM;QACtB6B,kBAAkBpB;QAClBqB,sBAAsBjB;QACtBkB,kBAAkBxB,QAAQP,MAAM,KAAK,UAAU,UAAU;QACzDgC,eAAexC,YAAYyC,MAAM;QACjCC,oBAAoB1C,WAAW,CAAC,eAAe;QAC/C2C,eAAe3C,YAAY4C,MAAM;QACjC,GAAGxE,mBAAmB;QACtByE,sBACE9B,QAAQP,MAAM,KAAK,UACf,4BACA;QACNsC,wBACE/B,QAAQP,MAAM,KAAK,UAAU,kBAAkB;QACjDsB;QACAC;QACAgB,aAAa5B;QACba;QACAC;QACAb;QACAc;QACAC;QACA,GAAGtD,QAAQiC,KAAK;IAClB;IAEA,8EAA8E;IAC9E,2EAA2E;IAC3E,qDAAqD;IACrD5D,cACE4D,MACA3D,kBAAkB,YAAY6F,OAAO,EAAE,UACvC1B,KACAc,iBACA;QAAEa,mBAAmB7F,kBAAkB8F,YAAY;IAAC;IAGtD,+EAA+E;IAC/E,8EAA8E;IAC9E,6EAA6E;IAC7E,4BAA4B;IAC5B,MAAMxF,cACJoD,MACA3D,kBAAkBmE,KAAK,OAAO,aAC9B;IAGF,qEAAqE;IACrE,yEAAyE;IACzE9D,UAAUsD,MAAM3D,kBAAkBmE,KAAK,gBAAgB;QACrDe,kBAAkBpB;QAClBkC,UAAU;YACR/B;YACAc;YACAkB,OAAOjB;YACPkB,MAAMvB;YACNwB,MAAMvB;YACNwB,QAAQpC;YACRqC,QAAQxB;YACRyB,YAAYxB;YACZyB,UAAU3C,QAAQP,MAAM;QAC1B;IACF;IACA/B,gBAAgBqC,MAAMQ,KAAK,CAACqC,WAAa;eAAIA;YAAU;SAAmB;IAC1E,MAAM5D,0BAA0Be,MAAMC,QAAQP,MAAM,EAAEL;IACtD,MAAMyD,kBACJ7C,QAAQP,MAAM,KAAK,UACf,yBACA;IACN,MAAMqD,aAAa7G,SACjBsE,KACAnE,kBAAkByC,cAAcC,oBAAoB,OAAO;IAE7D,MAAMiE,qBAAqBxE,iCACzBuC,cAAcnB,IAAI;IAEpB,MAAMqD,KAAK,IAAIvF,WAAWsC,MAAMX;IAChC,MAAM6D,qBAAqB7G,kBACzB,QACA0E,cAAcnB,IAAI,EAClB,UACA;IAEF,MAAMuD,0BAA0B,GAAGhF,YAAY6B,MAAM,CAAC,EAAEhC,UAAUiC,QAAQV,IAAI,EAAE,iBAAiB,CAAC;IAElG,IAAIU,QAAQmD,KAAK,KAAK,QAAQ;QAC5B,MAAMvG,0BACJmD,MACAe,eACA;YACEsC,gBAAgB;YAChBC,iBAAiB;QACnB,GACAjE;QAEF,MAAMxC,0BACJmD,MACAe,eACA;YACEsC,gBAAgB;YAChBC,iBAAiB;QACnB,GACAjE;QAEF,MAAMkE,eAAexC,cAAcyC,OAAO,CAAC,SAAS;QACpD,0EAA0E;QAC1E,yEAAyE;QACzE,6CAA6C;QAC7C,IAAI,CAACD,aAAatD,OAAO,CAACwD,QAAQ,EAAE;YAClC,MAAMC,kBAAkBH,aAAatD,OAAO,CAAC0D,OAAO;YACpD,OAAOJ,aAAatD,OAAO,CAAC0D,OAAO;YACnCJ,aAAatD,OAAO,GAAG;gBACrB,GAAGsD,aAAatD,OAAO;gBACvBwD,UAAU;oBACRR,GAAGW,EAAE,CAAC,GAAGZ,mBAAmB,mCAAmC,CAAC;oBAChEC,GAAGY,KAAK,CAAC,GAAGb,mBAAmB,mCAAmC,CAAC;oBACnEC,GAAGa,KAAK,CACN,UACA,GAAGd,mBAAmB,0CAA0C,CAAC;oBAEnEC,GAAGc,MAAM,CACP,oBACA,GAAGf,mBAAmB,oDAAoD,CAAC;oBAE7EC,GAAGc,MAAM,CACP,cACA,GAAGf,mBAAmB,8CAA8C,CAAC;oBAEvEU;iBACD;gBACDM,UAAU;YACZ;QACF;IACF;IAEAjD,cAAcyC,OAAO,CAACS,QAAQ,GAAG;QAC/BC,UAAU;QACVC,SAAS;YAAC;SAAiC;QAC3ClE,SAAS;YACP0D,SAAS;YACTS,KAAK;QACP;IACF;IACArD,cAAcyC,OAAO,CAAC,aAAa,GAAG;QACpCU,UAAU;QACVjE,SAAS;YACP0D,SAAS,CAAC,IAAI,EAAEZ,WAAW,cAAc,CAAC;YAC1CqB,KAAK;QACP;IACF;IACArD,cAAcyC,OAAO,CAAC,MAAM,GAAG;QAC7BU,UAAU;QACVG,WAAW;YAAC;SAAa;QACzBpE,SAAS;YACP0D,SAAS,CAAC,IAAI,EAAEZ,WAAW,mBAAmB,CAAC;YAC/CqB,KAAK;QACP;QACAE,YAAY;IACd;IACAvD,cAAcyC,OAAO,CAAC,cAAc,GAAG;QACrCU,UAAU;QACVG,WAAW;YAAC;SAAM;QAClBpE,SAAS;YACP0D,SAAS,CAAC,IAAI,EAAEZ,WAAW,CAAC,EAAED,iBAAiB;YAC/CsB,KAAK;QACP;IACF;IACArD,cAAcyC,OAAO,CAAC7B,MAAM,GAAG;QAC7BuC,UAAU;QACVG,WAAW;YAAC;YAAO;SAAc;QACjCpE,SAAS;YACPmE,KAAK;YACLT,SAAS;YACTY,KAAK;gBACHC,WAAW;YACb;QACF;IACF;IACA,4EAA4E;IAC5E,2EAA2E;IAC3E,qDAAqD;IACrD,MAAMC,MACJxE,QAAQmD,KAAK,KAAK,SAAS,MAAMxF,WAAWoC,MAAMC,QAAQwE,GAAG,IAAIC;IAEnE,IAAIzE,QAAQmD,KAAK,KAAK,QAAQ;QAC5B,wEAAwE;QACxE,4EAA4E;QAC5E,8CAA8C;QAC9CrC,cAAcyC,OAAO,CAAC,SAAS,GAAG;YAChCmB,OAAOvH;YACP8G,UAAU;YACVjE,SAAS;gBACP0D,SAAS,GAAGrD,gBAAgB,oDAAoD,EAAE6C,wBAAwB,CAAC,EAAED,oBAAoB;YACnI;YACAmB,WAAW;gBAAC;aAAS;QACvB;QACAjG,+BAA+B2C,eAAe;QAE9C7D,oBACE8C,MACA;YACE4E,SAAS7D;YACTT;YACAuE,iBAAiB;YACjBC,kBAAkB;YAClBC,WAAW;gBAAC5B;aAAwB;QACtC,GACA9D;QAEFjB,+BAA+B2C,eAAe;IAChD;IACA1C,kCAAkC0C,eAAe,WAAW;IAC5DtE,2BAA2BuD,MAAMO,oBAAoBQ;IACrD,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAMiE,WAA0B;QAC9BtF,QAAQO,QAAQP,MAAM;QACtB,GAAI+E,MAAM;YAAEA;QAAI,IAAI,CAAC,CAAC;IACxB;IACAnG,qBACE0B,MACAO,oBACAV,uBACAmF;IAGF,IAAI/E,QAAQmD,KAAK,KAAK,QAAQ;QAC5B,MAAMqB,MAAM,MAAM7G,WAAWoC,MAAMC,QAAQwE,GAAG;QAC9C,MAAM5F,0BAA0BmB,MAAM;YAAEyE;QAAI,GAAGpF;QAC/C,MAAMV,YAAYqB,MAAM;YACtByE;YACAQ,aAAa1E;YACb2E,aAAa1E;YACbL;YACAD;YACAsB,sBAAsBjB;YACtBF;YACA8E,WAAW/E;YACXV,QAAQO,QAAQP,MAAM;YACtBwD;YACAkC,uBAAuB/I,kBACrB,QACA0E,cAAcnB,IAAI,EAClB,UACA;YAEFyF,WAAWpF,QAAQoF,SAAS;YAC5BlC;YACA7C;QACF;IACF;IAEA3D,kBAAkBqD,MAAMX,cAAc;QACpC2F;QACAE,aAAanE,cAAcnB,IAAI;IACjC;IAEA,8EAA8E;IAC9E,6EAA6E;IAC7E,8EAA8E;IAC9E,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,0EAA0E;IAC1E,6BAA6B;IAC7B,IAAIK,QAAQP,MAAM,KAAK,cAAcvD,2BAA2B,QAAQ;QACtEK,WAAWwD,MAAM,gBAAgB,CAACsF;YAChCA,YAAYC,WAAW,GAAG;gBACxB,GAAGD,YAAYC,WAAW;gBAC1B,mCAAmCrG,WAAW,CAAC,YAAY;gBAC3D,gCAAgCA,WAAW,CAAC,YAAY;YAC1D;YACA,OAAOoG;QACT;IACF;IAEA7G,8BAA8BuB,MAAM;QAClC,mBAAmB;QACnB2B,QAAQ;IACV;IAEA,MAAM7D,gCAAgCkC,MAAM;QAACH;KAAsB;IAEnE,MAAMrC,qBAAqBwC;IAC3B,OAAO,IACLnC,oBAAoBmC,MAAMC,QAAQW,yBAAyB,EAAE;YAC3D4E,WAAW;gBAAC;aAAa;QAC3B;AACJ,EAAE;AAEF,eAAezF,eAAe"}
|
|
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 detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport { addStarExport } from '../../utils/ast.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n PRISMA_IMAGE_DEPENDENCIES,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { updateGitIgnore } from '../../utils/git.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { TS_VERSIONS } from '../../utils/versions.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport type { TsRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsRdbMetadata extends IacMetadata {\n readonly engine: TsRdbGeneratorSchema['engine'];\n}\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsRdbMetadata>()({\n ts: [\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@aws-sdk/client-secrets-manager' },\n { name: '@aws-sdk/rds-signer' },\n { name: '@prisma/client' },\n { name: '@prisma/adapter-mariadb', when: (m) => m.engine === 'mysql' },\n { name: 'mariadb', when: (m) => m.engine === 'mysql' },\n { name: '@prisma/adapter-pg', when: (m) => m.engine !== 'mysql' },\n { name: 'pg', when: (m) => m.engine !== 'mysql' },\n { name: '@types/aws-lambda', dev: true },\n { name: '@types/pg', when: (m) => m.engine !== 'mysql', dev: true },\n // The prisma CLI and tsx run migration/seed scripts from the root.\n { name: 'prisma', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(PRISMA_IMAGE_DEPENDENCIES),\n ],\n});\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 subDirectory: options.subDirectory,\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: fullyQualifiedName,\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n deepmergeTsVersion: TS_VERSIONS['deepmerge-ts'],\n mysql2Version: TS_VERSIONS.mysql2,\n ...nodeImageVersions(),\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 // The Prisma schema and models, the handlers and the prisma client module are\n // all user-editable, so a re-run (to add infrastructure, or after a failed\n // run) must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The barrel re-exports prisma.ts. `tsProjectGenerator` writes a stub index.ts\n // when it creates the project, so the re-export is added to whatever is there\n // rather than replacing it — which also leaves a user's own additions to the\n // barrel alone on a re-run.\n await addStarExport(\n tree,\n joinPathFragments(dir, 'src', 'index.ts'),\n './prisma.js',\n );\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: options.engine,\n },\n });\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine, DEPENDENCIES);\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, DEPENDENCIES);\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(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n },\n DEPENDENCIES,\n );\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n },\n DEPENDENCIES,\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.cpDir(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cpFile(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cpFile(\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 cache: true,\n inputs: ['default'],\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 dependsOn: ['pull-image'],\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 // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated, in\n // which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (options.infra !== 'none') {\n // The migration image ships under both providers — Terraform pushes the\n // locally built tag, CDK builds the same context as an image asset — so the\n // build and its scan are wired up for either.\n projectConfig.targets['docker'] = {\n cache: IMAGE_BUILD_CACHE,\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 addArtifactDependencyToTargets(projectConfig, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag],\n },\n DEPENDENCIES,\n );\n addArtifactDependencyToTargets(projectConfig, 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsRdbMetadata = {\n engine: options.engine,\n ...(iac ? { iac } : {}),\n };\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n TS_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: 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 addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: projectConfig.root,\n });\n\n // @prisma/adapter-pg depends on @types/pg ^8.16.0. Yarn does not dedupe it to\n // the workspace's pinned @types/pg, so it installs a separate copy under the\n // adapter's own node_modules whenever a newer @types/pg is published. The two\n // copies declare structurally incompatible Pool types, so passing our `new\n // Pool(...)` to `new PrismaPg(...)` fails to compile. Scope the resolution to\n // the adapter so other @types/pg consumers are unaffected. Classic yarn only\n // honours the `**/`-prefixed descriptor in a workspace and berry only the\n // bare one, so declare both.\n if (options.engine === 'postgres' && detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n '@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n };\n return packageJson;\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","detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","writeJson","addTsDependencies","addStarExport","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","PRISMA_IMAGE_DEPENDENCIES","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","TS_VERSIONS","tsProjectGenerator","getTsLibDetails","DEPENDENCIES","ts","name","when","m","engine","dev","root","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","deepmergeTsVersion","mysql2Version","mysql2","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","overwriteStrategy","KeepExisting","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","patterns","waitForDbScript","scriptsDir","relativePathToRoot","fs","migrationBundleDir","migrationDockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cpDir","cpFile","parallel","generate","executor","cache","inputs","outputs","cwd","dependsOn","continuous","env","LOCAL_DEV","iac","undefined","project","trivyTargetName","dockerTargetName","imageTags","metadata","projectName","projectRoot","adminUser","createDbUserBundleDir","framework","packageJson","resolutions","languages"],"mappings":"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"}
|
|
@@ -1227,7 +1227,7 @@ exports[`react-website generator > Tanstack router integration > should generate
|
|
|
1227
1227
|
"biome": ["default", "{workspaceRoot}/biome.json"],
|
|
1228
1228
|
"default": [
|
|
1229
1229
|
{
|
|
1230
|
-
"dependentTasksOutputFiles": "!{reports,coverage}
|
|
1230
|
+
"dependentTasksOutputFiles": "!{reports/**,coverage/**,dist/**/checkov/checkov_report.json,dist/**/test-output/vitest/coverage/**}",
|
|
1231
1231
|
"transitive": true
|
|
1232
1232
|
}
|
|
1233
1233
|
]
|
|
@@ -2202,6 +2202,55 @@ export * from './core/index.js';
|
|
|
2202
2202
|
"
|
|
2203
2203
|
`;
|
|
2204
2204
|
|
|
2205
|
+
exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/tests/global-setup.ts 1`] = `
|
|
2206
|
+
"import { existsSync, mkdtempSync, rmSync } from 'node:fs';
|
|
2207
|
+
import { tmpdir } from 'node:os';
|
|
2208
|
+
import { join } from 'node:path';
|
|
2209
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
2210
|
+
|
|
2211
|
+
const VARIABLES = ['TMPDIR', 'TEMP', 'TMP', 'CDK_CONTEXT_JSON'];
|
|
2212
|
+
|
|
2213
|
+
const remove = (dir: string) => {
|
|
2214
|
+
try {
|
|
2215
|
+
rmSync(dir, { recursive: true, force: true });
|
|
2216
|
+
} catch {
|
|
2217
|
+
// Retried below.
|
|
2218
|
+
}
|
|
2219
|
+
return !existsSync(dir);
|
|
2220
|
+
};
|
|
2221
|
+
|
|
2222
|
+
export default function setup() {
|
|
2223
|
+
const previous = VARIABLES.map((name) => [name, process.env[name]] as const);
|
|
2224
|
+
const dir = mkdtempSync(join(tmpdir(), 'cdk-test-'));
|
|
2225
|
+
process.env.TMPDIR = dir;
|
|
2226
|
+
process.env.TEMP = dir;
|
|
2227
|
+
process.env.TMP = dir;
|
|
2228
|
+
process.env.CDK_CONTEXT_JSON = JSON.stringify({
|
|
2229
|
+
...JSON.parse(process.env.CDK_CONTEXT_JSON ?? '{}'),
|
|
2230
|
+
'aws:cdk:bundling-stacks': [],
|
|
2231
|
+
});
|
|
2232
|
+
|
|
2233
|
+
return async () => {
|
|
2234
|
+
// Exiting workers may still be deleting their cdk.out here, so retry.
|
|
2235
|
+
const deadline = Date.now() + 2000;
|
|
2236
|
+
while (!remove(dir) && Date.now() < deadline) {
|
|
2237
|
+
await sleep(50);
|
|
2238
|
+
}
|
|
2239
|
+
if (existsSync(dir)) {
|
|
2240
|
+
console.warn(\`Could not remove the CDK test directory \${dir}\`);
|
|
2241
|
+
}
|
|
2242
|
+
for (const [name, value] of previous) {
|
|
2243
|
+
if (value === undefined) {
|
|
2244
|
+
delete process.env[name];
|
|
2245
|
+
} else {
|
|
2246
|
+
process.env[name] = value;
|
|
2247
|
+
}
|
|
2248
|
+
}
|
|
2249
|
+
};
|
|
2250
|
+
}
|
|
2251
|
+
"
|
|
2252
|
+
`;
|
|
2253
|
+
|
|
2205
2254
|
exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/tsconfig.json 1`] = `
|
|
2206
2255
|
"{
|
|
2207
2256
|
"extends": "../../../tsconfig.base.json",
|
|
@@ -2302,6 +2351,7 @@ export default defineConfig(() => ({
|
|
|
2302
2351
|
root: import.meta.dirname,
|
|
2303
2352
|
cacheDir: '../../../node_modules/.vite/packages/common/constructs',
|
|
2304
2353
|
test: {
|
|
2354
|
+
globalSetup: ['./tests/global-setup.ts'],
|
|
2305
2355
|
passWithNoTests: true,
|
|
2306
2356
|
name: '@proj/common-constructs',
|
|
2307
2357
|
watch: false,
|
|
@@ -3103,7 +3153,7 @@ exports[`react-website generator > Tanstack router integration > should generate
|
|
|
3103
3153
|
"biome": ["default", "{workspaceRoot}/biome.json"],
|
|
3104
3154
|
"default": [
|
|
3105
3155
|
{
|
|
3106
|
-
"dependentTasksOutputFiles": "!{reports,coverage}
|
|
3156
|
+
"dependentTasksOutputFiles": "!{reports/**,coverage/**,dist/**/checkov/checkov_report.json,dist/**/test-output/vitest/coverage/**}",
|
|
3107
3157
|
"transitive": true
|
|
3108
3158
|
}
|
|
3109
3159
|
]
|
|
@@ -4082,6 +4132,55 @@ export * from './core/index.js';
|
|
|
4082
4132
|
"
|
|
4083
4133
|
`;
|
|
4084
4134
|
|
|
4135
|
+
exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/tests/global-setup.ts 1`] = `
|
|
4136
|
+
"import { existsSync, mkdtempSync, rmSync } from 'node:fs';
|
|
4137
|
+
import { tmpdir } from 'node:os';
|
|
4138
|
+
import { join } from 'node:path';
|
|
4139
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
4140
|
+
|
|
4141
|
+
const VARIABLES = ['TMPDIR', 'TEMP', 'TMP', 'CDK_CONTEXT_JSON'];
|
|
4142
|
+
|
|
4143
|
+
const remove = (dir: string) => {
|
|
4144
|
+
try {
|
|
4145
|
+
rmSync(dir, { recursive: true, force: true });
|
|
4146
|
+
} catch {
|
|
4147
|
+
// Retried below.
|
|
4148
|
+
}
|
|
4149
|
+
return !existsSync(dir);
|
|
4150
|
+
};
|
|
4151
|
+
|
|
4152
|
+
export default function setup() {
|
|
4153
|
+
const previous = VARIABLES.map((name) => [name, process.env[name]] as const);
|
|
4154
|
+
const dir = mkdtempSync(join(tmpdir(), 'cdk-test-'));
|
|
4155
|
+
process.env.TMPDIR = dir;
|
|
4156
|
+
process.env.TEMP = dir;
|
|
4157
|
+
process.env.TMP = dir;
|
|
4158
|
+
process.env.CDK_CONTEXT_JSON = JSON.stringify({
|
|
4159
|
+
...JSON.parse(process.env.CDK_CONTEXT_JSON ?? '{}'),
|
|
4160
|
+
'aws:cdk:bundling-stacks': [],
|
|
4161
|
+
});
|
|
4162
|
+
|
|
4163
|
+
return async () => {
|
|
4164
|
+
// Exiting workers may still be deleting their cdk.out here, so retry.
|
|
4165
|
+
const deadline = Date.now() + 2000;
|
|
4166
|
+
while (!remove(dir) && Date.now() < deadline) {
|
|
4167
|
+
await sleep(50);
|
|
4168
|
+
}
|
|
4169
|
+
if (existsSync(dir)) {
|
|
4170
|
+
console.warn(\`Could not remove the CDK test directory \${dir}\`);
|
|
4171
|
+
}
|
|
4172
|
+
for (const [name, value] of previous) {
|
|
4173
|
+
if (value === undefined) {
|
|
4174
|
+
delete process.env[name];
|
|
4175
|
+
} else {
|
|
4176
|
+
process.env[name] = value;
|
|
4177
|
+
}
|
|
4178
|
+
}
|
|
4179
|
+
};
|
|
4180
|
+
}
|
|
4181
|
+
"
|
|
4182
|
+
`;
|
|
4183
|
+
|
|
4085
4184
|
exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/tsconfig.json 1`] = `
|
|
4086
4185
|
"{
|
|
4087
4186
|
"extends": "../../../tsconfig.base.json",
|
|
@@ -4182,6 +4281,7 @@ export default defineConfig(() => ({
|
|
|
4182
4281
|
root: import.meta.dirname,
|
|
4183
4282
|
cacheDir: '../../../node_modules/.vite/packages/common/constructs',
|
|
4184
4283
|
test: {
|
|
4284
|
+
globalSetup: ['./tests/global-setup.ts'],
|
|
4185
4285
|
passWithNoTests: true,
|
|
4186
4286
|
name: '@proj/common-constructs',
|
|
4187
4287
|
watch: false,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`cdk test global setup > addCdkTestGlobalSetup > should keep the infra vitest config well formed 1`] = `
|
|
4
|
+
"import { defineConfig } from 'vitest/config';
|
|
5
|
+
|
|
6
|
+
export default defineConfig(() => ({
|
|
7
|
+
root: import.meta.dirname,
|
|
8
|
+
cacheDir: '../../node_modules/.vite/packages/infra',
|
|
9
|
+
test: {
|
|
10
|
+
globalSetup: ['./tests/global-setup.ts'],
|
|
11
|
+
passWithNoTests: true,
|
|
12
|
+
name: '@proj/infra',
|
|
13
|
+
watch: false,
|
|
14
|
+
globals: true,
|
|
15
|
+
environment: 'jsdom',
|
|
16
|
+
include: ['{src,tests}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
|
|
17
|
+
reporters: ['default'],
|
|
18
|
+
coverage: {
|
|
19
|
+
reportsDirectory: '../../dist/packages/infra/test-output/vitest/coverage',
|
|
20
|
+
provider: 'v8' as const,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
"
|
|
25
|
+
`;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Tree } from '@nx/devkit';
|
|
2
|
+
/** Where the vitest global setup lives, relative to the project root. */
|
|
3
|
+
export declare const CDK_TEST_GLOBAL_SETUP = "tests/global-setup.ts";
|
|
4
|
+
/** The `globalSetup` entry the vitest config registers. */
|
|
5
|
+
export declare const CDK_TEST_GLOBAL_SETUP_ENTRY = "./tests/global-setup.ts";
|
|
6
|
+
export declare const CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR: string;
|
|
7
|
+
/** The global setup exactly as it is vended (the template has no variables). */
|
|
8
|
+
export declare const renderCdkTestGlobalSetup: () => string;
|
|
9
|
+
/**
|
|
10
|
+
* Register the global setup as the first property of the config's own `test`
|
|
11
|
+
* object. Prepending means no trailing comma to manage, and the `not some`
|
|
12
|
+
* guard leaves a config that already declares a global setup alone.
|
|
13
|
+
*/
|
|
14
|
+
export declare const GLOBAL_SETUP_PATTERN = "`test: { $props }` => `test: { globalSetup: ['./tests/global-setup.ts'], $props }` where {\n $props <: within `defineConfig($_)`,\n $props <: not some `globalSetup: $_`\n}";
|
|
15
|
+
/** The project's vitest config, if it has one. */
|
|
16
|
+
export declare const findVitestConfig: (tree: Tree, projectRoot: string) => string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Give a CDK project's tests a per-run temp directory with asset bundling
|
|
19
|
+
* skipped: vend `tests/global-setup.ts` (kept if it exists) and register it in
|
|
20
|
+
* the vitest config. The caller formats.
|
|
21
|
+
*/
|
|
22
|
+
export declare const addCdkTestGlobalSetup: (tree: Tree, projectRoot: string) => Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/ import { readFileSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { generateFiles, joinPathFragments, OverwriteStrategy } from "@nx/devkit";
|
|
7
|
+
import { applyGritQL } from "./ast.js";
|
|
8
|
+
/** Where the vitest global setup lives, relative to the project root. */ export const CDK_TEST_GLOBAL_SETUP = 'tests/global-setup.ts';
|
|
9
|
+
/** The `globalSetup` entry the vitest config registers. */ export const CDK_TEST_GLOBAL_SETUP_ENTRY = `./${CDK_TEST_GLOBAL_SETUP}`;
|
|
10
|
+
export const CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR = join(import.meta.dirname, 'files', 'cdk-test-setup');
|
|
11
|
+
/** The global setup exactly as it is vended (the template has no variables). */ export const renderCdkTestGlobalSetup = ()=>readFileSync(join(CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR, `${CDK_TEST_GLOBAL_SETUP}.template`), 'utf-8');
|
|
12
|
+
/**
|
|
13
|
+
* Register the global setup as the first property of the config's own `test`
|
|
14
|
+
* object. Prepending means no trailing comma to manage, and the `not some`
|
|
15
|
+
* guard leaves a config that already declares a global setup alone.
|
|
16
|
+
*/ export const GLOBAL_SETUP_PATTERN = `\`test: { $props }\` => \`test: { globalSetup: ['${CDK_TEST_GLOBAL_SETUP_ENTRY}'], $props }\` where {
|
|
17
|
+
$props <: within \`defineConfig($_)\`,
|
|
18
|
+
$props <: not some \`globalSetup: $_\`
|
|
19
|
+
}`;
|
|
20
|
+
/** The project's vitest config, if it has one. */ export const findVitestConfig = (tree, projectRoot)=>[
|
|
21
|
+
joinPathFragments(projectRoot, 'vitest.config.mts'),
|
|
22
|
+
joinPathFragments(projectRoot, 'vite.config.mts')
|
|
23
|
+
].find((config)=>tree.exists(config));
|
|
24
|
+
/**
|
|
25
|
+
* Give a CDK project's tests a per-run temp directory with asset bundling
|
|
26
|
+
* skipped: vend `tests/global-setup.ts` (kept if it exists) and register it in
|
|
27
|
+
* the vitest config. The caller formats.
|
|
28
|
+
*/ export const addCdkTestGlobalSetup = async (tree, projectRoot)=>{
|
|
29
|
+
generateFiles(tree, CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR, projectRoot, {}, {
|
|
30
|
+
overwriteStrategy: OverwriteStrategy.KeepExisting
|
|
31
|
+
});
|
|
32
|
+
const configPath = findVitestConfig(tree, projectRoot);
|
|
33
|
+
if (configPath) {
|
|
34
|
+
await applyGritQL(tree, configPath, GLOBAL_SETUP_PATTERN);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=cdk-test-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/cdk-test-setup.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n} from '@nx/devkit';\nimport { applyGritQL } from './ast.js';\n\n/** Where the vitest global setup lives, relative to the project root. */\nexport const CDK_TEST_GLOBAL_SETUP = 'tests/global-setup.ts';\n\n/** The `globalSetup` entry the vitest config registers. */\nexport const CDK_TEST_GLOBAL_SETUP_ENTRY = `./${CDK_TEST_GLOBAL_SETUP}`;\n\nexport const CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR = join(\n import.meta.dirname,\n 'files',\n 'cdk-test-setup',\n);\n\n/** The global setup exactly as it is vended (the template has no variables). */\nexport const renderCdkTestGlobalSetup = (): string =>\n readFileSync(\n join(\n CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR,\n `${CDK_TEST_GLOBAL_SETUP}.template`,\n ),\n 'utf-8',\n );\n\n/**\n * Register the global setup as the first property of the config's own `test`\n * object. Prepending means no trailing comma to manage, and the `not some`\n * guard leaves a config that already declares a global setup alone.\n */\nexport const GLOBAL_SETUP_PATTERN = `\\`test: { $props }\\` => \\`test: { globalSetup: ['${CDK_TEST_GLOBAL_SETUP_ENTRY}'], $props }\\` where {\n $props <: within \\`defineConfig($_)\\`,\n $props <: not some \\`globalSetup: $_\\`\n}`;\n\n/** The project's vitest config, if it has one. */\nexport const findVitestConfig = (\n tree: Tree,\n projectRoot: string,\n): string | undefined =>\n [\n joinPathFragments(projectRoot, 'vitest.config.mts'),\n joinPathFragments(projectRoot, 'vite.config.mts'),\n ].find((config) => tree.exists(config));\n\n/**\n * Give a CDK project's tests a per-run temp directory with asset bundling\n * skipped: vend `tests/global-setup.ts` (kept if it exists) and register it in\n * the vitest config. The caller formats.\n */\nexport const addCdkTestGlobalSetup = async (\n tree: Tree,\n projectRoot: string,\n): Promise<void> => {\n generateFiles(\n tree,\n CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR,\n projectRoot,\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n const configPath = findVitestConfig(tree, projectRoot);\n if (configPath) {\n await applyGritQL(tree, configPath, GLOBAL_SETUP_PATTERN);\n }\n};\n"],"names":["readFileSync","join","generateFiles","joinPathFragments","OverwriteStrategy","applyGritQL","CDK_TEST_GLOBAL_SETUP","CDK_TEST_GLOBAL_SETUP_ENTRY","CDK_TEST_GLOBAL_SETUP_TEMPLATE_DIR","dirname","renderCdkTestGlobalSetup","GLOBAL_SETUP_PATTERN","findVitestConfig","tree","projectRoot","find","config","exists","addCdkTestGlobalSetup","overwriteStrategy","KeepExisting","configPath"],"mappings":"AAAA;;;CAGC,GACD,SAASA,YAAY,QAAQ,UAAU;AACvC,SAASC,IAAI,QAAQ,YAAY;AACjC,SACEC,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,QAEZ,aAAa;AACpB,SAASC,WAAW,QAAQ,WAAW;AAEvC,uEAAuE,GACvE,OAAO,MAAMC,wBAAwB,wBAAwB;AAE7D,yDAAyD,GACzD,OAAO,MAAMC,8BAA8B,CAAC,EAAE,EAAED,uBAAuB,CAAC;AAExE,OAAO,MAAME,qCAAqCP,KAChD,YAAYQ,OAAO,EACnB,SACA,kBACA;AAEF,8EAA8E,GAC9E,OAAO,MAAMC,2BAA2B,IACtCV,aACEC,KACEO,oCACA,GAAGF,sBAAsB,SAAS,CAAC,GAErC,SACA;AAEJ;;;;CAIC,GACD,OAAO,MAAMK,uBAAuB,CAAC,iDAAiD,EAAEJ,4BAA4B;;;CAGnH,CAAC,CAAC;AAEH,gDAAgD,GAChD,OAAO,MAAMK,mBAAmB,CAC9BC,MACAC,cAEA;QACEX,kBAAkBW,aAAa;QAC/BX,kBAAkBW,aAAa;KAChC,CAACC,IAAI,CAAC,CAACC,SAAWH,KAAKI,MAAM,CAACD,SAAS;AAE1C;;;;CAIC,GACD,OAAO,MAAME,wBAAwB,OACnCL,MACAC;IAEAZ,cACEW,MACAL,oCACAM,aACA,CAAC,GACD;QACEK,mBAAmBf,kBAAkBgB,YAAY;IACnD;IAGF,MAAMC,aAAaT,iBAAiBC,MAAMC;IAC1C,IAAIO,YAAY;QACd,MAAMhB,YAAYQ,MAAMQ,YAAYV;IACtC;AACF,EAAE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { existsSync, mkdtempSync, rmSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
5
|
+
|
|
6
|
+
const VARIABLES = ['TMPDIR', 'TEMP', 'TMP', 'CDK_CONTEXT_JSON'];
|
|
7
|
+
|
|
8
|
+
const remove = (dir: string) => {
|
|
9
|
+
try {
|
|
10
|
+
rmSync(dir, { recursive: true, force: true });
|
|
11
|
+
} catch {
|
|
12
|
+
// Retried below.
|
|
13
|
+
}
|
|
14
|
+
return !existsSync(dir);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default function setup() {
|
|
18
|
+
const previous = VARIABLES.map((name) => [name, process.env[name]] as const);
|
|
19
|
+
const dir = mkdtempSync(join(tmpdir(), 'cdk-test-'));
|
|
20
|
+
process.env.TMPDIR = dir;
|
|
21
|
+
process.env.TEMP = dir;
|
|
22
|
+
process.env.TMP = dir;
|
|
23
|
+
process.env.CDK_CONTEXT_JSON = JSON.stringify({
|
|
24
|
+
...JSON.parse(process.env.CDK_CONTEXT_JSON ?? '{}'),
|
|
25
|
+
'aws:cdk:bundling-stacks': [],
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return async () => {
|
|
29
|
+
// Exiting workers may still be deleting their cdk.out here, so retry.
|
|
30
|
+
const deadline = Date.now() + 2000;
|
|
31
|
+
while (!remove(dir) && Date.now() < deadline) {
|
|
32
|
+
await sleep(50);
|
|
33
|
+
}
|
|
34
|
+
if (existsSync(dir)) {
|
|
35
|
+
console.warn(`Could not remove the CDK test directory ${dir}`);
|
|
36
|
+
}
|
|
37
|
+
for (const [name, value] of previous) {
|
|
38
|
+
if (value === undefined) {
|
|
39
|
+
delete process.env[name];
|
|
40
|
+
} else {
|
|
41
|
+
process.env[name] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateJson } from "@nx/devkit";
|
|
5
5
|
import terraformProjectGenerator from "../terraform/project/generator.js";
|
|
6
6
|
import tsProjectGenerator from "../ts/lib/generator.js";
|
|
7
|
+
import { addCdkTestGlobalSetup } from "./cdk-test-setup.js";
|
|
7
8
|
import { readAwsNxPluginConfig } from "./config/utils.js";
|
|
8
9
|
import { addDependenciesToPackageJson } from "./dependencies.js";
|
|
9
10
|
import { formatFilesInSubtree } from "./format.js";
|
|
@@ -46,6 +47,7 @@ export async function sharedConstructsGenerator(tree, options, declaration) {
|
|
|
46
47
|
]), withVersions(declaration, [
|
|
47
48
|
'@types/node'
|
|
48
49
|
]), joinPathFragments(joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR), 'package.json'));
|
|
50
|
+
await addCdkTestGlobalSetup(tree, joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR));
|
|
49
51
|
await formatFilesInSubtree(tree);
|
|
50
52
|
}
|
|
51
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/shared-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport terraformProjectGenerator from '../terraform/project/generator.js';\nimport tsProjectGenerator from '../ts/lib/generator.js';\nimport { readAwsNxPluginConfig } from './config/utils.js';\nimport type {\n DependencyDeclaration,\n MustDeclare,\n} from './declared-dependencies.js';\nimport { addDependenciesToPackageJson } from './dependencies.js';\nimport { formatFilesInSubtree } from './format.js';\nimport type { Iac } from './iac.js';\nimport { esmVars } from './module-format.js';\nimport { getNpmScopePrefix } from './npm-scope.js';\nimport { getPackageManagerDisplayCommands } from './pkg-manager.js';\nimport {\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DEPENDENCIES,\n SHARED_CONSTRUCTS_DIR,\n SHARED_CONSTRUCTS_NAME,\n SHARED_TERRAFORM_DIR,\n SHARED_TERRAFORM_NAME,\n} from './shared-constructs-constants.js';\n\nexport { SHARED_CONSTRUCTS_DEPENDENCIES };\n\nimport { terraformProviderVersions, withVersions } from './versions.js';\n\nexport interface SharedConstructsGeneratorOptions {\n iac: Iac;\n}\n\nexport async function sharedConstructsGenerator<\n const D extends DependencyDeclaration,\n>(\n tree: Tree,\n options: SharedConstructsGeneratorOptions,\n declaration: D & MustDeclare<typeof SHARED_CONSTRUCTS_DEPENDENCIES, D>,\n) {\n const { iac } = options;\n const npmScopePrefix = getNpmScopePrefix(tree);\n updateGitignore(tree);\n\n if (iac === 'cdk') {\n if (\n !tree.exists(\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'project.json'),\n )\n ) {\n await tsProjectGenerator(tree, {\n name: SHARED_CONSTRUCTS_NAME,\n directory: PACKAGES_DIR,\n subDirectory: SHARED_CONSTRUCTS_DIR,\n });\n tree.delete(\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src'),\n );\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n SHARED_CONSTRUCTS_DIR,\n 'src',\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src'),\n {\n npmScopePrefix,\n scopeAlias: npmScopePrefix,\n tags: readAwsNxPluginConfig(tree)?.tags ?? [],\n ...esmVars(tree),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common', 'readme'),\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR),\n {\n fullyQualifiedName: `${npmScopePrefix}${SHARED_CONSTRUCTS_NAME}`,\n name: SHARED_CONSTRUCTS_NAME,\n pkgMgrCmd: getPackageManagerDisplayCommands().exec,\n },\n {\n overwriteStrategy: OverwriteStrategy.Overwrite,\n },\n );\n addDependenciesToPackageJson(\n tree,\n withVersions(\n declaration as DependencyDeclaration<\n typeof SHARED_CONSTRUCTS_DEPENDENCIES\n >,\n ['constructs', 'aws-cdk-lib'],\n ),\n withVersions(\n declaration as DependencyDeclaration<\n typeof SHARED_CONSTRUCTS_DEPENDENCIES\n >,\n ['@types/node'],\n ),\n joinPathFragments(\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR),\n 'package.json',\n ),\n );\n await formatFilesInSubtree(tree);\n }\n }\n\n // Handle Terraform provider\n if (iac === 'terraform') {\n const terraformLibPath = joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n );\n if (!tree.exists(joinPathFragments(terraformLibPath, 'project.json'))) {\n await terraformProjectGenerator(tree, {\n name: SHARED_TERRAFORM_NAME,\n directory: joinPathFragments(PACKAGES_DIR, 'common'),\n type: 'library',\n });\n\n // `build` is a no-op orchestration target that produces no files of its\n // own. Terraform writes runtime-config entries into\n // `dist/{projectRoot}/runtime-config` at apply time, and other terraform\n // projects contribute their own entries to the same directory. Without\n // explicit outputs, Nx infers `dist/{projectRoot}` as this target's\n // cached output and, on a cache hit, restores the cached copy over the\n // freshly-applied config — wiping the very values consumers read. Declare\n // no outputs so Nx never treats runtime config as a cacheable artifact.\n updateJson(\n tree,\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'project.json'),\n (projectConfig: ProjectConfiguration) => {\n projectConfig.targets ??= {};\n projectConfig.targets.build ??= {};\n projectConfig.targets.build.outputs = [];\n return projectConfig;\n },\n );\n\n tree.delete(joinPathFragments(terraformLibPath, 'src', 'main.tf'));\n\n // Create the metrics.tf file with empty initial values\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'terraform'),\n terraformLibPath,\n { ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n await formatFilesInSubtree(tree);\n }\n }\n}\n\nconst updateGitignore = (tree: Tree) => {\n const gitignore = tree.exists('.gitignore')\n ? tree.read('.gitignore', 'utf-8')\n : '';\n const regex = /runtime-config.json/gm;\n const hasRuntimeConfig = regex.test(gitignore ?? '');\n if (hasRuntimeConfig) {\n return;\n }\n tree.write('.gitignore', `${gitignore}\\n\\nruntime-config.json`);\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","terraformProjectGenerator","tsProjectGenerator","readAwsNxPluginConfig","addDependenciesToPackageJson","formatFilesInSubtree","esmVars","getNpmScopePrefix","getPackageManagerDisplayCommands","PACKAGES_DIR","SHARED_CONSTRUCTS_DEPENDENCIES","SHARED_CONSTRUCTS_DIR","SHARED_CONSTRUCTS_NAME","SHARED_TERRAFORM_DIR","SHARED_TERRAFORM_NAME","terraformProviderVersions","withVersions","sharedConstructsGenerator","tree","options","declaration","iac","npmScopePrefix","updateGitignore","exists","name","directory","subDirectory","delete","dirname","scopeAlias","tags","overwriteStrategy","KeepExisting","fullyQualifiedName","pkgMgrCmd","exec","Overwrite","terraformLibPath","type","projectConfig","targets","build","outputs","gitignore","read","regex","hasRuntimeConfig","test","write"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,EAGjBC,UAAU,QACL,aAAa;AACpB,OAAOC,+BAA+B,oCAAoC;AAC1E,OAAOC,wBAAwB,yBAAyB;AACxD,SAASC,qBAAqB,QAAQ,oBAAoB;AAK1D,SAASC,4BAA4B,QAAQ,oBAAoB;AACjE,SAASC,oBAAoB,QAAQ,cAAc;AAEnD,SAASC,OAAO,QAAQ,qBAAqB;AAC7C,SAASC,iBAAiB,QAAQ,iBAAiB;AACnD,SAASC,gCAAgC,QAAQ,mBAAmB;AACpE,SACEC,YAAY,EACZC,8BAA8B,EAC9BC,qBAAqB,EACrBC,sBAAsB,EACtBC,oBAAoB,EACpBC,qBAAqB,QAChB,mCAAmC;AAE1C,SAASJ,8BAA8B,GAAG;AAE1C,SAASK,yBAAyB,EAAEC,YAAY,QAAQ,gBAAgB;AAMxE,OAAO,eAAeC,0BAGpBC,IAAU,EACVC,OAAyC,EACzCC,WAAsE;IAEtE,MAAM,EAAEC,GAAG,EAAE,GAAGF;IAChB,MAAMG,iBAAiBf,kBAAkBW;IACzCK,gBAAgBL;IAEhB,IAAIG,QAAQ,OAAO;QACjB,IACE,CAACH,KAAKM,MAAM,
|
|
1
|
+
{"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/shared-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport terraformProjectGenerator from '../terraform/project/generator.js';\nimport tsProjectGenerator from '../ts/lib/generator.js';\nimport { addCdkTestGlobalSetup } from './cdk-test-setup.js';\nimport { readAwsNxPluginConfig } from './config/utils.js';\nimport type {\n DependencyDeclaration,\n MustDeclare,\n} from './declared-dependencies.js';\nimport { addDependenciesToPackageJson } from './dependencies.js';\nimport { formatFilesInSubtree } from './format.js';\nimport type { Iac } from './iac.js';\nimport { esmVars } from './module-format.js';\nimport { getNpmScopePrefix } from './npm-scope.js';\nimport { getPackageManagerDisplayCommands } from './pkg-manager.js';\nimport {\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DEPENDENCIES,\n SHARED_CONSTRUCTS_DIR,\n SHARED_CONSTRUCTS_NAME,\n SHARED_TERRAFORM_DIR,\n SHARED_TERRAFORM_NAME,\n} from './shared-constructs-constants.js';\n\nexport { SHARED_CONSTRUCTS_DEPENDENCIES };\n\nimport { terraformProviderVersions, withVersions } from './versions.js';\n\nexport interface SharedConstructsGeneratorOptions {\n iac: Iac;\n}\n\nexport async function sharedConstructsGenerator<\n const D extends DependencyDeclaration,\n>(\n tree: Tree,\n options: SharedConstructsGeneratorOptions,\n declaration: D & MustDeclare<typeof SHARED_CONSTRUCTS_DEPENDENCIES, D>,\n) {\n const { iac } = options;\n const npmScopePrefix = getNpmScopePrefix(tree);\n updateGitignore(tree);\n\n if (iac === 'cdk') {\n if (\n !tree.exists(\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'project.json'),\n )\n ) {\n await tsProjectGenerator(tree, {\n name: SHARED_CONSTRUCTS_NAME,\n directory: PACKAGES_DIR,\n subDirectory: SHARED_CONSTRUCTS_DIR,\n });\n tree.delete(\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src'),\n );\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n SHARED_CONSTRUCTS_DIR,\n 'src',\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src'),\n {\n npmScopePrefix,\n scopeAlias: npmScopePrefix,\n tags: readAwsNxPluginConfig(tree)?.tags ?? [],\n ...esmVars(tree),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common', 'readme'),\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR),\n {\n fullyQualifiedName: `${npmScopePrefix}${SHARED_CONSTRUCTS_NAME}`,\n name: SHARED_CONSTRUCTS_NAME,\n pkgMgrCmd: getPackageManagerDisplayCommands().exec,\n },\n {\n overwriteStrategy: OverwriteStrategy.Overwrite,\n },\n );\n addDependenciesToPackageJson(\n tree,\n withVersions(\n declaration as DependencyDeclaration<\n typeof SHARED_CONSTRUCTS_DEPENDENCIES\n >,\n ['constructs', 'aws-cdk-lib'],\n ),\n withVersions(\n declaration as DependencyDeclaration<\n typeof SHARED_CONSTRUCTS_DEPENDENCIES\n >,\n ['@types/node'],\n ),\n joinPathFragments(\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR),\n 'package.json',\n ),\n );\n await addCdkTestGlobalSetup(\n tree,\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR),\n );\n await formatFilesInSubtree(tree);\n }\n }\n\n // Handle Terraform provider\n if (iac === 'terraform') {\n const terraformLibPath = joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n );\n if (!tree.exists(joinPathFragments(terraformLibPath, 'project.json'))) {\n await terraformProjectGenerator(tree, {\n name: SHARED_TERRAFORM_NAME,\n directory: joinPathFragments(PACKAGES_DIR, 'common'),\n type: 'library',\n });\n\n // `build` is a no-op orchestration target that produces no files of its\n // own. Terraform writes runtime-config entries into\n // `dist/{projectRoot}/runtime-config` at apply time, and other terraform\n // projects contribute their own entries to the same directory. Without\n // explicit outputs, Nx infers `dist/{projectRoot}` as this target's\n // cached output and, on a cache hit, restores the cached copy over the\n // freshly-applied config — wiping the very values consumers read. Declare\n // no outputs so Nx never treats runtime config as a cacheable artifact.\n updateJson(\n tree,\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'project.json'),\n (projectConfig: ProjectConfiguration) => {\n projectConfig.targets ??= {};\n projectConfig.targets.build ??= {};\n projectConfig.targets.build.outputs = [];\n return projectConfig;\n },\n );\n\n tree.delete(joinPathFragments(terraformLibPath, 'src', 'main.tf'));\n\n // Create the metrics.tf file with empty initial values\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'terraform'),\n terraformLibPath,\n { ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n await formatFilesInSubtree(tree);\n }\n }\n}\n\nconst updateGitignore = (tree: Tree) => {\n const gitignore = tree.exists('.gitignore')\n ? tree.read('.gitignore', 'utf-8')\n : '';\n const regex = /runtime-config.json/gm;\n const hasRuntimeConfig = regex.test(gitignore ?? '');\n if (hasRuntimeConfig) {\n return;\n }\n tree.write('.gitignore', `${gitignore}\\n\\nruntime-config.json`);\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","terraformProjectGenerator","tsProjectGenerator","addCdkTestGlobalSetup","readAwsNxPluginConfig","addDependenciesToPackageJson","formatFilesInSubtree","esmVars","getNpmScopePrefix","getPackageManagerDisplayCommands","PACKAGES_DIR","SHARED_CONSTRUCTS_DEPENDENCIES","SHARED_CONSTRUCTS_DIR","SHARED_CONSTRUCTS_NAME","SHARED_TERRAFORM_DIR","SHARED_TERRAFORM_NAME","terraformProviderVersions","withVersions","sharedConstructsGenerator","tree","options","declaration","iac","npmScopePrefix","updateGitignore","exists","name","directory","subDirectory","delete","dirname","scopeAlias","tags","overwriteStrategy","KeepExisting","fullyQualifiedName","pkgMgrCmd","exec","Overwrite","terraformLibPath","type","projectConfig","targets","build","outputs","gitignore","read","regex","hasRuntimeConfig","test","write"],"mappings":"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"}
|
|
@@ -6,3 +6,9 @@
|
|
|
6
6
|
export declare const PY_CLIENT_VERIFIER_DEPENDENCIES: string[];
|
|
7
7
|
/** The type checker every Python worker installs alongside its dependencies. */
|
|
8
8
|
export declare const PY_VERIFIER_TYPE_CHECKER: string;
|
|
9
|
+
/**
|
|
10
|
+
* The packages a project generated by `py#dynamodb` imports, at the versions
|
|
11
|
+
* the generator vends. The worker itself imports the py-client packages, so
|
|
12
|
+
* they are included too.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PY_DYNAMODB_VERIFIER_DEPENDENCIES: string[];
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/ import { OPEN_API_PY_CLIENT_DEPENDENCIES } from "../../open-api/py-client/generator.js";
|
|
5
|
+
import { DEPENDENCIES as PY_DYNAMODB_DEPENDENCIES } from "../../py/dynamodb/generator.js";
|
|
5
6
|
import { declaredNames } from "../declared-dependencies.js";
|
|
6
7
|
import { PY_VERSIONS, withPyVersions } from "../versions.js";
|
|
7
8
|
/**
|
|
@@ -10,5 +11,13 @@ import { PY_VERSIONS, withPyVersions } from "../versions.js";
|
|
|
10
11
|
* exactly what a consumer gets.
|
|
11
12
|
*/ export const PY_CLIENT_VERIFIER_DEPENDENCIES = withPyVersions(OPEN_API_PY_CLIENT_DEPENDENCIES, declaredNames(OPEN_API_PY_CLIENT_DEPENDENCIES.py));
|
|
12
13
|
/** The type checker every Python worker installs alongside its dependencies. */ export const PY_VERIFIER_TYPE_CHECKER = `ty${PY_VERSIONS.ty}`;
|
|
14
|
+
/**
|
|
15
|
+
* The packages a project generated by `py#dynamodb` imports, at the versions
|
|
16
|
+
* the generator vends. The worker itself imports the py-client packages, so
|
|
17
|
+
* they are included too.
|
|
18
|
+
*/ export const PY_DYNAMODB_VERIFIER_DEPENDENCIES = [
|
|
19
|
+
...withPyVersions(PY_DYNAMODB_DEPENDENCIES, declaredNames(PY_DYNAMODB_DEPENDENCIES.py)),
|
|
20
|
+
...PY_CLIENT_VERIFIER_DEPENDENCIES
|
|
21
|
+
];
|
|
13
22
|
|
|
14
23
|
//# sourceMappingURL=python-dependencies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/test/python-dependencies.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { OPEN_API_PY_CLIENT_DEPENDENCIES } from '../../open-api/py-client/generator.js';\nimport { declaredNames } from '../declared-dependencies.js';\nimport { PY_VERSIONS, withPyVersions } from '../versions.js';\n\n/**\n * The packages a client generated by `open-api#py-client` imports, at the\n * versions the generator vends — so a worker runs the code under test against\n * exactly what a consumer gets.\n */\nexport const PY_CLIENT_VERIFIER_DEPENDENCIES: string[] = withPyVersions(\n OPEN_API_PY_CLIENT_DEPENDENCIES,\n declaredNames(OPEN_API_PY_CLIENT_DEPENDENCIES.py),\n);\n\n/** The type checker every Python worker installs alongside its dependencies. */\nexport const PY_VERIFIER_TYPE_CHECKER = `ty${PY_VERSIONS.ty}`;\n"],"names":["OPEN_API_PY_CLIENT_DEPENDENCIES","declaredNames","PY_VERSIONS","withPyVersions","PY_CLIENT_VERIFIER_DEPENDENCIES","py","PY_VERIFIER_TYPE_CHECKER","ty"],"mappings":"AAAA;;;CAGC,GACD,SAASA,+BAA+B,QAAQ,wCAAwC;AACxF,SAASC,aAAa,QAAQ,8BAA8B;AAC5D,SAASC,WAAW,EAAEC,cAAc,QAAQ,iBAAiB;AAE7D;;;;CAIC,GACD,OAAO,MAAMC,kCAA4CD,
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/test/python-dependencies.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { OPEN_API_PY_CLIENT_DEPENDENCIES } from '../../open-api/py-client/generator.js';\nimport { DEPENDENCIES as PY_DYNAMODB_DEPENDENCIES } from '../../py/dynamodb/generator.js';\nimport { declaredNames } from '../declared-dependencies.js';\nimport { PY_VERSIONS, withPyVersions } from '../versions.js';\n\n/**\n * The packages a client generated by `open-api#py-client` imports, at the\n * versions the generator vends — so a worker runs the code under test against\n * exactly what a consumer gets.\n */\nexport const PY_CLIENT_VERIFIER_DEPENDENCIES: string[] = withPyVersions(\n OPEN_API_PY_CLIENT_DEPENDENCIES,\n declaredNames(OPEN_API_PY_CLIENT_DEPENDENCIES.py),\n);\n\n/** The type checker every Python worker installs alongside its dependencies. */\nexport const PY_VERIFIER_TYPE_CHECKER = `ty${PY_VERSIONS.ty}`;\n\n/**\n * The packages a project generated by `py#dynamodb` imports, at the versions\n * the generator vends. The worker itself imports the py-client packages, so\n * they are included too.\n */\nexport const PY_DYNAMODB_VERIFIER_DEPENDENCIES: string[] = [\n ...withPyVersions(\n PY_DYNAMODB_DEPENDENCIES,\n declaredNames(PY_DYNAMODB_DEPENDENCIES.py),\n ),\n ...PY_CLIENT_VERIFIER_DEPENDENCIES,\n];\n"],"names":["OPEN_API_PY_CLIENT_DEPENDENCIES","DEPENDENCIES","PY_DYNAMODB_DEPENDENCIES","declaredNames","PY_VERSIONS","withPyVersions","PY_CLIENT_VERIFIER_DEPENDENCIES","py","PY_VERIFIER_TYPE_CHECKER","ty","PY_DYNAMODB_VERIFIER_DEPENDENCIES"],"mappings":"AAAA;;;CAGC,GACD,SAASA,+BAA+B,QAAQ,wCAAwC;AACxF,SAASC,gBAAgBC,wBAAwB,QAAQ,iCAAiC;AAC1F,SAASC,aAAa,QAAQ,8BAA8B;AAC5D,SAASC,WAAW,EAAEC,cAAc,QAAQ,iBAAiB;AAE7D;;;;CAIC,GACD,OAAO,MAAMC,kCAA4CD,eACvDL,iCACAG,cAAcH,gCAAgCO,EAAE,GAChD;AAEF,8EAA8E,GAC9E,OAAO,MAAMC,2BAA2B,CAAC,EAAE,EAAEJ,YAAYK,EAAE,EAAE,CAAC;AAE9D;;;;CAIC,GACD,OAAO,MAAMC,oCAA8C;OACtDL,eACDH,0BACAC,cAAcD,yBAAyBK,EAAE;OAExCD;CACJ,CAAC"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/ import { execFileSync } from "child_process";
|
|
5
|
-
import {
|
|
5
|
+
import { pyenvPythonVersion } from "../versions.js";
|
|
6
|
+
import { PY_CLIENT_VERIFIER_DEPENDENCIES, PY_DYNAMODB_VERIFIER_DEPENDENCIES, PY_VERIFIER_TYPE_CHECKER } from "./python-dependencies.js";
|
|
6
7
|
/**
|
|
7
8
|
* Vitest globalSetup that warms uv's cache once before any worker spawns.
|
|
8
9
|
*
|
|
@@ -20,26 +21,44 @@ import { PY_CLIENT_VERIFIER_DEPENDENCIES, PY_VERIFIER_TYPE_CHECKER } from "./pyt
|
|
|
20
21
|
* swallowed: a broken cache otherwise degrades silently to every worker racing a
|
|
21
22
|
* cold one, which is the startup failure this exists to prevent.
|
|
22
23
|
*/ export default function setup() {
|
|
23
|
-
// The same
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
24
|
+
// The same sets the verifiers install, on the same interpreters, so the warm
|
|
25
|
+
// cache is the one they hit. Wheels can be interpreter-specific, so each set
|
|
26
|
+
// is warmed on the interpreter its verifier runs.
|
|
27
|
+
const environments = [
|
|
28
|
+
{
|
|
29
|
+
dependencies: PY_CLIENT_VERIFIER_DEPENDENCIES
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
dependencies: PY_DYNAMODB_VERIFIER_DEPENDENCIES,
|
|
33
|
+
python: pyenvPythonVersion()
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
for (const { dependencies, python } of environments){
|
|
37
|
+
const deps = [
|
|
38
|
+
...dependencies,
|
|
39
|
+
PY_VERIFIER_TYPE_CHECKER
|
|
40
|
+
].flatMap((spec)=>[
|
|
41
|
+
'--with',
|
|
42
|
+
spec
|
|
43
|
+
]);
|
|
44
|
+
const interpreter = python ? [
|
|
45
|
+
'--python',
|
|
46
|
+
python
|
|
47
|
+
] : [];
|
|
48
|
+
try {
|
|
49
|
+
execFileSync('uv', [
|
|
50
|
+
'run',
|
|
51
|
+
...interpreter,
|
|
52
|
+
...deps,
|
|
53
|
+
'python',
|
|
54
|
+
'-c',
|
|
55
|
+
''
|
|
56
|
+
], {
|
|
57
|
+
stdio: 'ignore'
|
|
58
|
+
});
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.warn(`Could not warm uv's cache, so each Python worker will install its own ` + `dependencies and may time out starting up: ${error}`);
|
|
61
|
+
}
|
|
43
62
|
}
|
|
44
63
|
}
|
|
45
64
|
|