@aws/nx-plugin 1.0.0-rc.46 → 1.0.0-rc.48

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 (182) hide show
  1. package/LICENSE-THIRD-PARTY +3 -60
  2. package/generators.json +1 -1
  3. package/package.json +7 -6
  4. package/src/agentcore-gateway/generator.js +12 -2
  5. package/src/agentcore-gateway/generator.js.map +1 -1
  6. package/src/infra/app/__snapshots__/generator.spec.ts.snap +25 -31
  7. package/src/infra/app/generator.js +9 -6
  8. package/src/infra/app/generator.js.map +1 -1
  9. package/src/license/config.js +1 -1
  10. package/src/license/config.js.map +1 -1
  11. package/src/mcp-server/dev-server.d.ts +1 -0
  12. package/src/mcp-server/dev-server.js +18 -0
  13. package/src/mcp-server/dev-server.js.map +1 -0
  14. package/src/mcp-server/schema.d.ts +1 -1
  15. package/src/mcp-server/tools/general-guidance.js +5 -6
  16. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  17. package/src/preset/__snapshots__/generator.spec.ts.snap +42 -7
  18. package/src/preset/generator.d.ts +1 -1
  19. package/src/preset/generator.js +4 -2
  20. package/src/preset/generator.js.map +1 -1
  21. package/src/preset/schema.d.js.map +1 -1
  22. package/src/preset/schema.d.ts +1 -0
  23. package/src/preset/schema.json +5 -0
  24. package/src/py/agent/generator.js +2 -1
  25. package/src/py/agent/generator.js.map +1 -1
  26. package/src/py/mcp-server/generator.js +2 -1
  27. package/src/py/mcp-server/generator.js.map +1 -1
  28. package/src/py/project/generator.js +2 -1
  29. package/src/py/project/generator.js.map +1 -1
  30. package/src/py/rdb/generator.js +2 -1
  31. package/src/py/rdb/generator.js.map +1 -1
  32. package/src/smithy/ts/api/generator.js +5 -2
  33. package/src/smithy/ts/api/generator.js.map +1 -1
  34. package/src/terraform/project/generator.js +4 -1
  35. package/src/terraform/project/generator.js.map +1 -1
  36. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +6 -6
  37. package/src/trpc/backend/generator.js +7 -5
  38. package/src/trpc/backend/generator.js.map +1 -1
  39. package/src/trpc/react/generator.js +4 -4
  40. package/src/trpc/react/generator.js.map +1 -1
  41. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +9 -5
  42. package/src/ts/agent/a2a-connection/generator.js +3 -2
  43. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  44. package/src/ts/agent/files/deploy/Dockerfile.template +7 -3
  45. package/src/ts/agent/gateway-connection/generator.js +4 -3
  46. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  47. package/src/ts/agent/generator.js +10 -7
  48. package/src/ts/agent/generator.js.map +1 -1
  49. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +1 -1
  50. package/src/ts/agent/mcp-connection/generator.js +4 -3
  51. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  52. package/src/ts/agent/react-connection/generator.js +10 -19
  53. package/src/ts/agent/react-connection/generator.js.map +1 -1
  54. package/src/ts/astro-docs/generator.js +12 -3
  55. package/src/ts/astro-docs/generator.js.map +1 -1
  56. package/src/ts/dcr-proxy/generator.js +5 -5
  57. package/src/ts/dcr-proxy/generator.js.map +1 -1
  58. package/src/ts/dynamodb/generator.js +5 -2
  59. package/src/ts/dynamodb/generator.js.map +1 -1
  60. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -2
  61. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  62. package/src/ts/lambda-function/generator.js +3 -2
  63. package/src/ts/lambda-function/generator.js.map +1 -1
  64. package/src/ts/lib/ts-project-utils.js +17 -10
  65. package/src/ts/lib/ts-project-utils.js.map +1 -1
  66. package/src/ts/lib/vitest.js +2 -1
  67. package/src/ts/lib/vitest.js.map +1 -1
  68. package/src/ts/mcp-server/files/Dockerfile.template +7 -3
  69. package/src/ts/mcp-server/generator.js +13 -13
  70. package/src/ts/mcp-server/generator.js.map +1 -1
  71. package/src/ts/nx-generator/generator.js +5 -0
  72. package/src/ts/nx-generator/generator.js.map +1 -1
  73. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +5 -6
  74. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  75. package/src/ts/nx-plugin/utils.js +8 -10
  76. package/src/ts/nx-plugin/utils.js.map +1 -1
  77. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +11 -3
  78. package/src/ts/rdb/agent-connection/generator.js +1 -2
  79. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  80. package/src/ts/rdb/files/Dockerfile.template +5 -1
  81. package/src/ts/rdb/files/src/migration-handler.ts.template +3 -1
  82. package/src/ts/rdb/generator.js +12 -8
  83. package/src/ts/rdb/generator.js.map +1 -1
  84. package/src/ts/rdb/mcp-server-connection/generator.js +1 -2
  85. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  86. package/src/ts/rdb/smithy-connection/generator.js +1 -2
  87. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  88. package/src/ts/rdb/trpc-connection/generator.js +1 -2
  89. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  90. package/src/ts/react-website/agui/generator.js +5 -4
  91. package/src/ts/react-website/agui/generator.js.map +1 -1
  92. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +210 -79
  93. package/src/ts/react-website/app/generator.js +34 -14
  94. package/src/ts/react-website/app/generator.js.map +1 -1
  95. package/src/ts/react-website/cognito-auth/generator.js +3 -2
  96. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  97. package/src/ts/react-website/runtime-config/generator.js +2 -2
  98. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  99. package/src/ts/sync/generator.js +81 -3
  100. package/src/ts/sync/generator.js.map +1 -1
  101. package/src/utils/agent-connection/agent-connection.d.ts +1 -1
  102. package/src/utils/agent-connection/agent-connection.js +50 -1
  103. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  104. package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -1
  105. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  106. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +19 -1
  107. package/src/utils/api-constructs/api-constructs.js +15 -1
  108. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  109. package/src/utils/bundle/bundle.js +2 -1
  110. package/src/utils/bundle/bundle.js.map +1 -1
  111. package/src/utils/commands.d.ts +5 -3
  112. package/src/utils/commands.js +24 -3
  113. package/src/utils/commands.js.map +1 -1
  114. package/src/utils/config/index.d.ts +16 -0
  115. package/src/utils/config/index.js.map +1 -1
  116. package/src/utils/config/utils.d.ts +3 -2
  117. package/src/utils/config/utils.js +4 -3
  118. package/src/utils/config/utils.js.map +1 -1
  119. package/src/utils/connection/open-api/react.js +3 -2
  120. package/src/utils/connection/open-api/react.js.map +1 -1
  121. package/src/utils/containers.js +1 -1
  122. package/src/utils/containers.js.map +1 -1
  123. package/src/utils/dependencies.d.ts +18 -0
  124. package/src/utils/dependencies.js +206 -0
  125. package/src/utils/dependencies.js.map +1 -0
  126. package/src/utils/docker.d.ts +8 -0
  127. package/src/utils/docker.js +8 -1
  128. package/src/utils/docker.js.map +1 -1
  129. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  130. package/src/utils/files/shadcn/components.json.template +1 -1
  131. package/src/utils/format.d.ts +20 -1
  132. package/src/utils/format.js +137 -74
  133. package/src/utils/format.js.map +1 -1
  134. package/src/utils/fs.d.ts +1 -1
  135. package/src/utils/fs.js +1 -1
  136. package/src/utils/fs.js.map +1 -1
  137. package/src/utils/iac.js +1 -1
  138. package/src/utils/iac.js.map +1 -1
  139. package/src/utils/init.d.ts +7 -1
  140. package/src/utils/init.js +45 -19
  141. package/src/utils/init.js.map +1 -1
  142. package/src/utils/install.js +3 -1
  143. package/src/utils/install.js.map +1 -1
  144. package/src/utils/mcp.d.ts +9 -0
  145. package/src/utils/mcp.js +9 -1
  146. package/src/utils/mcp.js.map +1 -1
  147. package/src/utils/module-format.d.ts +5 -8
  148. package/src/utils/module-format.js +29 -12
  149. package/src/utils/module-format.js.map +1 -1
  150. package/src/utils/npm-scope.d.ts +0 -4
  151. package/src/utils/npm-scope.js +0 -5
  152. package/src/utils/npm-scope.js.map +1 -1
  153. package/src/utils/nx.d.ts +13 -0
  154. package/src/utils/nx.js +24 -1
  155. package/src/utils/nx.js.map +1 -1
  156. package/src/utils/pnpm-workspace.d.ts +1 -12
  157. package/src/utils/pnpm-workspace.js +3 -30
  158. package/src/utils/pnpm-workspace.js.map +1 -1
  159. package/src/utils/project-package-json.d.ts +39 -0
  160. package/src/utils/project-package-json.js +119 -0
  161. package/src/utils/project-package-json.js.map +1 -0
  162. package/src/utils/shared-constructs.js +6 -5
  163. package/src/utils/shared-constructs.js.map +1 -1
  164. package/src/utils/shared-dynamodb-scripts.js +4 -2
  165. package/src/utils/shared-dynamodb-scripts.js.map +1 -1
  166. package/src/utils/shared-infra-scripts.js +5 -4
  167. package/src/utils/shared-infra-scripts.js.map +1 -1
  168. package/src/utils/shared-rdb-scripts.js +14 -1
  169. package/src/utils/shared-rdb-scripts.js.map +1 -1
  170. package/src/utils/shared-shadcn.js +11 -8
  171. package/src/utils/shared-shadcn.js.map +1 -1
  172. package/src/utils/test-git.d.ts +39 -0
  173. package/src/utils/test-git.js +117 -0
  174. package/src/utils/test-git.js.map +1 -0
  175. package/src/utils/test.js +8 -3
  176. package/src/utils/test.js.map +1 -1
  177. package/src/utils/versions.d.ts +7 -1
  178. package/src/utils/versions.js +13 -2
  179. package/src/utils/versions.js.map +1 -1
  180. package/src/bin/aws-nx-mcp.d.ts +0 -2
  181. package/src/bin/aws-nx-mcp.js +0 -14
  182. package/src/bin/aws-nx-mcp.js.map +0 -1
