@aws/nx-plugin 1.0.0-rc.96 → 1.0.0-rc.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/migrations.json +33 -3
  2. package/package.json +1 -1
  3. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +1 -1
  4. package/src/agentcore-gateway/generator.js +6 -0
  5. package/src/agentcore-gateway/generator.js.map +1 -1
  6. package/src/agentcore-gateway/react-connection/__snapshots__/generator.spec.ts.snap +4 -1
  7. package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +68 -4
  8. package/src/agentcore-harness/generator.js +6 -0
  9. package/src/agentcore-harness/generator.js.map +1 -1
  10. package/src/connection/gateway-runtime-config.js +1 -1
  11. package/src/connection/gateway-runtime-config.js.map +1 -1
  12. package/src/infra/app/__snapshots__/generator.spec.ts.snap +6 -6
  13. package/src/infra/app/generator.js +34 -7
  14. package/src/infra/app/generator.js.map +1 -1
  15. package/src/init/generator.d.ts +1 -1
  16. package/src/init/generator.js +8 -6
  17. package/src/init/generator.js.map +1 -1
  18. package/src/init/schema.d.js.map +1 -1
  19. package/src/init/schema.d.ts +1 -0
  20. package/src/init/schema.json +5 -0
  21. package/src/mcp-server/server.js +2 -0
  22. package/src/mcp-server/server.js.map +1 -1
  23. package/src/mcp-server/tools/best-practices.d.ts +28 -0
  24. package/src/mcp-server/tools/best-practices.js +43 -0
  25. package/src/mcp-server/tools/best-practices.js.map +1 -0
  26. package/src/mcp-server/tools/general-guidance.d.ts +1 -1
  27. package/src/mcp-server/tools/general-guidance.js +13 -4
  28. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  29. package/src/migrations/latest/checkov-scan-cache-inputs/metadata.json +3 -0
  30. package/src/migrations/latest/checkov-scan-cache-inputs/migration.d.ts +6 -0
  31. package/src/migrations/latest/checkov-scan-cache-inputs/migration.js +58 -0
  32. package/src/migrations/latest/checkov-scan-cache-inputs/migration.js.map +1 -0
  33. package/src/migrations/latest/gateway-url-accessor/__snapshots__/migration.spec.ts.snap +84 -0
  34. package/src/migrations/latest/gateway-url-accessor/metadata.json +3 -0
  35. package/src/migrations/latest/gateway-url-accessor/migration.d.ts +6 -0
  36. package/src/migrations/latest/gateway-url-accessor/migration.js +94 -0
  37. package/src/migrations/latest/gateway-url-accessor/migration.js.map +1 -0
  38. package/src/migrations/latest/infra-deploy-express-mode/metadata.json +1 -1
  39. package/src/migrations/latest/infra-deploy-express-mode/migration.js +26 -28
  40. package/src/migrations/latest/infra-deploy-express-mode/migration.js.map +1 -1
  41. package/src/migrations/latest/py-lambda-powertools-context/metadata.json +3 -0
  42. package/src/migrations/latest/py-lambda-powertools-context/migration.d.ts +6 -0
  43. package/src/migrations/latest/py-lambda-powertools-context/migration.js +58 -0
  44. package/src/migrations/latest/py-lambda-powertools-context/migration.js.map +1 -0
  45. package/src/migrations/latest/script-project-quality-gates/metadata.json +3 -0
  46. package/src/migrations/latest/script-project-quality-gates/migration.d.ts +6 -0
  47. package/src/migrations/latest/script-project-quality-gates/migration.js +53 -0
  48. package/src/migrations/latest/script-project-quality-gates/migration.js.map +1 -0
  49. package/src/migrations/latest/smithy-extension-trait-aliases/__snapshots__/migration.spec.ts.snap +25 -0
  50. package/src/migrations/latest/smithy-extension-trait-aliases/metadata.json +3 -0
  51. package/src/migrations/latest/smithy-extension-trait-aliases/migration.d.ts +28 -0
  52. package/src/migrations/latest/smithy-extension-trait-aliases/migration.js +75 -0
  53. package/src/migrations/latest/smithy-extension-trait-aliases/migration.js.map +1 -0
  54. package/src/migrations/latest/terraform-validate-without-backend/metadata.json +3 -0
  55. package/src/migrations/latest/terraform-validate-without-backend/migration.d.ts +6 -0
  56. package/src/migrations/latest/terraform-validate-without-backend/migration.js +84 -0
  57. package/src/migrations/latest/terraform-validate-without-backend/migration.js.map +1 -0
  58. package/src/preset/generator.js +4 -25
  59. package/src/preset/generator.js.map +1 -1
  60. package/src/py/agent/a2a-connection/generator.d.ts +1 -1
  61. package/src/py/agent/gateway-connection/generator.d.ts +1 -1
  62. package/src/py/agent/mcp-connection/generator.d.ts +1 -1
  63. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +4 -1
  64. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +8 -10
  65. package/src/py/dynamodb/generator.js +34 -7
  66. package/src/py/dynamodb/generator.js.map +1 -1
  67. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -1
  68. package/src/py/lambda-function/files/handler/__lambdaFunctionSnakeCase__.py.template +2 -1
  69. package/src/py/project/schema.json +3 -1
  70. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +28 -12
  71. package/src/py/rdb/files/Dockerfile.create-db-user.template +7 -3
  72. package/src/py/rdb/files/Dockerfile.migration.template +7 -3
  73. package/src/py/rdb/generator.js +29 -28
  74. package/src/py/rdb/generator.js.map +1 -1
  75. package/src/smithy/react-connection/files/model/extensions.smithy.template +3 -3
  76. package/src/smithy/ts/api/generator.js +7 -2
  77. package/src/smithy/ts/api/generator.js.map +1 -1
  78. package/src/terraform/project/generator.js +34 -10
  79. package/src/terraform/project/generator.js.map +1 -1
  80. package/src/trpc/backend/generator.js +7 -1
  81. package/src/trpc/backend/generator.js.map +1 -1
  82. package/src/trpc/react/generator.js +6 -0
  83. package/src/trpc/react/generator.js.map +1 -1
  84. package/src/ts/agent/generator.js +3 -3
  85. package/src/ts/agent/generator.js.map +1 -1
  86. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -0
  87. package/src/ts/dynamodb/generator.js +30 -6
  88. package/src/ts/dynamodb/generator.js.map +1 -1
  89. package/src/ts/lib/biome.d.ts +15 -1
  90. package/src/ts/lib/biome.js +79 -63
  91. package/src/ts/lib/biome.js.map +1 -1
  92. package/src/ts/lib/generator.js +11 -7
  93. package/src/ts/lib/generator.js.map +1 -1
  94. package/src/ts/lib/ts-project-utils.d.ts +14 -0
  95. package/src/ts/lib/ts-project-utils.js +24 -0
  96. package/src/ts/lib/ts-project-utils.js.map +1 -1
  97. package/src/ts/mcp-server/generator.js +3 -3
  98. package/src/ts/mcp-server/generator.js.map +1 -1
  99. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +5 -0
  100. package/src/ts/rdb/files/Dockerfile.template +5 -0
  101. package/src/ts/rdb/generator.d.ts +8 -0
  102. package/src/ts/rdb/generator.js +28 -24
  103. package/src/ts/rdb/generator.js.map +1 -1
  104. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +39 -0
  105. package/src/ts/rdb/trpc-connection/generator.js +13 -0
  106. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  107. package/src/ts/react-website/agui/files/common/src/components/__agentNameKebabCase__-chat.tsx.template +9 -0
  108. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +4 -1
  109. package/src/ts/react-website/agui/generator.js +6 -2
  110. package/src/ts/react-website/agui/generator.js.map +1 -1
  111. package/src/ts/react-website/app/generator.js +3 -8
  112. package/src/ts/react-website/app/generator.js.map +1 -1
  113. package/src/utils/agent-connection/agent-connection.d.ts +2 -1
  114. package/src/utils/agent-connection/agent-connection.js +6 -1
  115. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  116. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +11 -7
  117. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +14 -6
  118. package/src/utils/agent-core-packaging.js +5 -5
  119. package/src/utils/agent-core-packaging.js.map +1 -1
  120. package/src/utils/api-constructs/api-constructs.d.ts +5 -0
  121. package/src/utils/api-constructs/api-constructs.js +8 -0
  122. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  123. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +4 -2
  124. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +4 -2
  125. package/src/utils/ast.d.ts +10 -0
  126. package/src/utils/ast.js +33 -0
  127. package/src/utils/ast.js.map +1 -1
  128. package/src/utils/docker.d.ts +11 -0
  129. package/src/utils/docker.js +16 -3
  130. package/src/utils/docker.js.map +1 -1
  131. package/src/utils/dynamodb-config.d.ts +48 -0
  132. package/src/utils/dynamodb-config.js +44 -0
  133. package/src/utils/dynamodb-config.js.map +1 -0
  134. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +8 -4
  135. package/src/utils/git-secrets.d.ts +28 -0
  136. package/src/utils/git-secrets.js +66 -0
  137. package/src/utils/git-secrets.js.map +1 -0
  138. package/src/utils/init.js +7 -6
  139. package/src/utils/init.js.map +1 -1
  140. package/src/utils/local-project-dependency.d.ts +28 -0
  141. package/src/utils/local-project-dependency.js +40 -0
  142. package/src/utils/local-project-dependency.js.map +1 -0
  143. package/src/utils/nx.d.ts +14 -0
  144. package/src/utils/nx.js +30 -0
  145. package/src/utils/nx.js.map +1 -1
  146. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +11 -6
  147. package/src/utils/script-project-targets.d.ts +26 -0
  148. package/src/utils/script-project-targets.js +75 -0
  149. package/src/utils/script-project-targets.js.map +1 -0
  150. package/src/utils/versions.d.ts +3 -0
  151. package/src/utils/versions.js +7 -0
  152. package/src/utils/versions.js.map +1 -1
  153. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +8 -4
  154. package/src/py/dynamodb/files/__name__/__init__.py.template +0 -6
  155. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +0 -4
  156. package/src/py/dynamodb/files/config.json.template +0 -24
  157. package/src/ts/dynamodb/files/config.json.template +0 -24
  158. package/src/ts/dynamodb/files/src/entities/index.ts.template +0 -1
  159. package/src/ts/dynamodb/files/src/index.ts.template +0 -2
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */ import { getProjects, joinPathFragments, updateProjectConfiguration } from "@nx/devkit";
5
+ import { relative } from "path";
6
+ import { TERRAFORM_PROJECT_GENERATOR_INFO } from "../../../terraform/project/generator.js";
7
+ import { formatFilesInSubtree } from "../../../utils/format.js";
8
+ /**
9
+ * Run `validate` against a backendless `terraform init` of its own, so it works
10
+ * on a fresh workspace.
11
+ *
12
+ * It previously depended on the `init` target. On an application project that
13
+ * runs the vended `scripts/init.ts`, which configures the S3 backend and fails
14
+ * with a raw `NoSuchBucket` trace until `bootstrap` has created the state
15
+ * bucket — so the first target the guide invites the reader to try was
16
+ * unrunnable, while `lint`, `test` and `checkov` all worked.
17
+ *
18
+ * `-backend=false` installs the modules and providers validation needs without
19
+ * configuring the backend, exactly as `test` already does, so no credentials are
20
+ * involved. `TF_DATA_DIR` keeps that `.terraform` out of `src` so it never races
21
+ * the backend-configured targets over the shared one, and the shared plugin
22
+ * cache means the providers are linked rather than re-downloaded.
23
+ */ const VALIDATE_TARGET = 'validate';
24
+ /** The command the pre-fix target ran, on its own. */ const VENDED_COMMAND = 'terraform validate';
25
+ const divergedMessage = (projectName)=>`${projectName}:${VALIDATE_TARGET}: has diverged from the generated shape - left untouched. To run it before \`bootstrap\`, have it run \`terraform init -backend=false\` ahead of \`terraform validate\` rather than depending on the \`init\` target, which configures the S3 backend.`;
26
+ /** Path from a target running in `{projectRoot}/src` to the workspace root. */ const rootRelativePathFrom = (projectRoot)=>(relative(joinPathFragments(projectRoot, 'src'), '.') || '.').replace(/\\/g, '/');
27
+ /** Whether the target is the exact shape the pre-fix generator produced. */ const hasVendedShape = (target)=>target.executor === 'nx:run-commands' && target.options?.command === VENDED_COMMAND && !target.options?.commands && target.options?.cwd === '{projectRoot}/src' && target.dependsOn?.length === 1 && target.dependsOn[0] === 'init';
28
+ export default async function migration(tree) {
29
+ const nextSteps = [];
30
+ for (const [projectName, project] of getProjects(tree)){
31
+ const generator = project.metadata?.generator;
32
+ if (generator !== TERRAFORM_PROJECT_GENERATOR_INFO.id) continue;
33
+ const target = project.targets?.[VALIDATE_TARGET];
34
+ if (!target) continue;
35
+ // A target already running its own init needs nothing, which also makes a
36
+ // re-run — and a project generated after the fix — a no-op.
37
+ if (target.options?.env?.TF_DATA_DIR) continue;
38
+ if (!hasVendedShape(target)) {
39
+ nextSteps.push(divergedMessage(projectName));
40
+ continue;
41
+ }
42
+ const rootRelativePath = rootRelativePathFrom(project.root);
43
+ const pluginCacheDir = joinPathFragments(rootRelativePath, '.terraform', 'plugin-cache', '{projectRoot}').replace(/\\/g, '/');
44
+ const validateDataDir = joinPathFragments(rootRelativePath, 'dist', '{projectRoot}', 'terraform-validate').replace(/\\/g, '/');
45
+ const { command: _command, ...options } = target.options;
46
+ const { dependsOn: _dependsOn, ...rest } = target;
47
+ project.targets[VALIDATE_TARGET] = {
48
+ ...rest,
49
+ // `^production` mirrors `test`: validation resolves the relative modules a
50
+ // project consumes, so a change in one must invalidate it.
51
+ inputs: [
52
+ 'default',
53
+ '^production'
54
+ ],
55
+ // `TF_DATA_DIR` is terraform's working directory, not an artifact — its
56
+ // provider entries are symlinks into the shared plugin cache.
57
+ outputs: [],
58
+ options: {
59
+ ...options,
60
+ commands: [
61
+ {
62
+ command: `shx mkdir -p ${pluginCacheDir}`,
63
+ forwardAllArgs: false
64
+ },
65
+ 'terraform init -backend=false',
66
+ VENDED_COMMAND
67
+ ],
68
+ parallel: false,
69
+ env: {
70
+ ...options.env,
71
+ TF_DATA_DIR: validateDataDir,
72
+ TF_PLUGIN_CACHE_DIR: pluginCacheDir
73
+ }
74
+ }
75
+ };
76
+ updateProjectConfiguration(tree, projectName, project);
77
+ }
78
+ await formatFilesInSubtree(tree);
79
+ return {
80
+ nextSteps
81
+ };
82
+ }
83
+
84
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/latest/terraform-validate-without-backend/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n getProjects,\n joinPathFragments,\n type MigrationReturnObject,\n type ProjectConfiguration,\n type TargetConfiguration,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { relative } from 'path';\nimport { TERRAFORM_PROJECT_GENERATOR_INFO } from '../../../terraform/project/generator.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\n\n/**\n * Run `validate` against a backendless `terraform init` of its own, so it works\n * on a fresh workspace.\n *\n * It previously depended on the `init` target. On an application project that\n * runs the vended `scripts/init.ts`, which configures the S3 backend and fails\n * with a raw `NoSuchBucket` trace until `bootstrap` has created the state\n * bucket — so the first target the guide invites the reader to try was\n * unrunnable, while `lint`, `test` and `checkov` all worked.\n *\n * `-backend=false` installs the modules and providers validation needs without\n * configuring the backend, exactly as `test` already does, so no credentials are\n * involved. `TF_DATA_DIR` keeps that `.terraform` out of `src` so it never races\n * the backend-configured targets over the shared one, and the shared plugin\n * cache means the providers are linked rather than re-downloaded.\n */\n\nconst VALIDATE_TARGET = 'validate';\n\n/** The command the pre-fix target ran, on its own. */\nconst VENDED_COMMAND = 'terraform validate';\n\nconst divergedMessage = (projectName: string) =>\n `${projectName}:${VALIDATE_TARGET}: has diverged from the generated shape - left untouched. To run it before \\`bootstrap\\`, have it run \\`terraform init -backend=false\\` ahead of \\`terraform validate\\` rather than depending on the \\`init\\` target, which configures the S3 backend.`;\n\n/** Path from a target running in `{projectRoot}/src` to the workspace root. */\nconst rootRelativePathFrom = (projectRoot: string) =>\n (relative(joinPathFragments(projectRoot, 'src'), '.') || '.').replace(\n /\\\\/g,\n '/',\n );\n\n/** Whether the target is the exact shape the pre-fix generator produced. */\nconst hasVendedShape = (target: TargetConfiguration): boolean =>\n target.executor === 'nx:run-commands' &&\n target.options?.command === VENDED_COMMAND &&\n !target.options?.commands &&\n target.options?.cwd === '{projectRoot}/src' &&\n target.dependsOn?.length === 1 &&\n target.dependsOn[0] === 'init';\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n for (const [projectName, project] of getProjects(tree)) {\n const generator = (project.metadata as { generator?: string } | undefined)\n ?.generator;\n if (generator !== TERRAFORM_PROJECT_GENERATOR_INFO.id) continue;\n\n const target = project.targets?.[VALIDATE_TARGET];\n if (!target) continue;\n\n // A target already running its own init needs nothing, which also makes a\n // re-run — and a project generated after the fix — a no-op.\n if (target.options?.env?.TF_DATA_DIR) continue;\n\n if (!hasVendedShape(target)) {\n nextSteps.push(divergedMessage(projectName));\n continue;\n }\n\n const rootRelativePath = rootRelativePathFrom(project.root);\n const pluginCacheDir = joinPathFragments(\n rootRelativePath,\n '.terraform',\n 'plugin-cache',\n '{projectRoot}',\n ).replace(/\\\\/g, '/');\n const validateDataDir = joinPathFragments(\n rootRelativePath,\n 'dist',\n '{projectRoot}',\n 'terraform-validate',\n ).replace(/\\\\/g, '/');\n\n const { command: _command, ...options } = target.options;\n const { dependsOn: _dependsOn, ...rest } = target;\n\n project.targets[VALIDATE_TARGET] = {\n ...rest,\n // `^production` mirrors `test`: validation resolves the relative modules a\n // project consumes, so a change in one must invalidate it.\n inputs: ['default', '^production'],\n // `TF_DATA_DIR` is terraform's working directory, not an artifact — its\n // provider entries are symlinks into the shared plugin cache.\n outputs: [],\n options: {\n ...options,\n commands: [\n { command: `shx mkdir -p ${pluginCacheDir}`, forwardAllArgs: false },\n 'terraform init -backend=false',\n VENDED_COMMAND,\n ],\n parallel: false,\n env: {\n ...options.env,\n TF_DATA_DIR: validateDataDir,\n TF_PLUGIN_CACHE_DIR: pluginCacheDir,\n },\n },\n };\n\n updateProjectConfiguration(\n tree,\n projectName,\n project as ProjectConfiguration,\n );\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["getProjects","joinPathFragments","updateProjectConfiguration","relative","TERRAFORM_PROJECT_GENERATOR_INFO","formatFilesInSubtree","VALIDATE_TARGET","VENDED_COMMAND","divergedMessage","projectName","rootRelativePathFrom","projectRoot","replace","hasVendedShape","target","executor","options","command","commands","cwd","dependsOn","length","migration","tree","nextSteps","project","generator","metadata","id","targets","env","TF_DATA_DIR","push","rootRelativePath","root","pluginCacheDir","validateDataDir","_command","_dependsOn","rest","inputs","outputs","forwardAllArgs","parallel","TF_PLUGIN_CACHE_DIR"],"mappings":"AAAA;;;CAGC,GACD,SACEA,WAAW,EACXC,iBAAiB,EAKjBC,0BAA0B,QACrB,aAAa;AACpB,SAASC,QAAQ,QAAQ,OAAO;AAChC,SAASC,gCAAgC,QAAQ,0CAA0C;AAC3F,SAASC,oBAAoB,QAAQ,2BAA2B;AAEhE;;;;;;;;;;;;;;;CAeC,GAED,MAAMC,kBAAkB;AAExB,oDAAoD,GACpD,MAAMC,iBAAiB;AAEvB,MAAMC,kBAAkB,CAACC,cACvB,GAAGA,YAAY,CAAC,EAAEH,gBAAgB,sPAAsP,CAAC;AAE3R,6EAA6E,GAC7E,MAAMI,uBAAuB,CAACC,cAC5B,AAACR,CAAAA,SAASF,kBAAkBU,aAAa,QAAQ,QAAQ,GAAE,EAAGC,OAAO,CACnE,OACA;AAGJ,0EAA0E,GAC1E,MAAMC,iBAAiB,CAACC,SACtBA,OAAOC,QAAQ,KAAK,qBACpBD,OAAOE,OAAO,EAAEC,YAAYV,kBAC5B,CAACO,OAAOE,OAAO,EAAEE,YACjBJ,OAAOE,OAAO,EAAEG,QAAQ,uBACxBL,OAAOM,SAAS,EAAEC,WAAW,KAC7BP,OAAOM,SAAS,CAAC,EAAE,KAAK;AAE1B,eAAe,eAAeE,UAC5BC,IAAU;IAEV,MAAMC,YAAsB,EAAE;IAE9B,KAAK,MAAM,CAACf,aAAagB,QAAQ,IAAIzB,YAAYuB,MAAO;QACtD,MAAMG,YAAaD,QAAQE,QAAQ,EAC/BD;QACJ,IAAIA,cAActB,iCAAiCwB,EAAE,EAAE;QAEvD,MAAMd,SAASW,QAAQI,OAAO,EAAE,CAACvB,gBAAgB;QACjD,IAAI,CAACQ,QAAQ;QAEb,0EAA0E;QAC1E,4DAA4D;QAC5D,IAAIA,OAAOE,OAAO,EAAEc,KAAKC,aAAa;QAEtC,IAAI,CAAClB,eAAeC,SAAS;YAC3BU,UAAUQ,IAAI,CAACxB,gBAAgBC;YAC/B;QACF;QAEA,MAAMwB,mBAAmBvB,qBAAqBe,QAAQS,IAAI;QAC1D,MAAMC,iBAAiBlC,kBACrBgC,kBACA,cACA,gBACA,iBACArB,OAAO,CAAC,OAAO;QACjB,MAAMwB,kBAAkBnC,kBACtBgC,kBACA,QACA,iBACA,sBACArB,OAAO,CAAC,OAAO;QAEjB,MAAM,EAAEK,SAASoB,QAAQ,EAAE,GAAGrB,SAAS,GAAGF,OAAOE,OAAO;QACxD,MAAM,EAAEI,WAAWkB,UAAU,EAAE,GAAGC,MAAM,GAAGzB;QAE3CW,QAAQI,OAAO,CAACvB,gBAAgB,GAAG;YACjC,GAAGiC,IAAI;YACP,2EAA2E;YAC3E,2DAA2D;YAC3DC,QAAQ;gBAAC;gBAAW;aAAc;YAClC,wEAAwE;YACxE,8DAA8D;YAC9DC,SAAS,EAAE;YACXzB,SAAS;gBACP,GAAGA,OAAO;gBACVE,UAAU;oBACR;wBAAED,SAAS,CAAC,aAAa,EAAEkB,gBAAgB;wBAAEO,gBAAgB;oBAAM;oBACnE;oBACAnC;iBACD;gBACDoC,UAAU;gBACVb,KAAK;oBACH,GAAGd,QAAQc,GAAG;oBACdC,aAAaK;oBACbQ,qBAAqBT;gBACvB;YACF;QACF;QAEAjC,2BACEqB,MACAd,aACAgB;IAEJ;IAEA,MAAMpB,qBAAqBkB;IAE3B,OAAO;QAAEC;IAAU;AACrB"}
@@ -1,23 +1,19 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { joinPathFragments, OverwriteStrategy, updateJson } from "@nx/devkit";
4
+ */ import { OverwriteStrategy, updateJson } from "@nx/devkit";
5
5
  import { execSync } from "child_process";