@@ -52,7 +52,7 @@ export default defineConfig(() => ({
52
52
  provider: 'v8' as const,
53
53
  },
54
54
  },
55
- resolve: { tsconfigPaths: true },
55
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
56
56
  define: { global: {} },
57
57
  }));
58
58
  "
@@ -108,7 +108,7 @@ export default defineConfig(() => ({
108
108
  provider: 'v8' as const,
109
109
  },
110
110
  },
111
- resolve: { tsconfigPaths: true },
111
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
112
112
  define: { global: {} },
113
113
  }));
114
114
  "
@@ -973,6 +973,9 @@ exports[`react-website generator > Tanstack router integration > should generate
973
973
  "formatter": {
974
974
  "quoteStyle": "single",
975
975
  "trailingCommas": "all"
976
+ },
977
+ "resolver": {
978
+ "experimentalPnpmCatalogs": true
976
979
  }
977
980
  },
978
981
  "css": {
@@ -988,7 +991,7 @@ exports[`react-website generator > Tanstack router integration > should generate
988
991
  "rules": {
989
992
  "preset": "none",
990
993
  "correctness": {
991
- "noUndeclaredDependencies": "warn"
994
+ "noUndeclaredDependencies": "error"
992
995
  }
993
996
  }
994
997
  },
@@ -1007,12 +1010,29 @@ exports[`react-website generator > Tanstack router integration > should generate
1007
1010
  "!**/node_modules",
1008
1011
  "!**/.nx",
1009
1012
  "!**/.venv",
1013
+ "!**/.grit",
1010
1014
  "!**/*.css",
1011
1015
  "!**/*.gen.*",
1012
1016
  "!**/generated/**",
1013
1017
  "!**/tsconfig*.json"
1014
1018
  ]
1015
- }
1019
+ },
1020
+ "overrides": [
1021
+ {
1022
+ "includes": [
1023
+ "**/*.config.{ts,mts,cts,js,mjs,cjs}",
1024
+ "**/*.{spec,test}.{ts,tsx,mts,cts,js,jsx,mjs,cjs}",
1025
+ "**/*.stories.{ts,tsx}"
1026
+ ],
1027
+ "linter": {
1028
+ "rules": {
1029
+ "correctness": {
1030
+ "noUndeclaredDependencies": "off"
1031
+ }
1032
+ }
1033
+ }
1034
+ }
1035
+ ]
1016
1036
  }
1017
1037
  "
1018
1038
  `;
@@ -1118,39 +1138,35 @@ exports[`react-website generator > Tanstack router integration > should generate
1118
1138
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > package.json 1`] = `
1119
1139
  "{
1120
1140
  "name": "@proj/source",
1121
- "dependencies": {
1122
- "@cloudscape-design/board-components": "3.0.205",
1123
- "@cloudscape-design/components": "3.0.1330",
1124
- "@cloudscape-design/global-styles": "1.0.62",
1125
- "aws-cdk-lib": "2.261.0",
1126
- "constructs": "10.7.0",
1127
- "react": "19.2.7",
1128
- "react-dom": "19.2.7",
1129
- "tailwindcss": "4.3.3"
1130
- },
1141
+ "dependencies": {},
1131
1142
  "devDependencies": {
1132
1143
  "@nx/js": "23.1.0",
1133
- "@nx/react": "23.1.0",
1144
+ "@nx/react": "catalog:",
1134
1145
  "@nx/vite": "23.1.0",
1135
1146
  "@nx/vitest": "23.1.0",
1136
1147
  "@nx/web": "23.1.0",
1137
1148
  "@swc/helpers": "~0.5.18",
1138
- "@tailwindcss/vite": "4.3.3",
1149
+ "@tailwindcss/vite": "catalog:",
1139
1150
  "@testing-library/dom": "10.4.0",
1140
1151
  "@testing-library/react": "16.3.0",
1141
- "@types/node": "26.1.1",
1152
+ "@types/node": "catalog:",
1142
1153
  "@types/react": "^19.0.0",
1143
1154
  "@types/react-dom": "^19.0.0",
1144
1155
  "@vitejs/plugin-react": "^6.0.0",
1145
- "@vitest/coverage-v8": "4.1.10",
1146
- "@vitest/ui": "4.1.10",
1156
+ "@vitest/coverage-v8": "catalog:",
1157
+ "@vitest/ui": "catalog:",
1147
1158
  "jiti": "2.4.2",
1148
1159
  "jsdom": "^27.1.0",
1149
1160
  "typescript": "~6.0.3",
1150
- "vite": "8.1.5",
1151
- "vitest": "4.1.10"
1161
+ "vite": "catalog:",
1162
+ "vitest": "catalog:"
1152
1163
  },
1153
- "type": "module"
1164
+ "type": "module",
1165
+ "workspaces": [
1166
+ "packages/*",
1167
+ "test-app",
1168
+ "packages/common/constructs"
1169
+ ]
1154
1170
  }
1155
1171
  "
1156
1172
  `;
@@ -1192,6 +1208,24 @@ You can also automatiaclly fix some lint errors by running the following command
1192
1208
  "
1193
1209
  `;
1194
1210
 
1211
+ exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/package.json 1`] = `
1212
+ "{
1213
+ "name": "@proj/common-constructs",
1214
+ "version": "0.0.1",
1215
+ "private": true,
1216
+ "type": "module",
1217
+ "dependencies": {
1218
+ "aws-cdk-lib": "catalog:",
1219
+ "constructs": "catalog:",
1220
+ "tslib": "^2.3.0"
1221
+ },
1222
+ "devDependencies": {
1223
+ "@types/node": "catalog:"
1224
+ }
1225
+ }
1226
+ "
1227
+ `;
1228
+
1195
1229
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/project.json 1`] = `
1196
1230
  "{
1197
1231
  "name": "@proj/common-constructs",
@@ -2114,9 +2148,25 @@ export default defineConfig(() => ({
2114
2148
 
2115
2149
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > pnpm-workspace.yaml 1`] = `
2116
2150
  "packages:
2117
- - "packages/*"
2118
- - "test-app"
2119
- - "packages/common/*"
2151
+ - packages/*
2152
+ - test-app
2153
+ - packages/common/*
2154
+ catalog:
2155
+ vite: 8.1.5
2156
+ vitest: 4.1.10
2157
+ '@vitest/coverage-v8': 4.1.10
2158
+ constructs: 10.7.0
2159
+ aws-cdk-lib: 2.261.0
2160
+ '@types/node': 26.1.1
2161
+ react: 19.2.7
2162
+ react-dom: 19.2.7
2163
+ '@cloudscape-design/components': 3.0.1330
2164
+ '@cloudscape-design/board-components': 3.0.205
2165
+ '@cloudscape-design/global-styles': 1.0.62
2166
+ tailwindcss: 4.3.3
2167
+ '@nx/react': 23.1.0
2168
+ '@vitest/ui': 4.1.10
2169
+ '@tailwindcss/vite': 4.3.3
2120
2170
  "
2121
2171
  `;
2122
2172
 
@@ -2190,6 +2240,25 @@ exports[`react-website generator > Tanstack router integration > should generate
2190
2240
  "
2191
2241
  `;
2192
2242
 
2243
+ exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > test-app/package.json 1`] = `
2244
+ "{
2245
+ "name": "@proj/test-app",
2246
+ "version": "0.0.1",
2247
+ "private": true,
2248
+ "type": "module",
2249
+ "dependencies": {
2250
+ "@cloudscape-design/board-components": "catalog:",
2251
+ "@cloudscape-design/components": "catalog:",
2252
+ "@cloudscape-design/global-styles": "catalog:",
2253
+ "react": "catalog:",
2254
+ "react-dom": "catalog:",
2255
+ "tailwindcss": "catalog:"
2256
+ },
2257
+ "devDependencies": {}
2258
+ }
2259
+ "
2260
+ `;
2261
+
2193
2262
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > test-app/project.json 1`] = `
2194
2263
  "{
2195
2264
  "name": "@proj/test-app",
@@ -2616,7 +2685,7 @@ export default defineConfig(() => ({
2616
2685
  provider: 'v8' as const,
2617
2686
  },
2618
2687
  },
2619
- resolve: { tsconfigPaths: true },
2688
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
2620
2689
  define: { global: {} },
2621
2690
  }));
2622
2691
  "
@@ -2626,10 +2695,10 @@ exports[`react-website generator > Tanstack router integration > should generate
2626
2695
  "{
2627
2696
  "compilerOptions": {
2628
2697
  "paths": {
2629
- ":proj/test-app": [
2698
+ "@proj/test-app": [
2630
2699
  "./test-app/src/index.ts"
2631
2700
  ],
2632
- ":proj/common-constructs": [
2701
+ "@proj/common-constructs": [
2633
2702
  "./packages/common/constructs/src/index.ts"
2634
2703
  ]
2635
2704
  },
@@ -2689,6 +2758,9 @@ exports[`react-website generator > Tanstack router integration > should generate
2689
2758
  "formatter": {
2690
2759
  "quoteStyle": "single",
2691
2760
  "trailingCommas": "all"
2761
+ },
2762
+ "resolver": {
2763
+ "experimentalPnpmCatalogs": true
2692
2764
  }
2693
2765
  },
2694
2766
  "css": {
@@ -2704,7 +2776,7 @@ exports[`react-website generator > Tanstack router integration > should generate
2704
2776
  "rules": {
2705
2777
  "preset": "none",
2706
2778
  "correctness": {
2707
- "noUndeclaredDependencies": "warn"
2779
+ "noUndeclaredDependencies": "error"
2708
2780
  }
2709
2781
  }
2710
2782
  },
@@ -2723,12 +2795,29 @@ exports[`react-website generator > Tanstack router integration > should generate
2723
2795
  "!**/node_modules",
2724
2796
  "!**/.nx",
2725
2797
  "!**/.venv",
2798
+ "!**/.grit",
2726
2799
  "!**/*.css",
2727
2800
  "!**/*.gen.*",
2728
2801
  "!**/generated/**",
2729
2802
  "!**/tsconfig*.json"
2730
2803
  ]
2731
- }
2804
+ },
2805
+ "overrides": [
2806
+ {
2807
+ "includes": [
2808
+ "**/*.config.{ts,mts,cts,js,mjs,cjs}",
2809
+ "**/*.{spec,test}.{ts,tsx,mts,cts,js,jsx,mjs,cjs}",
2810
+ "**/*.stories.{ts,tsx}"
2811
+ ],
2812
+ "linter": {
2813
+ "rules": {
2814
+ "correctness": {
2815
+ "noUndeclaredDependencies": "off"
2816
+ }
2817
+ }
2818
+ }
2819
+ }
2820
+ ]
2732
2821
  }