6
6
  import enquirer from "enquirer";
7
- import { readFileSync } from "fs";
8
7
  import { ensureAwsNxPluginConfig, updateAwsNxPluginConfig } from "../utils/config/utils.js";
9
8
  import { declareDependencies } from "../utils/declared-dependencies.js";
10
- import { addDependenciesToPackageJson } from "../utils/dependencies.js";
11
9
  import { formatFilesInSubtree } from "../utils/format.js";
10
+ import { GIT_SECRETS_DEPENDENCIES, setUpGitSecrets } from "../utils/git-secrets.js";
12
11
  import { applyWorkspaceInit, INIT_DEPENDENCIES } from "../utils/init.js";
13
12
  import { installDependencies } from "../utils/install.js";
14
13
  import { getGeneratorInfo } from "../utils/nx.js";
15
- import { withVersions } from "../utils/versions.js";
16
14
  export const DEPENDENCIES = declareDependencies()({
17
15
  ts: [
18
- {
19
- name: 'husky'
20
- },
16
+ ...GIT_SECRETS_DEPENDENCIES,
21
17
  ...INIT_DEPENDENCIES
22
18
  ]
23
19
  });
@@ -68,23 +64,6 @@ export const PRESET_GENERATOR_INFO = getGeneratorInfo(import.meta.filename);
68
64
  return false;