2733
2822
  "
2734
2823
  `;
@@ -2834,44 +2923,39 @@ exports[`react-website generator > Tanstack router integration > should generate
2834
2923
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > package.json 1`] = `
2835
2924
  "{
2836
2925
  "name": "@proj/source",
2837
- "dependencies": {
2838
- "@cloudscape-design/board-components": "3.0.205",
2839
- "@cloudscape-design/components": "3.0.1330",
2840
- "@cloudscape-design/global-styles": "1.0.62",
2841
- "@tanstack/react-router": "1.170.18",
2842
- "aws-cdk-lib": "2.261.0",
2843
- "constructs": "10.7.0",
2844
- "react": "19.2.7",
2845
- "react-dom": "19.2.7",
2846
- "tailwindcss": "4.3.3"
2847
- },
2926
+ "dependencies": {},
2848
2927
  "devDependencies": {
2849
2928
  "@nx/js": "23.1.0",
2850
- "@nx/react": "23.1.0",
2929
+ "@nx/react": "catalog:",
2851
2930
  "@nx/vite": "23.1.0",
2852
2931
  "@nx/vitest": "23.1.0",
2853
2932
  "@nx/web": "23.1.0",
2854
2933
  "@swc/helpers": "~0.5.18",
2855
- "@tailwindcss/vite": "4.3.3",
2856
- "@tanstack/router-generator": "1.167.21",
2857
- "@tanstack/router-plugin": "1.168.22",
2858
- "@tanstack/router-utils": "1.162.2",
2859
- "@tanstack/virtual-file-routes": "1.162.0",
2934
+ "@tailwindcss/vite": "catalog:",
2935
+ "@tanstack/router-generator": "catalog:",
2936
+ "@tanstack/router-plugin": "catalog:",
2937
+ "@tanstack/router-utils": "catalog:",
2938
+ "@tanstack/virtual-file-routes": "catalog:",
2860
2939
  "@testing-library/dom": "10.4.0",
2861
2940
  "@testing-library/react": "16.3.0",
2862
- "@types/node": "26.1.1",
2941
+ "@types/node": "catalog:",
2863
2942
  "@types/react": "^19.0.0",
2864
2943
  "@types/react-dom": "^19.0.0",
2865
2944
  "@vitejs/plugin-react": "^6.0.0",
2866
- "@vitest/coverage-v8": "4.1.10",
2867
- "@vitest/ui": "4.1.10",
2945
+ "@vitest/coverage-v8": "catalog:",
2946
+ "@vitest/ui": "catalog:",
2868
2947
  "jiti": "2.4.2",
2869
2948
  "jsdom": "^27.1.0",
2870
2949
  "typescript": "~6.0.3",
2871
- "vite": "8.1.5",
2872
- "vitest": "4.1.10"
2950
+ "vite": "catalog:",
2951
+ "vitest": "catalog:"
2873
2952
  },
2874
- "type": "module"
2953
+ "type": "module",
2954
+ "workspaces": [
2955
+ "packages/*",
2956
+ "test-app",
2957
+ "packages/common/constructs"
2958
+ ]
2875
2959
  }
2876
2960
  "
2877
2961
  `;
@@ -2913,6 +2997,24 @@ You can also automatiaclly fix some lint errors by running the following command
2913
2997
  "
2914
2998
  `;
2915
2999
 
3000
+ exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/package.json 1`] = `
3001
+ "{
3002
+ "name": "@proj/common-constructs",
3003
+ "version": "0.0.1",
3004
+ "private": true,
3005
+ "type": "module",
3006
+ "dependencies": {
3007
+ "aws-cdk-lib": "catalog:",
3008
+ "constructs": "catalog:",
3009
+ "tslib": "^2.3.0"
3010
+ },
3011
+ "devDependencies": {
3012
+ "@types/node": "catalog:"
3013
+ }
3014
+ }
3015
+ "
3016
+ `;
3017
+
2916
3018
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/project.json 1`] = `
2917
3019
  "{
2918
3020
  "name": "@proj/common-constructs",
@@ -3835,9 +3937,30 @@ export default defineConfig(() => ({
3835
3937
 
3836
3938
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > pnpm-workspace.yaml 1`] = `
3837
3939
  "packages:
3838
- - "packages/*"
3839
- - "test-app"
3840
- - "packages/common/*"
3940
+ - packages/*
3941
+ - test-app
3942
+ - packages/common/*
3943
+ catalog:
3944
+ vite: 8.1.5
3945
+ vitest: 4.1.10
3946
+ '@vitest/coverage-v8': 4.1.10
3947
+ constructs: 10.7.0
3948
+ aws-cdk-lib: 2.261.0
3949
+ '@types/node': 26.1.1
3950
+ react: 19.2.7
3951
+ react-dom: 19.2.7
3952
+ '@cloudscape-design/components': 3.0.1330
3953
+ '@cloudscape-design/board-components': 3.0.205
3954
+ '@cloudscape-design/global-styles': 1.0.62
3955
+ tailwindcss: 4.3.3
3956
+ '@tanstack/react-router': 1.170.18
3957
+ '@nx/react': 23.1.0
3958
+ '@vitest/ui': 4.1.10
3959
+ '@tailwindcss/vite': 4.3.3
3960
+ '@tanstack/router-plugin': 1.168.22
3961
+ '@tanstack/router-generator': 1.167.21
3962
+ '@tanstack/virtual-file-routes': 1.162.0
3963
+ '@tanstack/router-utils': 1.162.2
3841
3964
  "
3842
3965
  `;