69
65
  }
70
66
  }
71
- const setUpGitSecrets = (tree)=>{
72
- const gitSecretsDir = joinPathFragments(import.meta.dirname, 'git-secrets-files', 'git-secrets-dir');
73
- const huskyDir = joinPathFragments(import.meta.dirname, 'git-secrets-files', 'husky-dir');
74
- tree.write('.git-secrets/git-secrets', readFileSync(joinPathFragments(gitSecretsDir, 'git-secrets'), 'utf-8'));
75
- tree.write('.husky/pre-commit', readFileSync(joinPathFragments(huskyDir, 'pre-commit'), 'utf-8'));
76
- tree.write('.gitallowed', '\\.git-secrets/git-secrets:\n');
77
- updateJson(tree, 'package.json', (json)=>({
78
- ...json,
79
- scripts: {
80
- ...json.scripts,
81
- prepare: 'husky'
82
- }
83
- }));
84
- addDependenciesToPackageJson(tree, {}, withVersions(DEPENDENCIES, [
85
- 'husky'
86
- ]));
87
- };
88
67
  export const presetGenerator = async (tree, { iac, gitSecrets, mcp, containers, module, catalog, preferInstallDependencies })=>{
89
68
  if (isAmazonian() && !process.env.VITEST && !process.env.CI && process.env.NX_DRY_RUN !== 'true' && process.env.NX_INTERACTIVE !== 'false') {
90
69
  const { engagementId } = await enquirer.prompt([
@@ -126,7 +105,7 @@ export const presetGenerator = async (tree, { iac, gitSecrets, mcp, containers,
126
105
  tree.delete('libs/.gitkeep');
127
106
  tree.write('packages/.gitkeep', '');
128
107
  if (gitSecrets !== false) {
129
- setUpGitSecrets(tree);
108
+ setUpGitSecrets(tree, DEPENDENCIES);
130
109
  }
131
110
  await formatFilesInSubtree(tree);
132
111
  return ()=>installDependencies(tree, preferInstallDependencies, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/nx-plugin/src/preset/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { execSync } from 'child_process';\nimport enquirer from 'enquirer';\nimport { readFileSync } from 'fs';\nimport {\n ensureAwsNxPluginConfig,\n updateAwsNxPluginConfig,\n} from '../utils/config/utils.js';\nimport { declareDependencies } from '../utils/declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../utils/dependencies.js';\nimport { formatFilesInSubtree } from '../utils/format.js';\nimport { applyWorkspaceInit, INIT_DEPENDENCIES } from '../utils/init.js';\nimport { installDependencies } from '../utils/install.js';\nimport { getGeneratorInfo, type NxGeneratorInfo } from '../utils/nx.js';\nimport { withVersions } from '../utils/versions.js';\nimport type { PresetGeneratorSchema } from './schema';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [{ name: 'husky' }, ...INIT_DEPENDENCIES],\n});\n\nexport const PRESET_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\n/**\n * Determines if the current user is an Amazon employee based on their git configuration.\n *\n * This function checks the git user email configuration to identify Amazon employees\n * by looking for email addresses with Amazon domains (e.g., @amazon.com, @amazon.co.uk).\n *\n * @returns {boolean} True if the user's git email has an Amazon domain, false otherwise\n *\n * @example\n * // Returns true for Amazon employee emails\n * // git config user.email = \"john.doe@amazon.com\"\n * isAmazonian(); // true\n *\n * @example\n * // Returns false for non-Amazon emails\n * // git config user.email = \"user@example.com\"\n * isAmazonian(); // false\n *\n * @example\n * // Returns false when git config is not available or throws an error\n * isAmazonian(); // false\n */\nexport function isAmazonian(): boolean {\n try {\n // Execute git command to retrieve the user's configured email address\n const gitEmail = execSync('git config user.email', {\n encoding: 'utf8',\n }).trim();\n\n // Return false if no email is configured\n if (!gitEmail) {\n return false;\n }\n\n // Split email address to extract domain part\n const emailParts = gitEmail.split('@');\n if (emailParts.length < 2) {\n return false;\n }\n\n // Extract domain and normalize to lowercase for comparison\n const domain = emailParts[1].toLowerCase();\n\n // Check if domain starts with 'amazon.' (covers amazon.com, amazon.co.uk, etc.)\n return domain.startsWith('amazon.');\n } catch (error) {\n // Return false if git command fails or any other error occurs\n // This handles cases where git is not installed or configured\n return false;\n }\n}\n\nconst setUpGitSecrets = (tree: Tree) => {\n const gitSecretsDir = joinPathFragments(\n import.meta.dirname,\n 'git-secrets-files',\n 'git-secrets-dir',\n );\n const huskyDir = joinPathFragments(\n import.meta.dirname,\n 'git-secrets-files',\n 'husky-dir',\n );\n\n tree.write(\n '.git-secrets/git-secrets',\n readFileSync(joinPathFragments(gitSecretsDir, 'git-secrets'), 'utf-8'),\n );\n tree.write(\n '.husky/pre-commit',\n readFileSync(joinPathFragments(huskyDir, 'pre-commit'), 'utf-8'),\n );\n tree.write('.gitallowed', '\\\\.git-secrets/git-secrets:\\n');\n\n updateJson(tree, 'package.json', (json) => ({\n ...json,\n scripts: {\n ...json.scripts,\n prepare: 'husky',\n },\n }));\n\n addDependenciesToPackageJson(tree, {}, withVersions(DEPENDENCIES, ['husky']));\n};\n\nexport const presetGenerator = async (\n tree: Tree,\n {\n iac,\n gitSecrets,\n mcp,\n containers,\n module,\n catalog,\n preferInstallDependencies,\n }: PresetGeneratorSchema,\n): Promise<GeneratorCallback> => {\n if (\n isAmazonian() &&\n !process.env.VITEST &&\n !process.env.CI &&\n process.env.NX_DRY_RUN !== 'true' &&\n process.env.NX_INTERACTIVE !== 'false'\n ) {\n const { engagementId } = await enquirer.prompt<{ engagementId?: string }>([\n {\n name: 'engagementId',\n message: 'Please enter your engagementId (if known)',\n type: 'input',\n initial: 'None',\n },\n ]);\n\n if (engagementId != 'None') {\n await ensureAwsNxPluginConfig(tree);\n await updateAwsNxPluginConfig(tree, { tags: [engagementId] });\n }\n }\n\n // The preset owns the greenfield workspace's module format: write the root\n // `type` explicitly from the chosen `--module` so later generators can\n // infer it. The `init` generator never touches an existing workspace's\n // `type` field.\n updateJson(tree, 'package.json', (packageJson) => ({\n ...packageJson,\n type: (module ?? 'esm') === 'esm' ? 'module' : 'commonjs',\n }));\n\n // Apply the deterministic workspace configuration shared with the `init`\n // generator. The preset owns the README of a greenfield workspace.\n await applyWorkspaceInit(\n tree,\n {\n iac,\n containers,\n mcp,\n catalogs: catalog ?? true,\n readmeOverwriteStrategy: OverwriteStrategy.Overwrite,\n overwriteScripts: true,\n },\n DEPENDENCIES,\n );\n\n tree.delete('apps/.gitkeep');\n tree.delete('libs/.gitkeep');\n tree.write('packages/.gitkeep', '');\n\n if (gitSecrets !== false) {\n setUpGitSecrets(tree);\n }\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default presetGenerator;\n"],"names":["joinPathFragments","OverwriteStrategy","updateJson","execSync","enquirer","readFileSync","ensureAwsNxPluginConfig","updateAwsNxPluginConfig","declareDependencies","addDependenciesToPackageJson","formatFilesInSubtree","applyWorkspaceInit","INIT_DEPENDENCIES","installDependencies","getGeneratorInfo","withVersions","DEPENDENCIES","ts","name","PRESET_GENERATOR_INFO","filename","isAmazonian","gitEmail","encoding","trim","emailParts","split","length","domain","toLowerCase","startsWith","error","setUpGitSecrets","tree","gitSecretsDir","dirname","huskyDir","write","json","scripts","prepare","presetGenerator","iac","gitSecrets","mcp","containers","module","catalog","preferInstallDependencies","process","env","VITEST","CI","NX_DRY_RUN","NX_INTERACTIVE","engagementId","prompt","message","type","initial","tags","packageJson","catalogs","readmeOverwriteStrategy","Overwrite","overwriteScripts","delete","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/preset/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { execSync } from 'child_process';\nimport enquirer from 'enquirer';\nimport {\n ensureAwsNxPluginConfig,\n updateAwsNxPluginConfig,\n} from '../utils/config/utils.js';\nimport { declareDependencies } from '../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../utils/format.js';\nimport {\n GIT_SECRETS_DEPENDENCIES,\n setUpGitSecrets,\n} from '../utils/git-secrets.js';\nimport { applyWorkspaceInit, INIT_DEPENDENCIES } from '../utils/init.js';\nimport { installDependencies } from '../utils/install.js';\nimport { getGeneratorInfo, type NxGeneratorInfo } from '../utils/nx.js';\nimport type { PresetGeneratorSchema } from './schema';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...GIT_SECRETS_DEPENDENCIES, ...INIT_DEPENDENCIES],\n});\n\nexport const PRESET_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\n/**\n * Determines if the current user is an Amazon employee based on their git configuration.\n *\n * This function checks the git user email configuration to identify Amazon employees\n * by looking for email addresses with Amazon domains (e.g., @amazon.com, @amazon.co.uk).\n *\n * @returns {boolean} True if the user's git email has an Amazon domain, false otherwise\n *\n * @example\n * // Returns true for Amazon employee emails\n * // git config user.email = \"john.doe@amazon.com\"\n * isAmazonian(); // true\n *\n * @example\n * // Returns false for non-Amazon emails\n * // git config user.email = \"user@example.com\"\n * isAmazonian(); // false\n *\n * @example\n * // Returns false when git config is not available or throws an error\n * isAmazonian(); // false\n */\nexport function isAmazonian(): boolean {\n try {\n // Execute git command to retrieve the user's configured email address\n const gitEmail = execSync('git config user.email', {\n encoding: 'utf8',\n }).trim();\n\n // Return false if no email is configured\n if (!gitEmail) {\n return false;\n }\n\n // Split email address to extract domain part\n const emailParts = gitEmail.split('@');\n if (emailParts.length < 2) {\n return false;\n }\n\n // Extract domain and normalize to lowercase for comparison\n const domain = emailParts[1].toLowerCase();\n\n // Check if domain starts with 'amazon.' (covers amazon.com, amazon.co.uk, etc.)\n return domain.startsWith('amazon.');\n } catch (error) {\n // Return false if git command fails or any other error occurs\n // This handles cases where git is not installed or configured\n return false;\n }\n}\n\nexport const presetGenerator = async (\n tree: Tree,\n {\n iac,\n gitSecrets,\n mcp,\n containers,\n module,\n catalog,\n preferInstallDependencies,\n }: PresetGeneratorSchema,\n): Promise<GeneratorCallback> => {\n if (\n isAmazonian() &&\n !process.env.VITEST &&\n !process.env.CI &&\n process.env.NX_DRY_RUN !== 'true' &&\n process.env.NX_INTERACTIVE !== 'false'\n ) {\n const { engagementId } = await enquirer.prompt<{ engagementId?: string }>([\n {\n name: 'engagementId',\n message: 'Please enter your engagementId (if known)',\n type: 'input',\n initial: 'None',\n },\n ]);\n\n if (engagementId != 'None') {\n await ensureAwsNxPluginConfig(tree);\n await updateAwsNxPluginConfig(tree, { tags: [engagementId] });\n }\n }\n\n // The preset owns the greenfield workspace's module format: write the root\n // `type` explicitly from the chosen `--module` so later generators can\n // infer it. The `init` generator never touches an existing workspace's\n // `type` field.\n updateJson(tree, 'package.json', (packageJson) => ({\n ...packageJson,\n type: (module ?? 'esm') === 'esm' ? 'module' : 'commonjs',\n }));\n\n // Apply the deterministic workspace configuration shared with the `init`\n // generator. The preset owns the README of a greenfield workspace.\n await applyWorkspaceInit(\n tree,\n {\n iac,\n containers,\n mcp,\n catalogs: catalog ?? true,\n readmeOverwriteStrategy: OverwriteStrategy.Overwrite,\n overwriteScripts: true,\n },\n DEPENDENCIES,\n );\n\n tree.delete('apps/.gitkeep');\n tree.delete('libs/.gitkeep');\n tree.write('packages/.gitkeep', '');\n\n if (gitSecrets !== false) {\n setUpGitSecrets(tree, DEPENDENCIES);\n }\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default presetGenerator;\n"],"names":["OverwriteStrategy","updateJson","execSync","enquirer","ensureAwsNxPluginConfig","updateAwsNxPluginConfig","declareDependencies","formatFilesInSubtree","GIT_SECRETS_DEPENDENCIES","setUpGitSecrets","applyWorkspaceInit","INIT_DEPENDENCIES","installDependencies","getGeneratorInfo","DEPENDENCIES","ts","PRESET_GENERATOR_INFO","filename","isAmazonian","gitEmail","encoding","trim","emailParts","split","length","domain","toLowerCase","startsWith","error","presetGenerator","tree","iac","gitSecrets","mcp","containers","module","catalog","preferInstallDependencies","process","env","VITEST","CI","NX_DRY_RUN","NX_INTERACTIVE","engagementId","prompt","name","message","type","initial","tags","packageJson","catalogs","readmeOverwriteStrategy","Overwrite","overwriteScripts","delete","write","languages"],"mappings":"AAAA;;;CAGC,GACD,SAEEA,iBAAiB,EAEjBC,UAAU,QACL,aAAa;AACpB,SAASC,QAAQ,QAAQ,gBAAgB;AACzC,OAAOC,cAAc,WAAW;AAChC,SACEC,uBAAuB,EACvBC,uBAAuB,QAClB,2BAA2B;AAClC,SAASC,mBAAmB,QAAQ,oCAAoC;AACxE,SAASC,oBAAoB,QAAQ,qBAAqB;AAC1D,SACEC,wBAAwB,EACxBC,eAAe,QACV,0BAA0B;AACjC,SAASC,kBAAkB,EAAEC,iBAAiB,QAAQ,mBAAmB;AACzE,SAASC,mBAAmB,QAAQ,sBAAsB;AAC1D,SAASC,gBAAgB,QAA8B,iBAAiB;AAGxE,OAAO,MAAMC,eAAeR,sBAAsB;IAChDS,IAAI;WAAIP;WAA6BG;KAAkB;AACzD,GAAG;AAEH,OAAO,MAAMK,wBAAyCH,iBACpD,YAAYI,QAAQ,EACpB;AAEF;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,SAASC;IACd,IAAI;QACF,sEAAsE;QACtE,MAAMC,WAAWjB,SAAS,yBAAyB;YACjDkB,UAAU;QACZ,GAAGC,IAAI;QAEP,yCAAyC;QACzC,IAAI,CAACF,UAAU;YACb,OAAO;QACT;QAEA,6CAA6C;QAC7C,MAAMG,aAAaH,SAASI,KAAK,CAAC;QAClC,IAAID,WAAWE,MAAM,GAAG,GAAG;YACzB,OAAO;QACT;QAEA,2DAA2D;QAC3D,MAAMC,SAASH,UAAU,CAAC,EAAE,CAACI,WAAW;QAExC,gFAAgF;QAChF,OAAOD,OAAOE,UAAU,CAAC;IAC3B,EAAE,OAAOC,OAAO;QACd,8DAA8D;QAC9D,8DAA8D;QAC9D,OAAO;IACT;AACF;AAEA,OAAO,MAAMC,kBAAkB,OAC7BC,MACA,EACEC,GAAG,EACHC,UAAU,EACVC,GAAG,EACHC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,yBAAyB,EACH;IAExB,IACEnB,iBACA,CAACoB,QAAQC,GAAG,CAACC,MAAM,IACnB,CAACF,QAAQC,GAAG,CAACE,EAAE,IACfH,QAAQC,GAAG,CAACG,UAAU,KAAK,UAC3BJ,QAAQC,GAAG,CAACI,cAAc,KAAK,SAC/B;QACA,MAAM,EAAEC,YAAY,EAAE,GAAG,MAAMzC,SAAS0C,MAAM,CAA4B;YACxE;gBACEC,MAAM;gBACNC,SAAS;gBACTC,MAAM;gBACNC,SAAS;YACX;SACD;QAED,IAAIL,gBAAgB,QAAQ;YAC1B,MAAMxC,wBAAwB0B;YAC9B,MAAMzB,wBAAwByB,MAAM;gBAAEoB,MAAM;oBAACN;iBAAa;YAAC;QAC7D;IACF;IAEA,2EAA2E;IAC3E,uEAAuE;IACvE,uEAAuE;IACvE,gBAAgB;IAChB3C,WAAW6B,MAAM,gBAAgB,CAACqB,cAAiB,CAAA;YACjD,GAAGA,WAAW;YACdH,MAAM,AAACb,CAAAA,UAAU,KAAI,MAAO,QAAQ,WAAW;QACjD,CAAA;IAEA,yEAAyE;IACzE,mEAAmE;IACnE,MAAMzB,mBACJoB,MACA;QACEC;QACAG;QACAD;QACAmB,UAAUhB,WAAW;QACrBiB,yBAAyBrD,kBAAkBsD,SAAS;QACpDC,kBAAkB;IACpB,GACAzC;IAGFgB,KAAK0B,MAAM,CAAC;IACZ1B,KAAK0B,MAAM,CAAC;IACZ1B,KAAK2B,KAAK,CAAC,qBAAqB;IAEhC,IAAIzB,eAAe,OAAO;QACxBvB,gBAAgBqB,MAAMhB;IACxB;IAEA,MAAMP,qBAAqBuB;IAC3B,OAAO,IACLlB,oBAAoBkB,MAAMO,2BAA2B;YACnDqB,WAAW;gBAAC;aAAa;QAC3B;AACJ,EAAE;AAEF,eAAe7B,gBAAgB"}
@@ -10,7 +10,7 @@ import type { PyAgentA2aConnectionGeneratorSchema } from './schema';
10
10
  export interface PyAgentA2aConnectionMetadata {
11
11
  readonly framework: AgentFramework;
12
12
  }
13
- export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.js").DependencyDeclaration<readonly import("../../../utils/declared-dependencies.js").DeclaredTsDependency<"@ag-ui/client" | "@ag-ui/core" | "@ag-ui/encoder" | "@biomejs/biome" | "@a2a-js/sdk" | "@aws/aws-distro-opentelemetry-node-autoinstrumentation" | "@opentelemetry/propagator-jaeger" | "minimatch" | "@aws-sdk/client-dynamodb" | "@aws-sdk/client-api-gateway" | "@aws-sdk/client-iam" | "@aws-sdk/client-bedrock-agentcore" | "@aws-sdk/client-bedrock-runtime" | "@aws-sdk/client-s3" | "@aws-sdk/client-sts" | "@aws-sdk/credential-providers" | "@aws-sdk/credential-provider-cognito-identity" | "@aws-sdk/client-secrets-manager" | "@aws-sdk/rds-signer" | "@smithy/server-apigateway" | "@smithy/server-node" | "@aws-lambda-powertools/logger" | "@aws-lambda-powertools/metrics" | "@aws-lambda-powertools/parameters" | "@aws-lambda-powertools/tracer" | "@aws-lambda-powertools/parser" | "@aws-sdk/client-appconfigdata" | "@middy/core" | "@nxlv/python" | "@nx-extend/terraform" | "nx" | "@nx/devkit" | "@nx/js" | "@nx/react" | "@nx/vite" | "@nx/vitest" | "@nx/workspace" | "create-nx-workspace" | "@swc-node/register" | "@swc/core" | "@modelcontextprotocol/sdk" | "@modelcontextprotocol/inspector" | "@ag-ui/a2ui-toolkit" | "@ag-ui/aws-strands" | "agent-chat-cli" | "@copilotkit/react-core" | "rxjs" | "@strands-agents/sdk" | "@tanstack/react-router" | "@tanstack/router-plugin" | "@tanstack/router-generator" | "@tanstack/virtual-file-routes" | "@tanstack/router-utils" | "@cloudscape-design/board-components" | "@cloudscape-design/chat-components" | "@cloudscape-design/components" | "@cloudscape-design/global-styles" | "@tanstack/react-query" | "@tanstack/react-query-devtools" | "@trpc/tanstack-react-query" | "@trpc/client" | "@trpc/server" | "@types/node" | "@types/aws-lambda" | "@types/cors" | "@types/pg" | "@types/ws" | "@types/express" | "@smithy/config-resolver" | "@smithy/node-config-provider" | "@smithy/node-http-handler" | "@smithy/types" | "@vitest/coverage-v8" | "@vitest/ui" | "@astrojs/react" | "@astrojs/starlight" | "astro" | "cookie" | "aws4fetch" | "aws-cdk" | "aws-cdk-lib" | "aws-xray-sdk-core" | "constructs" | "cors" | "chalk" | "class-variance-authority" | "clsx" | "commander" | "electrodb" | "esbuild" | "event-source-polyfill" | "@types/event-source-polyfill" | "@prisma/adapter-mariadb" | "@prisma/adapter-pg" | "@prisma/client" | "ejs" | "@types/ejs" | "express" | "fast-glob" | "husky" | "fs-extra" | "@types/fs-extra" | "mariadb" | "mise" | "npm" | "npm-check-updates" | "oidc-client-ts" | "pg" | "prisma" | "react-oidc-context" | "react" | "react-dom" | "rolldown" | "rolldown-plugin-dts" | "shx" | "simple-git" | "source-map-support" | "starlight-blog" | "tailwindcss" | "@tailwindcss/vite" | "tsx" | "lucide-react" | "radix-ui" | "shadcn" | "tw-animate-css" | "tailwind-merge" | "vite" | "typescript" | "vitest" | "jsdom" | "zod" | "ws", PyAgentA2aConnectionMetadata>[], readonly [{
13
+ export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.js").DependencyDeclaration<readonly import("../../../utils/declared-dependencies.js").DeclaredTsDependency<"@ag-ui/client" | "@ag-ui/core" | "@ag-ui/encoder" | "@biomejs/biome" | "@a2a-js/sdk" | "@aws/aws-distro-opentelemetry-node-autoinstrumentation" | "@opentelemetry/propagator-jaeger" | "minimatch" | "deepmerge-ts" | "mysql2" | "@aws-sdk/client-dynamodb" | "@aws-sdk/client-api-gateway" | "@aws-sdk/client-iam" | "@aws-sdk/client-bedrock-agentcore" | "@aws-sdk/client-bedrock-runtime" | "@aws-sdk/client-s3" | "@aws-sdk/client-sts" | "@aws-sdk/client-cognito-identity-provider" | "@aws-sdk/credential-providers" | "@aws-sdk/credential-provider-cognito-identity" | "@aws-sdk/client-secrets-manager" | "@aws-sdk/rds-signer" | "@smithy/server-apigateway" | "@smithy/server-node" | "@aws-lambda-powertools/logger" | "@aws-lambda-powertools/metrics" | "@aws-lambda-powertools/parameters" | "@aws-lambda-powertools/tracer" | "@aws-lambda-powertools/parser" | "@aws-sdk/client-appconfigdata" | "@middy/core" | "@nxlv/python" | "@nx-extend/terraform" | "nx" | "@nx/devkit" | "@nx/js" | "@nx/react" | "@nx/vite" | "@nx/vitest" | "@nx/workspace" | "create-nx-workspace" | "@swc-node/register" | "@swc/core" | "@modelcontextprotocol/sdk" | "@modelcontextprotocol/inspector" | "@ag-ui/a2ui-toolkit" | "@ag-ui/aws-strands" | "agent-chat-cli" | "@copilotkit/react-core" | "rxjs" | "@strands-agents/sdk" | "@tanstack/react-router" | "@tanstack/router-plugin" | "@tanstack/router-generator" | "@tanstack/virtual-file-routes" | "@tanstack/router-utils" | "@cloudscape-design/board-components" | "@cloudscape-design/chat-components" | "@cloudscape-design/components" | "@cloudscape-design/global-styles" | "@tanstack/react-query" | "@tanstack/react-query-devtools" | "@trpc/tanstack-react-query" | "@trpc/client" | "@trpc/server" | "@types/node" | "@types/aws-lambda" | "@types/cors" | "@types/pg" | "@types/ws" | "@types/express" | "@smithy/config-resolver" | "@smithy/node-config-provider" | "@smithy/node-http-handler" | "@smithy/types" | "@vitest/coverage-v8" | "@vitest/ui" | "@astrojs/react" | "@astrojs/starlight" | "astro" | "cookie" | "aws4fetch" | "aws-cdk" | "aws-cdk-lib" | "aws-xray-sdk-core" | "constructs" | "cors" | "chalk" | "class-variance-authority" | "clsx" | "commander" | "electrodb" | "esbuild" | "event-source-polyfill" | "@types/event-source-polyfill" | "@prisma/adapter-mariadb" | "@prisma/adapter-pg" | "@prisma/client" | "ejs" | "@types/ejs" | "express" | "fast-glob" | "husky" | "fs-extra" | "@types/fs-extra" | "mariadb" | "mise" | "npm" | "npm-check-updates" | "oidc-client-ts" | "pg" | "prisma" | "react-oidc-context" | "react" | "react-dom" | "rolldown" | "rolldown-plugin-dts" | "shx" | "simple-git" | "source-map-support" | "starlight-blog" | "tailwindcss" | "@tailwindcss/vite" | "tsx" | "lucide-react" | "radix-ui" | "shadcn" | "tw-animate-css" | "tailwind-merge" | "vite" | "typescript" | "vitest" | "jsdom" | "zod" | "ws", PyAgentA2aConnectionMetadata>[], readonly [{
14
14
  readonly name: "boto3";
15
15
  }, {
16
16
  readonly name: "httpx";
@@ -10,7 +10,7 @@ import type { PyAgentGatewayConnectionGeneratorSchema } from './schema';
10
10
  export interface PyAgentGatewayConnectionMetadata {
11
11
  readonly framework: AgentFramework;
12
12
  }
13
- export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.js").DependencyDeclaration<readonly import("../../../utils/declared-dependencies.js").DeclaredTsDependency<"@ag-ui/client" | "@ag-ui/core" | "@ag-ui/encoder" | "@biomejs/biome" | "@a2a-js/sdk" | "@aws/aws-distro-opentelemetry-node-autoinstrumentation" | "@opentelemetry/propagator-jaeger" | "minimatch" | "@aws-sdk/client-dynamodb" | "@aws-sdk/client-api-gateway" | "@aws-sdk/client-iam" | "@aws-sdk/client-bedrock-agentcore" | "@aws-sdk/client-bedrock-runtime" | "@aws-sdk/client-s3" | "@aws-sdk/client-sts" | "@aws-sdk/credential-providers" | "@aws-sdk/credential-provider-cognito-identity" | "@aws-sdk/client-secrets-manager" | "@aws-sdk/rds-signer" | "@smithy/server-apigateway" | "@smithy/server-node" | "@aws-lambda-powertools/logger" | "@aws-lambda-powertools/metrics" | "@aws-lambda-powertools/parameters" | "@aws-lambda-powertools/tracer" | "@aws-lambda-powertools/parser" | "@aws-sdk/client-appconfigdata" | "@middy/core" | "@nxlv/python" | "@nx-extend/terraform" | "nx" | "@nx/devkit" | "@nx/js" | "@nx/react" | "@nx/vite" | "@nx/vitest" | "@nx/workspace" | "create-nx-workspace" | "@swc-node/register" | "@swc/core" | "@modelcontextprotocol/sdk" | "@modelcontextprotocol/inspector" | "@ag-ui/a2ui-toolkit" | "@ag-ui/aws-strands" | "agent-chat-cli" | "@copilotkit/react-core" | "rxjs" | "@strands-agents/sdk" | "@tanstack/react-router" | "@tanstack/router-plugin" | "@tanstack/router-generator" | "@tanstack/virtual-file-routes" | "@tanstack/router-utils" | "@cloudscape-design/board-components" | "@cloudscape-design/chat-components" | "@cloudscape-design/components" | "@cloudscape-design/global-styles" | "@tanstack/react-query" | "@tanstack/react-query-devtools" | "@trpc/tanstack-react-query" | "@trpc/client" | "@trpc/server" | "@types/node" | "@types/aws-lambda" | "@types/cors" | "@types/pg" | "@types/ws" | "@types/express" | "@smithy/config-resolver" | "@smithy/node-config-provider" | "@smithy/node-http-handler" | "@smithy/types" | "@vitest/coverage-v8" | "@vitest/ui" | "@astrojs/react" | "@astrojs/starlight" | "astro" | "cookie" | "aws4fetch" | "aws-cdk" | "aws-cdk-lib" | "aws-xray-sdk-core" | "constructs" | "cors" | "chalk" | "class-variance-authority" | "clsx" | "commander" | "electrodb" | "esbuild" | "event-source-polyfill" | "@types/event-source-polyfill" | "@prisma/adapter-mariadb" | "@prisma/adapter-pg" | "@prisma/client" | "ejs" | "@types/ejs" | "express" | "fast-glob" | "husky" | "fs-extra" | "@types/fs-extra" | "mariadb" | "mise" | "npm" | "npm-check-updates" | "oidc-client-ts" | "pg" | "prisma" | "react-oidc-context" | "react" | "react-dom" | "rolldown" | "rolldown-plugin-dts" | "shx" | "simple-git" | "source-map-support" | "starlight-blog" | "tailwindcss" | "@tailwindcss/vite" | "tsx" | "lucide-react" | "radix-ui" | "shadcn" | "tw-animate-css" | "tailwind-merge" | "vite" | "typescript" | "vitest" | "jsdom" | "zod" | "ws", PyAgentGatewayConnectionMetadata>[], readonly [{
13
+ export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.js").DependencyDeclaration<readonly import("../../../utils/declared-dependencies.js").DeclaredTsDependency<"@ag-ui/client" | "@ag-ui/core" | "@ag-ui/encoder" | "@biomejs/biome" | "@a2a-js/sdk" | "@aws/aws-distro-opentelemetry-node-autoinstrumentation" | "@opentelemetry/propagator-jaeger" | "minimatch" | "deepmerge-ts" | "mysql2" | "@aws-sdk/client-dynamodb" | "@aws-sdk/client-api-gateway" | "@aws-sdk/client-iam" | "@aws-sdk/client-bedrock-agentcore" | "@aws-sdk/client-bedrock-runtime" | "@aws-sdk/client-s3" | "@aws-sdk/client-sts" | "@aws-sdk/client-cognito-identity-provider" | "@aws-sdk/credential-providers" | "@aws-sdk/credential-provider-cognito-identity" | "@aws-sdk/client-secrets-manager" | "@aws-sdk/rds-signer" | "@smithy/server-apigateway" | "@smithy/server-node" | "@aws-lambda-powertools/logger" | "@aws-lambda-powertools/metrics" | "@aws-lambda-powertools/parameters" | "@aws-lambda-powertools/tracer" | "@aws-lambda-powertools/parser" | "@aws-sdk/client-appconfigdata" | "@middy/core" | "@nxlv/python" | "@nx-extend/terraform" | "nx" | "@nx/devkit" | "@nx/js" | "@nx/react" | "@nx/vite" | "@nx/vitest" | "@nx/workspace" | "create-nx-workspace" | "@swc-node/register" | "@swc/core" | "@modelcontextprotocol/sdk" | "@modelcontextprotocol/inspector" | "@ag-ui/a2ui-toolkit" | "@ag-ui/aws-strands" | "agent-chat-cli" | "@copilotkit/react-core" | "rxjs" | "@strands-agents/sdk" | "@tanstack/react-router" | "@tanstack/router-plugin" | "@tanstack/router-generator" | "@tanstack/virtual-file-routes" | "@tanstack/router-utils" | "@cloudscape-design/board-components" | "@cloudscape-design/chat-components" | "@cloudscape-design/components" | "@cloudscape-design/global-styles" | "@tanstack/react-query" | "@tanstack/react-query-devtools" | "@trpc/tanstack-react-query" | "@trpc/client" | "@trpc/server" | "@types/node" | "@types/aws-lambda" | "@types/cors" | "@types/pg" | "@types/ws" | "@types/express" | "@smithy/config-resolver" | "@smithy/node-config-provider" | "@smithy/node-http-handler" | "@smithy/types" | "@vitest/coverage-v8" | "@vitest/ui" | "@astrojs/react" | "@astrojs/starlight" | "astro" | "cookie" | "aws4fetch" | "aws-cdk" | "aws-cdk-lib" | "aws-xray-sdk-core" | "constructs" | "cors" | "chalk" | "class-variance-authority" | "clsx" | "commander" | "electrodb" | "esbuild" | "event-source-polyfill" | "@types/event-source-polyfill" | "@prisma/adapter-mariadb" | "@prisma/adapter-pg" | "@prisma/client" | "ejs" | "@types/ejs" | "express" | "fast-glob" | "husky" | "fs-extra" | "@types/fs-extra" | "mariadb" | "mise" | "npm" | "npm-check-updates" | "oidc-client-ts" | "pg" | "prisma" | "react-oidc-context" | "react" | "react-dom" | "rolldown" | "rolldown-plugin-dts" | "shx" | "simple-git" | "source-map-support" | "starlight-blog" | "tailwindcss" | "@tailwindcss/vite" | "tsx" | "lucide-react" | "radix-ui" | "shadcn" | "tw-animate-css" | "tailwind-merge" | "vite" | "typescript" | "vitest" | "jsdom" | "zod" | "ws", PyAgentGatewayConnectionMetadata>[], readonly [{
14
14
  readonly name: "boto3";
15
15
  }, {
16
16
  readonly name: "httpx";
@@ -10,7 +10,7 @@ import type { PyAgentMcpConnectionGeneratorSchema } from './schema';
10
10
  export interface PyAgentMcpConnectionMetadata {
11
11
  readonly framework: AgentFramework;
12
12
  }
13
- export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.js").DependencyDeclaration<readonly import("../../../utils/declared-dependencies.js").DeclaredTsDependency<"@ag-ui/client" | "@ag-ui/core" | "@ag-ui/encoder" | "@biomejs/biome" | "@a2a-js/sdk" | "@aws/aws-distro-opentelemetry-node-autoinstrumentation" | "@opentelemetry/propagator-jaeger" | "minimatch" | "@aws-sdk/client-dynamodb" | "@aws-sdk/client-api-gateway" | "@aws-sdk/client-iam" | "@aws-sdk/client-bedrock-agentcore" | "@aws-sdk/client-bedrock-runtime" | "@aws-sdk/client-s3" | "@aws-sdk/client-sts" | "@aws-sdk/credential-providers" | "@aws-sdk/credential-provider-cognito-identity" | "@aws-sdk/client-secrets-manager" | "@aws-sdk/rds-signer" | "@smithy/server-apigateway" | "@smithy/server-node" | "@aws-lambda-powertools/logger" | "@aws-lambda-powertools/metrics" | "@aws-lambda-powertools/parameters" | "@aws-lambda-powertools/tracer" | "@aws-lambda-powertools/parser" | "@aws-sdk/client-appconfigdata" | "@middy/core" | "@nxlv/python" | "@nx-extend/terraform" | "nx" | "@nx/devkit" | "@nx/js" | "@nx/react" | "@nx/vite" | "@nx/vitest" | "@nx/workspace" | "create-nx-workspace" | "@swc-node/register" | "@swc/core" | "@modelcontextprotocol/sdk" | "@modelcontextprotocol/inspector" | "@ag-ui/a2ui-toolkit" | "@ag-ui/aws-strands" | "agent-chat-cli" | "@copilotkit/react-core" | "rxjs" | "@strands-agents/sdk" | "@tanstack/react-router" | "@tanstack/router-plugin" | "@tanstack/router-generator" | "@tanstack/virtual-file-routes" | "@tanstack/router-utils" | "@cloudscape-design/board-components" | "@cloudscape-design/chat-components" | "@cloudscape-design/components" | "@cloudscape-design/global-styles" | "@tanstack/react-query" | "@tanstack/react-query-devtools" | "@trpc/tanstack-react-query" | "@trpc/client" | "@trpc/server" | "@types/node" | "@types/aws-lambda" | "@types/cors" | "@types/pg" | "@types/ws" | "@types/express" | "@smithy/config-resolver" | "@smithy/node-config-provider" | "@smithy/node-http-handler" | "@smithy/types" | "@vitest/coverage-v8" | "@vitest/ui" | "@astrojs/react" | "@astrojs/starlight" | "astro" | "cookie" | "aws4fetch" | "aws-cdk" | "aws-cdk-lib" | "aws-xray-sdk-core" | "constructs" | "cors" | "chalk" | "class-variance-authority" | "clsx" | "commander" | "electrodb" | "esbuild" | "event-source-polyfill" | "@types/event-source-polyfill" | "@prisma/adapter-mariadb" | "@prisma/adapter-pg" | "@prisma/client" | "ejs" | "@types/ejs" | "express" | "fast-glob" | "husky" | "fs-extra" | "@types/fs-extra" | "mariadb" | "mise" | "npm" | "npm-check-updates" | "oidc-client-ts" | "pg" | "prisma" | "react-oidc-context" | "react" | "react-dom" | "rolldown" | "rolldown-plugin-dts" | "shx" | "simple-git" | "source-map-support" | "starlight-blog" | "tailwindcss" | "@tailwindcss/vite" | "tsx" | "lucide-react" | "radix-ui" | "shadcn" | "tw-animate-css" | "tailwind-merge" | "vite" | "typescript" | "vitest" | "jsdom" | "zod" | "ws", PyAgentMcpConnectionMetadata>[], readonly [{
13
+ export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.js").DependencyDeclaration<readonly import("../../../utils/declared-dependencies.js").DeclaredTsDependency<"@ag-ui/client" | "@ag-ui/core" | "@ag-ui/encoder" | "@biomejs/biome" | "@a2a-js/sdk" | "@aws/aws-distro-opentelemetry-node-autoinstrumentation" | "@opentelemetry/propagator-jaeger" | "minimatch" | "deepmerge-ts" | "mysql2" | "@aws-sdk/client-dynamodb" | "@aws-sdk/client-api-gateway" | "@aws-sdk/client-iam" | "@aws-sdk/client-bedrock-agentcore" | "@aws-sdk/client-bedrock-runtime" | "@aws-sdk/client-s3" | "@aws-sdk/client-sts" | "@aws-sdk/client-cognito-identity-provider" | "@aws-sdk/credential-providers" | "@aws-sdk/credential-provider-cognito-identity" | "@aws-sdk/client-secrets-manager" | "@aws-sdk/rds-signer" | "@smithy/server-apigateway" | "@smithy/server-node" | "@aws-lambda-powertools/logger" | "@aws-lambda-powertools/metrics" | "@aws-lambda-powertools/parameters" | "@aws-lambda-powertools/tracer" | "@aws-lambda-powertools/parser" | "@aws-sdk/client-appconfigdata" | "@middy/core" | "@nxlv/python" | "@nx-extend/terraform" | "nx" | "@nx/devkit" | "@nx/js" | "@nx/react" | "@nx/vite" | "@nx/vitest" | "@nx/workspace" | "create-nx-workspace" | "@swc-node/register" | "@swc/core" | "@modelcontextprotocol/sdk" | "@modelcontextprotocol/inspector" | "@ag-ui/a2ui-toolkit" | "@ag-ui/aws-strands" | "agent-chat-cli" | "@copilotkit/react-core" | "rxjs" | "@strands-agents/sdk" | "@tanstack/react-router" | "@tanstack/router-plugin" | "@tanstack/router-generator" | "@tanstack/virtual-file-routes" | "@tanstack/router-utils" | "@cloudscape-design/board-components" | "@cloudscape-design/chat-components" | "@cloudscape-design/components" | "@cloudscape-design/global-styles" | "@tanstack/react-query" | "@tanstack/react-query-devtools" | "@trpc/tanstack-react-query" | "@trpc/client" | "@trpc/server" | "@types/node" | "@types/aws-lambda" | "@types/cors" | "@types/pg" | "@types/ws" | "@types/express" | "@smithy/config-resolver" | "@smithy/node-config-provider" | "@smithy/node-http-handler" | "@smithy/types" | "@vitest/coverage-v8" | "@vitest/ui" | "@astrojs/react" | "@astrojs/starlight" | "astro" | "cookie" | "aws4fetch" | "aws-cdk" | "aws-cdk-lib" | "aws-xray-sdk-core" | "constructs" | "cors" | "chalk" | "class-variance-authority" | "clsx" | "commander" | "electrodb" | "esbuild" | "event-source-polyfill" | "@types/event-source-polyfill" | "@prisma/adapter-mariadb" | "@prisma/adapter-pg" | "@prisma/client" | "ejs" | "@types/ejs" | "express" | "fast-glob" | "husky" | "fs-extra" | "@types/fs-extra" | "mariadb" | "mise" | "npm" | "npm-check-updates" | "oidc-client-ts" | "pg" | "prisma" | "react-oidc-context" | "react" | "react-dom" | "rolldown" | "rolldown-plugin-dts" | "shx" | "simple-git" | "source-map-support" | "starlight-blog" | "tailwindcss" | "@tailwindcss/vite" | "tsx" | "lucide-react" | "radix-ui" | "shadcn" | "tw-animate-css" | "tailwind-merge" | "vite" | "typescript" | "vitest" | "jsdom" | "zod" | "ws", PyAgentMcpConnectionMetadata>[], readonly [{
14
14
  readonly name: "boto3";
15
15
  }, {
16
16
  readonly name: "httpx";
@@ -311,6 +311,9 @@ class SigV4HttpAgent extends HttpAgent {
311
311
  }
312
312
  }
313
313
 
314
+ // The id this agent is registered under, used as \`agentId\` by CopilotKit components.
315
+ export const TEST_AGENT_ID = 'agent';
316
+
314
317
  export const useAguiTestAgent = (): Record<string, AbstractAgent> => {
315
318
  const runtimeConfig = useRuntimeConfig();
316
319
  const agentRuntimeValue = runtimeConfig.agentRuntimes.TestAgent;
@@ -327,7 +330,7 @@ export const useAguiTestAgent = (): Record<string, AbstractAgent> => {
327
330
  return useMemo((): Record<string, AbstractAgent> => {
328
331
  const agent = new SigV4HttpAgent({ url }, sigv4);
329
332
 
330
- return { agent: agent };
333
+ return { [TEST_AGENT_ID]: agent };
331
334
  }, [url, sigv4]);
332
335
  };
333
336
  "
@@ -674,12 +674,11 @@ logs.on('exit', cleanup);
674
674
  `;
675
675
 
676
676
  exports[`py#dynamodb generator > should generate the dynamodb project > packages/my_table/proj_my_table/__init__.py 1`] = `
677
- "from .entities import BaseModel, ExampleModel
677
+ """"Automatically generated by Nx."""
678
678
 
679
- __all__ = [
680
- "BaseModel",
681
- "ExampleModel",
682
- ]
679
+ from .entities import BaseModel, ExampleModel
680
+
681
+ __all__ = ["BaseModel", "ExampleModel"]
683
682
  "
684
683
  `;
685
684
 
@@ -1395,12 +1394,11 @@ logs.on('exit', cleanup);
1395
1394
  `;
1396
1395
 
1397
1396
  exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/my_table/proj_my_table/__init__.py 1`] = `
1398
- "from .entities import BaseModel, ExampleModel
1397
+ """"Automatically generated by Nx."""
1399
1398
 
1400
- __all__ = [
1401
- "BaseModel",
1402
- "ExampleModel",
1403
- ]
1399
+ from .entities import BaseModel, ExampleModel
1400
+
1401
+ __all__ = ["BaseModel", "ExampleModel"]
1404
1402
  "
1405
1403
  `;
1406
1404
 
@@ -2,10 +2,12 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { relative } from "node:path";
5
- import { generateFiles, joinPathFragments, readProjectConfiguration, updateProjectConfiguration } from "@nx/devkit";
5
+ import { generateFiles, joinPathFragments, OverwriteStrategy, readProjectConfiguration, updateProjectConfiguration } from "@nx/devkit";
6
6
  import { addPyDependencies } from "../../utils/add-dependencies.js";
7
+ import { addPythonReExport } from "../../utils/agent-connection/agent-connection.js";
7
8
  import { resolveContainers } from "../../utils/containers.js";
8
9
  import { declareDependencies, ownedElsewhere } from "../../utils/declared-dependencies.js";
10
+ import { DYNAMODB_LOCAL_IMAGE, writeDynamoDBConfig } from "../../utils/dynamodb-config.js";
9
11
  import { addDynamoDBInfra } from "../../utils/dynamodb-constructs/dynamodb-constructs.js";
10
12
  import { formatFilesInSubtree } from "../../utils/format.js";
11
13
  import { resolveIac } from "../../utils/iac.js";
@@ -60,13 +62,38 @@ export const pyDynamoDBGenerator = async (tree, options)=>{
60
62
  const containerName = `${getNpmScope(tree)}-dynamodb`;
61
63
  const templateOptions = {
62
64
  name: normalizedModuleName,
63
- runtimeConfigKey: nameClassName,
64
- localDynamoDBPort,
65
- localTableName,
66
- containerName,
67
- containerEngine
65
+ runtimeConfigKey: nameClassName
68
66
  };
69
- generateFiles(tree, joinPathFragments(import.meta.dirname, 'files'), dir, templateOptions);
67
+ // The entities and the client are the user's to author — the guide walks
68
+ // through adding entity modules under `entities/` — so a re-run leaves them
69
+ // alone.
70
+ generateFiles(tree, joinPathFragments(import.meta.dirname, 'files'), dir, templateOptions, {
71
+ overwriteStrategy: OverwriteStrategy.KeepExisting
72
+ });
73
+ // The barrels re-export the generated base and example models. Adding to
74
+ // whatever is already there registers them without discarding the user's own
75
+ // entity exports on a re-run — which matters beyond the barrel itself, since
76
+ // PynamoDB only registers a model's discriminator once it is imported.
77
+ const entitiesInitPath = joinPathFragments(dir, normalizedModuleName, 'entities', '__init__.py');
78
+ await addPythonReExport(tree, entitiesInitPath, '.base', 'BaseModel');
79
+ await addPythonReExport(tree, entitiesInitPath, '.example', 'ExampleModel');
80
+ const packageInitPath = joinPathFragments(dir, normalizedModuleName, '__init__.py');
81
+ for (const importName of [
82
+ 'BaseModel',
83
+ 'ExampleModel'
84
+ ]){
85
+ await addPythonReExport(tree, packageInitPath, '.entities', importName);
86
+ }
87
+ writeDynamoDBConfig(tree, dir, {
88
+ runtimeConfigKey: nameClassName,
89
+ localDev: {
90
+ port: localDynamoDBPort,
91
+ tableName: localTableName,
92
+ image: DYNAMODB_LOCAL_IMAGE,
93
+ containerName,
94
+ containerEngine
95
+ }
96
+ });
70
97
  await sharedDynamoDBScriptsGenerator(tree, DEPENDENCIES);
71
98
  const scriptsDir = relative(dir, joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'dynamodb'));
72
99
  projectConfig.targets['pull-image'] = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/dynamodb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { relative } from 'node:path';\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n readProjectConfiguration,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addPyDependencies } from '../../utils/add-dependencies.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport { addDynamoDBInfra } from '../../utils/dynamodb-constructs/dynamodb-constructs.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { kebabCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n projectExists,\n} from '../../utils/nx.js';\nimport { assignSharedPort } from '../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n DYNAMODB_GENERATOR_IDS,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_DYNAMODB_SCRIPTS_DEPENDENCIES,\n sharedDynamoDBScriptsGenerator,\n} from '../../utils/shared-dynamodb-scripts.js';\nimport pyProjectGenerator, {\n getPyProjectDetails,\n} from '../project/generator.js';\nimport type { PyDynamoDBGeneratorSchema } from './schema';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n ...ownedElsewhere(SHARED_DYNAMODB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: [\n { name: 'pynamodb' },\n { name: 'boto3' },\n { name: 'aws-lambda-powertools' },\n ],\n});\n\nexport const PY_DYNAMODB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const pyDynamoDBGenerator = async (\n tree: Tree,\n options: PyDynamoDBGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameClassName = toClassName(options.name);\n const localTableName = `${getNpmScope(tree)}-${kebabCase(options.tableName ?? options.name)}`;\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir, normalizedModuleName } = getPyProjectDetails(\n tree,\n {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n },\n );\n\n if (!projectExists(tree, fullyQualifiedName)) {\n await pyProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n type: 'library',\n preferInstallDependencies: false,\n });\n }\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n\n const localDynamoDBPort = assignSharedPort(\n tree,\n projectConfig,\n DYNAMODB_GENERATOR_IDS,\n 8000,\n );\n\n const containerName = `${getNpmScope(tree)}-dynamodb`;\n\n const templateOptions = {\n name: normalizedModuleName,\n runtimeConfigKey: nameClassName,\n localDynamoDBPort,\n localTableName,\n containerName,\n containerEngine,\n };\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n );\n\n await sharedDynamoDBScriptsGenerator(tree, DEPENDENCIES);\n\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'dynamodb'),\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 continuous: true,\n dependsOn: ['pull-image'],\n options: {\n commands: [\n `tsx ${scriptsDir}/start-container.ts`,\n `tsx ${scriptsDir}/create-local-table.ts`,\n ],\n parallel: true,\n cwd: '{projectRoot}',\n },\n };\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded so the version sync can tell a CDK project from a Terraform one;\n // undefined when no infrastructure was generated.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n PY_DYNAMODB_GENERATOR_INFO,\n iac ? { iac } : {},\n );\n\n if (options.infra !== 'none') {\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addDynamoDBInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n nameClassName,\n nameKebabCase: kebabCase(options.name),\n tableName: localTableName,\n projectRoot: dir,\n });\n }\n\n addPyDependencies(tree, DEPENDENCIES, { projectRoot: dir });\n\n await addGeneratorMetricsIfApplicable(tree, [PY_DYNAMODB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript', 'python'],\n });\n};\n\nexport default pyDynamoDBGenerator;\n"],"names":["relative","generateFiles","joinPathFragments","readProjectConfiguration","updateProjectConfiguration","addPyDependencies","resolveContainers","declareDependencies","ownedElsewhere","addDynamoDBInfra","formatFilesInSubtree","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getNpmScope","addGeneratorMetadata","getGeneratorInfo","projectExists","assignSharedPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","DYNAMODB_GENERATOR_IDS","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_DYNAMODB_SCRIPTS_DEPENDENCIES","sharedDynamoDBScriptsGenerator","pyProjectGenerator","getPyProjectDetails","DEPENDENCIES","ts","py","name","PY_DYNAMODB_GENERATOR_INFO","filename","pyDynamoDBGenerator","tree","options","nameClassName","localTableName","tableName","containerEngine","fullyQualifiedName","dir","normalizedModuleName","directory","subDirectory","type","preferInstallDependencies","projectConfig","localDynamoDBPort","containerName","templateOptions","runtimeConfigKey","dirname","scriptsDir","targets","executor","command","cwd","continuous","dependsOn","commands","parallel","iac","infra","undefined","projectName","nameKebabCase","projectRoot","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/py/dynamodb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { relative } from 'node:path';\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addPyDependencies } from '../../utils/add-dependencies.js';\nimport { addPythonReExport } from '../../utils/agent-connection/agent-connection.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n DYNAMODB_LOCAL_IMAGE,\n writeDynamoDBConfig,\n} from '../../utils/dynamodb-config.js';\nimport { addDynamoDBInfra } from '../../utils/dynamodb-constructs/dynamodb-constructs.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { kebabCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n projectExists,\n} from '../../utils/nx.js';\nimport { assignSharedPort } from '../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n DYNAMODB_GENERATOR_IDS,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_DYNAMODB_SCRIPTS_DEPENDENCIES,\n sharedDynamoDBScriptsGenerator,\n} from '../../utils/shared-dynamodb-scripts.js';\nimport pyProjectGenerator, {\n getPyProjectDetails,\n} from '../project/generator.js';\nimport type { PyDynamoDBGeneratorSchema } from './schema';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n ...ownedElsewhere(SHARED_DYNAMODB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: [\n { name: 'pynamodb' },\n { name: 'boto3' },\n { name: 'aws-lambda-powertools' },\n ],\n});\n\nexport const PY_DYNAMODB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const pyDynamoDBGenerator = async (\n tree: Tree,\n options: PyDynamoDBGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameClassName = toClassName(options.name);\n const localTableName = `${getNpmScope(tree)}-${kebabCase(options.tableName ?? options.name)}`;\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir, normalizedModuleName } = getPyProjectDetails(\n tree,\n {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n },\n );\n\n if (!projectExists(tree, fullyQualifiedName)) {\n await pyProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n type: 'library',\n preferInstallDependencies: false,\n });\n }\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n\n const localDynamoDBPort = assignSharedPort(\n tree,\n projectConfig,\n DYNAMODB_GENERATOR_IDS,\n 8000,\n );\n\n const containerName = `${getNpmScope(tree)}-dynamodb`;\n\n const templateOptions = {\n name: normalizedModuleName,\n runtimeConfigKey: nameClassName,\n };\n\n // The entities and the client are the user's to author — the guide walks\n // through adding entity modules under `entities/` — so a re-run leaves them\n // alone.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The barrels re-export the generated base and example models. Adding to\n // whatever is already there registers them without discarding the user's own\n // entity exports on a re-run — which matters beyond the barrel itself, since\n // PynamoDB only registers a model's discriminator once it is imported.\n const entitiesInitPath = joinPathFragments(\n dir,\n normalizedModuleName,\n 'entities',\n '__init__.py',\n );\n await addPythonReExport(tree, entitiesInitPath, '.base', 'BaseModel');\n await addPythonReExport(tree, entitiesInitPath, '.example', 'ExampleModel');\n\n const packageInitPath = joinPathFragments(\n dir,\n normalizedModuleName,\n '__init__.py',\n );\n for (const importName of ['BaseModel', 'ExampleModel']) {\n await addPythonReExport(tree, packageInitPath, '.entities', importName);\n }\n\n writeDynamoDBConfig(tree, dir, {\n runtimeConfigKey: nameClassName,\n localDev: {\n port: localDynamoDBPort,\n tableName: localTableName,\n image: DYNAMODB_LOCAL_IMAGE,\n containerName,\n containerEngine,\n },\n });\n\n await sharedDynamoDBScriptsGenerator(tree, DEPENDENCIES);\n\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'dynamodb'),\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 continuous: true,\n dependsOn: ['pull-image'],\n options: {\n commands: [\n `tsx ${scriptsDir}/start-container.ts`,\n `tsx ${scriptsDir}/create-local-table.ts`,\n ],\n parallel: true,\n cwd: '{projectRoot}',\n },\n };\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded so the version sync can tell a CDK project from a Terraform one;\n // undefined when no infrastructure was generated.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n PY_DYNAMODB_GENERATOR_INFO,\n iac ? { iac } : {},\n );\n\n if (options.infra !== 'none') {\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addDynamoDBInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n nameClassName,\n nameKebabCase: kebabCase(options.name),\n tableName: localTableName,\n projectRoot: dir,\n });\n }\n\n addPyDependencies(tree, DEPENDENCIES, { projectRoot: dir });\n\n await addGeneratorMetricsIfApplicable(tree, [PY_DYNAMODB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript', 'python'],\n });\n};\n\nexport default pyDynamoDBGenerator;\n"],"names":["relative","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateProjectConfiguration","addPyDependencies","addPythonReExport","resolveContainers","declareDependencies","ownedElsewhere","DYNAMODB_LOCAL_IMAGE","writeDynamoDBConfig","addDynamoDBInfra","formatFilesInSubtree","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getNpmScope","addGeneratorMetadata","getGeneratorInfo","projectExists","assignSharedPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","DYNAMODB_GENERATOR_IDS","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_DYNAMODB_SCRIPTS_DEPENDENCIES","sharedDynamoDBScriptsGenerator","pyProjectGenerator","getPyProjectDetails","DEPENDENCIES","ts","py","name","PY_DYNAMODB_GENERATOR_INFO","filename","pyDynamoDBGenerator","tree","options","nameClassName","localTableName","tableName","containerEngine","fullyQualifiedName","dir","normalizedModuleName","directory","subDirectory","type","preferInstallDependencies","projectConfig","localDynamoDBPort","containerName","templateOptions","runtimeConfigKey","dirname","overwriteStrategy","KeepExisting","entitiesInitPath","packageInitPath","importName","localDev","port","image","scriptsDir","targets","executor","command","cwd","continuous","dependsOn","commands","parallel","iac","infra","undefined","projectName","nameKebabCase","projectRoot","languages"],"mappings":"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"}
@@ -17,7 +17,8 @@ tracer: Tracer = Tracer()
17
17
 
18
18
 
19
19
  @tracer.capture_lambda_handler
20
- @metrics.log_metrics
20
+ @logger.inject_lambda_context
21
+ @metrics.log_metrics(capture_cold_start_metric=True)
21
22
  def lambda_handler(event: dict, context: LambdaContext):
22
23
  logger.info("Received event", extra={"event": event})
23
24
  metrics.add_metric(name="InvocationCount", unit=MetricUnit.Count, value=1)
@@ -16,7 +16,8 @@ metrics: Metrics = Metrics()
16
16
  tracer: Tracer = Tracer()
17
17
 
18
18
  @tracer.capture_lambda_handler
19
- @metrics.log_metrics
19
+ @logger.inject_lambda_context
20
+ @metrics.log_metrics(capture_cold_start_metric=True)
20
21
  <%_ if (event !== 'Any') { _%>
21
22
  @event_parser(model=<%= event %>)
22
23
  <%_ } _%>
@@ -32,7 +32,9 @@
32
32
  "type": "string",
33
33
  "description": "Whether the project is an application or library",
34
34
  "default": "application",
35
- "enum": ["application", "library"]
35
+ "enum": ["application", "library"],
36
+ "x-priority": "important",
37
+ "x-prompt": "What type of Python project would you like to create?"
36
38
  },
37
39
  "moduleName": {
38
40
  "type": "string",
@@ -170,9 +170,13 @@ def handler(event: dict[str, Any], _context: Any) -> dict[str, Any]:
170
170
  exports[`py#rdb generator > should generate MySQL dependencies and templates 4`] = `
171
171
  "FROM public.ecr.aws/lambda/python:3.14
172
172
 
173
- # Patch OS packages beyond the base image's pinned release so the image is
174
- # free of known HIGH/CRITICAL vulnerabilities
175
- RUN microdnf upgrade -y --releasever latest && microdnf clean all
173
+ # Patch OS packages beyond the base image's pinned release, and drop pip, whose
174
+ # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
175
+ # The handler's dependencies are already installed in the image, so nothing
176
+ # installs packages at runtime.
177
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
178
+ && rm -rf /var/lang/lib/python*/site-packages/pip \\
179
+ /var/lang/lib/python*/site-packages/pip-*.dist-info
176
180
 
177
181
  WORKDIR \${LAMBDA_TASK_ROOT}
178
182
 
@@ -188,9 +192,13 @@ CMD ["proj_db.migration_handler.handler"]
188
192
  exports[`py#rdb generator > should generate MySQL dependencies and templates 5`] = `
189
193
  "FROM public.ecr.aws/lambda/python:3.14
190
194
 
191
- # Patch OS packages beyond the base image's pinned release so the image is
192
- # free of known HIGH/CRITICAL vulnerabilities
193
- RUN microdnf upgrade -y --releasever latest && microdnf clean all
195
+ # Patch OS packages beyond the base image's pinned release, and drop pip, whose
196
+ # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
197
+ # The handler's dependencies are already installed in the image, so nothing
198
+ # installs packages at runtime.
199
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
200
+ && rm -rf /var/lang/lib/python*/site-packages/pip \\
201
+ /var/lang/lib/python*/site-packages/pip-*.dist-info
194
202
 
195
203
  WORKDIR \${LAMBDA_TASK_ROOT}
196
204
 
@@ -1382,9 +1390,13 @@ datefmt = %H:%M:%S
1382
1390
  exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 2`] = `
1383
1391
  "FROM public.ecr.aws/lambda/python:3.14
1384
1392
 
1385
- # Patch OS packages beyond the base image's pinned release so the image is
1386
- # free of known HIGH/CRITICAL vulnerabilities
1387
- RUN microdnf upgrade -y --releasever latest && microdnf clean all
1393
+ # Patch OS packages beyond the base image's pinned release, and drop pip, whose
1394
+ # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
1395
+ # The handler's dependencies are already installed in the image, so nothing
1396
+ # installs packages at runtime.
1397
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
1398
+ && rm -rf /var/lang/lib/python*/site-packages/pip \\
1399
+ /var/lang/lib/python*/site-packages/pip-*.dist-info
1388
1400
 
1389
1401
  WORKDIR \${LAMBDA_TASK_ROOT}
1390
1402
 
@@ -1400,9 +1412,13 @@ CMD ["proj_db.migration_handler.handler"]
1400
1412
  exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 3`] = `
1401
1413
  "FROM public.ecr.aws/lambda/python:3.14
1402
1414
 
1403
- # Patch OS packages beyond the base image's pinned release so the image is
1404
- # free of known HIGH/CRITICAL vulnerabilities
1405
- RUN microdnf upgrade -y --releasever latest && microdnf clean all
1415
+ # Patch OS packages beyond the base image's pinned release, and drop pip, whose
1416
+ # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
1417
+ # The handler's dependencies are already installed in the image, so nothing
1418
+ # installs packages at runtime.
1419
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
1420
+ && rm -rf /var/lang/lib/python*/site-packages/pip \\
1421
+ /var/lang/lib/python*/site-packages/pip-*.dist-info
1406
1422
 
1407
1423
  WORKDIR \${LAMBDA_TASK_ROOT}
1408
1424
 
@@ -1,8 +1,12 @@
1
1
  FROM public.ecr.aws/lambda/python:3.14
2
2
 
3
- # Patch OS packages beyond the base image's pinned release so the image is
4
- # free of known HIGH/CRITICAL vulnerabilities
5
- RUN microdnf upgrade -y --releasever latest && microdnf clean all
3
+ # Patch OS packages beyond the base image's pinned release, and drop pip, whose
4
+ # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
5
+ # The handler's dependencies are already installed in the image, so nothing
6
+ # installs packages at runtime.
7
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all \
8
+ && rm -rf /var/lang/lib/python*/site-packages/pip \
9
+ /var/lang/lib/python*/site-packages/pip-*.dist-info
6
10
 
7
11
  WORKDIR ${LAMBDA_TASK_ROOT}
8
12