3843
3966
 
@@ -3911,6 +4034,26 @@ exports[`react-website generator > Tanstack router integration > should generate
3911
4034
  "
3912
4035
  `;
3913
4036
 
4037
+ exports[`react-website generator > Tanstack router integration > should generate website with router correctly > test-app/package.json 1`] = `
4038
+ "{
4039
+ "name": "@proj/test-app",
4040
+ "version": "0.0.1",
4041
+ "private": true,
4042
+ "type": "module",
4043
+ "dependencies": {
4044
+ "@cloudscape-design/board-components": "catalog:",
4045
+ "@cloudscape-design/components": "catalog:",
4046
+ "@cloudscape-design/global-styles": "catalog:",
4047
+ "@tanstack/react-router": "catalog:",
4048
+ "react": "catalog:",
4049
+ "react-dom": "catalog:",
4050
+ "tailwindcss": "catalog:"
4051
+ },
4052
+ "devDependencies": {}
4053
+ }
4054
+ "
4055
+ `;
4056
+
3914
4057
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > test-app/project.json 1`] = `
3915
4058
  "{
3916
4059
  "name": "@proj/test-app",
@@ -4530,7 +4673,7 @@ export default defineConfig(() => ({
4530
4673
  provider: 'v8' as const,
4531
4674
  },
4532
4675
  },
4533
- resolve: { tsconfigPaths: true },
4676
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
4534
4677
  define: { global: {} },
4535
4678
  }));
4536
4679
  "
@@ -4540,10 +4683,10 @@ exports[`react-website generator > Tanstack router integration > should generate
4540
4683
  "{
4541
4684
  "compilerOptions": {
4542
4685
  "paths": {
4543
- ":proj/test-app": [
4686
+ "@proj/test-app": [
4544
4687
  "./test-app/src/index.ts"
4545
4688
  ],
4546
- ":proj/common-constructs": [
4689
+ "@proj/common-constructs": [
4547
4690
  "./packages/common/constructs/src/index.ts"
4548
4691
  ]
4549
4692
  },
@@ -4651,7 +4794,7 @@ export default defineConfig(() => ({
4651
4794
  provider: 'v8' as const,
4652
4795
  },
4653
4796
  },
4654
- resolve: { tsconfigPaths: true },
4797
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
4655
4798
  define: { global: {} },
4656
4799
  }));
4657
4800
  "
@@ -5374,19 +5517,7 @@ root &&
5374
5517
  "
5375
5518
  `;
5376
5519
 
5377
- exports[`react-website generator > should handle npm scope prefix correctly > scoped-dependencies 1`] = `
5378
- {
5379
- "@cloudscape-design/board-components": "3.0.205",
5380
- "@cloudscape-design/components": "3.0.1330",
5381
- "@cloudscape-design/global-styles": "1.0.62",
5382
- "@tanstack/react-router": "1.170.18",
5383
- "aws-cdk-lib": "2.261.0",
5384
- "constructs": "10.7.0",
5385
- "react": "19.2.7",
5386
- "react-dom": "19.2.7",
5387
- "tailwindcss": "4.3.3",
5388
- }
5389
- `;
5520
+ exports[`react-website generator > should handle npm scope prefix correctly > scoped-dependencies 1`] = `{}`;
5390
5521
 
5391
5522
  exports[`react-website generator ux tests > Cloudscape > should update package.json with required dependencies > test-app/src/components/AppLayout/index.tsx 1`] = `
5392
5523
  "import * as React from 'react';
@@ -5732,8 +5863,8 @@ import {
5732
5863
  SidebarInset,
5733
5864
  SidebarProvider,
5734
5865
  SidebarTrigger,
5735
- } from ':proj/common-shadcn/components/ui/sidebar';
5736
- import { Separator } from ':proj/common-shadcn/components/ui/separator';
5866
+ } from '@proj/common-shadcn/components/ui/sidebar';
5867
+ import { Separator } from '@proj/common-shadcn/components/ui/separator';
5737
5868
  import Config from '../../config';
5738
5869
 
5739
5870
  import { Link, useLocation, useMatchRoute } from '@tanstack/react-router';
@@ -5744,7 +5875,7 @@ import {
5744
5875
  BreadcrumbList,
5745
5876
  BreadcrumbPage,
5746
5877
  BreadcrumbSeparator,
5747
- } from ':proj/common-shadcn/components/ui/breadcrumb';
5878
+ } from '@proj/common-shadcn/components/ui/breadcrumb';
5748
5879
  import { AppSidebar } from '../app-sidebar';
5749
5880
 
5750
5881
  const getBreadcrumbs = (
@@ -5855,7 +5986,7 @@ import {
5855
5986
  Alert as ShadcnAlert,
5856
5987
  AlertDescription,
5857
5988
  AlertTitle,
5858
- } from ':proj/common-shadcn/components/ui/alert';
5989
+ } from '@proj/common-shadcn/components/ui/alert';
5859
5990
 
5860
5991
  type AlertType = 'info' | 'error';
5861
5992
 
@@ -5895,7 +6026,7 @@ import {
5895
6026
  SidebarMenu,
5896
6027
  SidebarMenuButton,
5897
6028
  SidebarMenuItem,
5898
- } from ':proj/common-shadcn/components/ui/sidebar';
6029
+ } from '@proj/common-shadcn/components/ui/sidebar';
5899
6030
  import { Link } from '@tanstack/react-router';
5900
6031
 
5901
6032
  import Config from '../config';
@@ -5937,7 +6068,7 @@ export function AppSidebar() {
5937
6068
  `;
5938
6069
 
5939
6070
  exports[`react-website generator ux tests > Shadcn > should update package.json with required dependencies > test-app/src/components/spinner.tsx 1`] = `
5940
- "import { Spinner as ShadcnSpinner } from ':proj/common-shadcn/components/ui/spinner';
6071
+ "import { Spinner as ShadcnSpinner } from '@proj/common-shadcn/components/ui/spinner';
5941
6072
 
5942
6073
  export const Spinner = ShadcnSpinner;
5943
6074
  "
@@ -1,16 +1,17 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { addDependenciesToPackageJson, generateFiles, joinPathFragments, names, OverwriteStrategy, readProjectConfiguration, updateJson, updateProjectConfiguration } from "@nx/devkit";
4
+ */ import { generateFiles, joinPathFragments, names, OverwriteStrategy, readProjectConfiguration, removeDependenciesFromPackageJson, updateJson, updateProjectConfiguration } from "@nx/devkit";
5
5
  import { applicationGenerator } from "@nx/react";
6
6
  import { relative, sep } from "path";
7
7
  import { addDestructuredImport, addSingleImport, applyGritQL } from "../../../utils/ast.js";
8
+ import { addDependenciesToPackageJson } from "../../../utils/dependencies.js";
8
9
  import { formatFilesInSubtree } from "../../../utils/format.js";
9
10
  import { resolveIac } from "../../../utils/iac.js";
10
11
  import { installDependencies } from "../../../utils/install.js";
11
12
  import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
12
13
  import { kebabCase, toClassName, toKebabCase } from "../../../utils/names.js";
13
- import { getNpmScopePrefix, toScopeAlias } from "../../../utils/npm-scope.js";
14
+ import { getNpmScopePrefix } from "../../../utils/npm-scope.js";
14
15
  import { addGeneratorMetadata, getGeneratorInfo } from "../../../utils/nx.js";
15
16
  import { sortObjectKeys } from "../../../utils/object.js";
16
17
  import { getRelativePathToRoot } from "../../../utils/paths.js";
@@ -35,7 +36,7 @@ export async function tsReactWebsiteGenerator(tree, schema) {
35
36
  throw new Error('Shadcn requires TailwindCSS to be enabled.');
36
37
  }
37
38
  const npmScopePrefix = getNpmScopePrefix(tree);
38
- const scopeAlias = toScopeAlias(npmScopePrefix);
39
+ const scopeAlias = npmScopePrefix;
39
40
  const websiteNameClassName = toClassName(schema.name);
40
41
  const websiteNameKebabCase = toKebabCase(schema.name);
41
42
  const fullyQualifiedName = `${npmScopePrefix}${websiteNameKebabCase}`;
@@ -264,8 +265,12 @@ export async function tsReactWebsiteGenerator(tree, schema) {
264
265
  if (tailwind) {
265
266
  await applyGritQL(tree, viteConfigPath, '`plugins: [$items]` => `plugins: [$items, tailwindcss()]` where { $items <: within `defineConfig($_)`, $items <: not some `tailwindcss()` }');
266
267
  }
267
- // Use Vite's native tsconfig paths resolution (replaces vite-tsconfig-paths)
268
- await applyGritQL(tree, viteConfigPath, 'or { `defineConfig(() => ({ $props }))` where { $props <: not some `resolve: $_`, $props += `resolve: { tsconfigPaths: true }` }, `defineConfig({ $props })` where { $props <: not some `resolve: $_`, $props += `resolve: { tsconfigPaths: true }` } }');
268
+ // Use Vite's native tsconfig paths resolution (replaces vite-tsconfig-paths).
269
+ // `dedupe` forces a single copy of react/react-dom into the bundle: each
270
+ // project declares its own react dependency, so without this a workspace
271
+ // library's hoisted copy can produce a second React instance and the
272
+ // "Invalid hook call" runtime crash.
273
+ await applyGritQL(tree, viteConfigPath, "or { `defineConfig(() => ({ $props }))` where { $props <: not some `resolve: $_`, $props += `resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] }` }, `defineConfig({ $props })` where { $props <: not some `resolve: $_`, $props += `resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] }` } }");
269
274
  // Add define: { global: {} } to the config (handles both callback and direct forms)
270
275
  await applyGritQL(tree, viteConfigPath, 'or { `defineConfig(() => ({ $props }))` where { $props <: not contains `define`, $props += `define: { global: {} }` }, `defineConfig({ $props })` where { $props <: not contains `define`, $props += `define: { global: {} }` } }');
271
276
  }
@@ -296,29 +301,44 @@ export async function tsReactWebsiteGenerator(tree, schema) {
296
301
  }
297
302
  ] : tsconfig.references
298
303
  }));
299
- const devDependencies = [
300
- '@nx/react',
301
- '@vitest/ui'
302
- ];
303
304
  const dependencies = [
304
305
  'react',
305
306
  'react-dom'
306
307
  ];
308
+ // Build/test tooling imported only from vite.config.mts stays at the root.
309
+ const rootDevDependencies = [
310
+ '@nx/react',
311
+ '@vitest/ui'
312
+ ];
307
313
  if (ux === 'cloudscape') {
308
314
  dependencies.push('@cloudscape-design/components', '@cloudscape-design/board-components', '@cloudscape-design/global-styles');
309
315
  } else if (ux === 'shadcn') {
310
- // not required to add any dependencies because dependencies are added by the common/shadcn package.
316
+ // Shared shadcn components live in the common/shadcn package, but the
317
+ // website's own generated components (e.g. the tanstack-router sidebar)
318
+ // import lucide-react directly, so the website must declare it.
319
+ if (tanstackRouter) {
320
+ dependencies.push('lucide-react');
321
+ }
311
322
  }
312
- // Add TailwindCSS dependencies if enabled
313
323
  if (tailwind) {
314
324
  dependencies.push('tailwindcss');
315
- devDependencies.push('@tailwindcss/vite');
325
+ rootDevDependencies.push('@tailwindcss/vite');
316
326
  }
317
327
  if (tanstackRouter) {
318
328
  dependencies.push('@tanstack/react-router');
319
- devDependencies.push('@tanstack/router-plugin', '@tanstack/router-generator', '@tanstack/virtual-file-routes', '@tanstack/router-utils');
329
+ rootDevDependencies.push('@tanstack/router-plugin', '@tanstack/router-generator', '@tanstack/virtual-file-routes', '@tanstack/router-utils');
320
330
  }
321
- addDependenciesToPackageJson(tree, withVersions(dependencies), withVersions(devDependencies));
331
+ addDependenciesToPackageJson(tree, withVersions(dependencies), {}, joinPathFragments(libraryRoot, 'package.json'));
332
+ addDependenciesToPackageJson(tree, {}, withVersions(rootDevDependencies));
333
+ // @nx/react's applicationGenerator seeds react/react-dom into the root
334
+ // manifest. The website now declares its own pinned versions, so drop the
335
+ // root copies: without catalogs (npm) the root's floating range resolves to
336
+ // a different version than the website's pin, installing a second React and
337
+ // producing the "Invalid hook call" runtime crash.
338
+ removeDependenciesFromPackageJson(tree, [
339
+ 'react',
340
+ 'react-dom'
341
+ ], []);
322
342
  await addGeneratorMetricsIfApplicable(tree, [
323
343
  REACT_WEBSITE_APP_GENERATOR_INFO
324
344
  ]);