@aws/nx-plugin 1.0.0-rc.45 → 1.0.0-rc.47

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 (165) hide show
  1. package/LICENSE-THIRD-PARTY +3 -60
  2. package/generators.json +9 -9
  3. package/package.json +7 -3
  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/schema.d.ts +1 -1
  12. package/src/mcp-server/tools/general-guidance.js +5 -6
  13. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  14. package/src/preset/__snapshots__/generator.spec.ts.snap +38 -7
  15. package/src/preset/generator.d.ts +1 -1
  16. package/src/preset/generator.js +4 -2
  17. package/src/preset/generator.js.map +1 -1
  18. package/src/preset/schema.d.js.map +1 -1
  19. package/src/preset/schema.d.ts +1 -0
  20. package/src/preset/schema.json +5 -0
  21. package/src/py/agent/generator.js +2 -1
  22. package/src/py/agent/generator.js.map +1 -1
  23. package/src/py/mcp-server/generator.js +2 -1
  24. package/src/py/mcp-server/generator.js.map +1 -1
  25. package/src/py/project/generator.js +2 -1
  26. package/src/py/project/generator.js.map +1 -1
  27. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +1 -0
  28. package/src/py/rdb/generator.js +7 -1
  29. package/src/py/rdb/generator.js.map +1 -1
  30. package/src/smithy/ts/api/generator.js +5 -2
  31. package/src/smithy/ts/api/generator.js.map +1 -1
  32. package/src/terraform/project/generator.js +4 -1
  33. package/src/terraform/project/generator.js.map +1 -1
  34. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +6 -6
  35. package/src/trpc/backend/generator.js +7 -5
  36. package/src/trpc/backend/generator.js.map +1 -1
  37. package/src/trpc/react/generator.js +4 -4
  38. package/src/trpc/react/generator.js.map +1 -1
  39. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +2 -2
  40. package/src/ts/agent/a2a-connection/generator.js +3 -2
  41. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  42. package/src/ts/agent/gateway-connection/generator.js +4 -3
  43. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  44. package/src/ts/agent/generator.js +8 -5
  45. package/src/ts/agent/generator.js.map +1 -1
  46. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +1 -1
  47. package/src/ts/agent/mcp-connection/generator.js +4 -3
  48. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  49. package/src/ts/agent/react-connection/generator.js +10 -19
  50. package/src/ts/agent/react-connection/generator.js.map +1 -1
  51. package/src/ts/astro-docs/generator.js +12 -3
  52. package/src/ts/astro-docs/generator.js.map +1 -1
  53. package/src/ts/dcr-proxy/generator.js +5 -5
  54. package/src/ts/dcr-proxy/generator.js.map +1 -1
  55. package/src/ts/dynamodb/generator.js +5 -2
  56. package/src/ts/dynamodb/generator.js.map +1 -1
  57. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -2
  58. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  59. package/src/ts/lambda-function/generator.js +3 -2
  60. package/src/ts/lambda-function/generator.js.map +1 -1
  61. package/src/ts/lib/ts-project-utils.js +17 -10
  62. package/src/ts/lib/ts-project-utils.js.map +1 -1
  63. package/src/ts/lib/vitest.js +2 -1
  64. package/src/ts/lib/vitest.js.map +1 -1
  65. package/src/ts/mcp-server/generator.js +11 -11
  66. package/src/ts/mcp-server/generator.js.map +1 -1
  67. package/src/ts/nx-generator/generator.js +5 -0
  68. package/src/ts/nx-generator/generator.js.map +1 -1
  69. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +5 -6
  70. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  71. package/src/ts/nx-plugin/utils.js +2 -1
  72. package/src/ts/nx-plugin/utils.js.map +1 -1
  73. package/src/ts/rdb/agent-connection/generator.js +1 -2
  74. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  75. package/src/ts/rdb/generator.js +10 -6
  76. package/src/ts/rdb/generator.js.map +1 -1
  77. package/src/ts/rdb/mcp-server-connection/generator.js +1 -2
  78. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  79. package/src/ts/rdb/smithy-connection/generator.js +1 -2
  80. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  81. package/src/ts/rdb/trpc-connection/generator.js +1 -2
  82. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  83. package/src/ts/react-website/agui/generator.js +5 -4
  84. package/src/ts/react-website/agui/generator.js.map +1 -1
  85. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +219 -79
  86. package/src/ts/react-website/app/generator.js +34 -14
  87. package/src/ts/react-website/app/generator.js.map +1 -1
  88. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +11 -6
  89. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +12 -2
  90. package/src/ts/react-website/cognito-auth/generator.js +3 -2
  91. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  92. package/src/ts/react-website/runtime-config/generator.js +2 -2
  93. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  94. package/src/ts/sync/generator.js +81 -3
  95. package/src/ts/sync/generator.js.map +1 -1
  96. package/src/utils/agent-connection/agent-connection.d.ts +1 -1
  97. package/src/utils/agent-connection/agent-connection.js +50 -1
  98. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  99. package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -1
  100. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  101. package/src/utils/api-constructs/api-constructs.js +15 -1
  102. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  103. package/src/utils/bundle/bundle.js +2 -1
  104. package/src/utils/bundle/bundle.js.map +1 -1
  105. package/src/utils/commands.d.ts +5 -3
  106. package/src/utils/commands.js +24 -3
  107. package/src/utils/commands.js.map +1 -1
  108. package/src/utils/config/index.d.ts +16 -0
  109. package/src/utils/config/index.js.map +1 -1
  110. package/src/utils/config/utils.d.ts +3 -2
  111. package/src/utils/config/utils.js +4 -3
  112. package/src/utils/config/utils.js.map +1 -1
  113. package/src/utils/connection/open-api/react.js +3 -2
  114. package/src/utils/connection/open-api/react.js.map +1 -1
  115. package/src/utils/containers.js +1 -1
  116. package/src/utils/containers.js.map +1 -1
  117. package/src/utils/dependencies.d.ts +18 -0
  118. package/src/utils/dependencies.js +206 -0
  119. package/src/utils/dependencies.js.map +1 -0
  120. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  121. package/src/utils/files/shadcn/components.json.template +1 -1
  122. package/src/utils/format.d.ts +20 -1
  123. package/src/utils/format.js +83 -49
  124. package/src/utils/format.js.map +1 -1
  125. package/src/utils/fs.d.ts +1 -1
  126. package/src/utils/fs.js +1 -1
  127. package/src/utils/fs.js.map +1 -1
  128. package/src/utils/iac.js +1 -1
  129. package/src/utils/iac.js.map +1 -1
  130. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +11 -6
  131. package/src/utils/identity-constructs/identity-constructs.js +14 -3
  132. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  133. package/src/utils/init.d.ts +7 -1
  134. package/src/utils/init.js +38 -17
  135. package/src/utils/init.js.map +1 -1
  136. package/src/utils/install.js +3 -1
  137. package/src/utils/install.js.map +1 -1
  138. package/src/utils/module-format.d.ts +5 -8
  139. package/src/utils/module-format.js +29 -12
  140. package/src/utils/module-format.js.map +1 -1
  141. package/src/utils/npm-scope.d.ts +0 -4
  142. package/src/utils/npm-scope.js +0 -5
  143. package/src/utils/npm-scope.js.map +1 -1
  144. package/src/utils/pnpm-workspace.d.ts +1 -12
  145. package/src/utils/pnpm-workspace.js +3 -30
  146. package/src/utils/pnpm-workspace.js.map +1 -1
  147. package/src/utils/project-package-json.d.ts +39 -0
  148. package/src/utils/project-package-json.js +119 -0
  149. package/src/utils/project-package-json.js.map +1 -0
  150. package/src/utils/shared-constructs.js +6 -5
  151. package/src/utils/shared-constructs.js.map +1 -1
  152. package/src/utils/shared-dynamodb-scripts.js +4 -2
  153. package/src/utils/shared-dynamodb-scripts.js.map +1 -1
  154. package/src/utils/shared-infra-scripts.js +5 -4
  155. package/src/utils/shared-infra-scripts.js.map +1 -1
  156. package/src/utils/shared-rdb-scripts.js +14 -1
  157. package/src/utils/shared-rdb-scripts.js.map +1 -1
  158. package/src/utils/shared-shadcn.js +11 -8
  159. package/src/utils/shared-shadcn.js.map +1 -1
  160. package/src/utils/test.js +8 -3
  161. package/src/utils/test.js.map +1 -1
  162. package/src/utils/versions.d.ts +4 -0
  163. package/src/utils/versions.js +8 -1
  164. package/src/utils/versions.js.map +1 -1
  165. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +3 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/agui/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n addDependenciesToPackageJson,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config';\nimport {\n addDestructuredImport,\n addSingleImport,\n applyGritQL,\n} from '../../../utils/ast';\nimport { kebabCase } from '../../../utils/names';\nimport { getNpmScopePrefix, toScopeAlias } from '../../../utils/npm-scope';\nimport { registerPnpmBuiltDependencies } from '../../../utils/pnpm-workspace';\nimport { sharedShadcnGenerator } from '../../../utils/shared-shadcn';\nimport { withVersions } from '../../../utils/versions';\nimport { runtimeConfigGenerator } from '../runtime-config/generator';\n\nexport type AgUiAuth = 'iam' | 'cognito' | 'none';\n\ntype AgUiTheme = 'cloudscape' | 'shadcn' | 'default';\n\nexport interface AgUiReactConnectionOptions {\n /** The React website project to connect FROM */\n frontendProjectConfig: ProjectConfiguration;\n /** The AG-UI agent's exposed name (used as CopilotKit's agent key) */\n agentName: string;\n /** PascalCase class name used for component names and runtime config keys */\n agentNameClassName: string;\n /** Auth scheme used by the agent */\n auth: AgUiAuth;\n}\n\n/**\n * Wires a React website up to an AG-UI agent using CopilotKit and\n * @ag-ui/client's HttpAgent. Agent-server-language agnostic.\n *\n * On first invocation creates a shared `AguiProvider` component (with an empty\n * `selfManagedAgents` registry) and wraps `<App />` in it. Each invocation\n * AST-patches `AguiProvider` to register one more agent hook — running the\n * generator multiple times is idempotent and additive.\n *\n * Also vends a `src/components/copilot` theme module picked from the\n * website's `metadata.ux` (cloudscape / shadcn / default).\n */\nexport const addAgUiReactConnection = async (\n tree: Tree,\n options: AgUiReactConnectionOptions,\n) => {\n const { frontendProjectConfig, agentName, agentNameClassName, auth } =\n options;\n\n const theme = resolveAgUiTheme(frontendProjectConfig);\n const scopeAlias = toScopeAlias(getNpmScopePrefix(tree));\n\n // Generates `src/components/AguiProvider.tsx` (if absent) and\n // `src/hooks/useAgui<AgentName>.tsx`. Existing files are kept so re-running\n // the generator is idempotent.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n frontendProjectConfig.root,\n { agentName, agentNameClassName, auth },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Shadcn theme imports from the shared shadcn library, so it must exist.\n if (theme === 'shadcn') {\n await sharedShadcnGenerator(tree);\n }\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', theme),\n frontendProjectConfig.root,\n { scopeAlias },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n });\n\n // AST-patch AguiProvider to register this agent's hook\n await registerAgentHookInProvider(\n tree,\n frontendProjectConfig,\n agentNameClassName,\n );\n\n // Wrap <App /> in <AguiProvider> in main.tsx (idempotent)\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'AguiProvider',\n './components/AguiProvider',\n );\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<AguiProvider><App /></AguiProvider>\\` where { $program <: not contains \\`<AguiProvider>$_</AguiProvider>\\` }`,\n );\n\n // @copilotkit/react-core transitively pulls in @scarf/scarf (telemetry),\n // which has a postinstall script. Under pnpm 11's default\n // `strictDepBuilds=true` that script is treated as an unreviewed build and\n // fails the install. Register it as an explicitly-rejected build so pnpm\n // knows we've seen it and will skip it instead of erroring.\n registerPnpmBuiltDependencies(tree, { '@scarf/scarf': false });\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@copilotkit/react-core',\n '@ag-ui/client',\n ...((theme === 'cloudscape'\n ? ['@cloudscape-design/chat-components']\n : []) as any),\n ...((theme === 'shadcn' ? ['lucide-react'] : []) as any),\n ...((auth === 'iam'\n ? [\n 'oidc-client-ts',\n 'aws4fetch',\n '@aws-sdk/credential-provider-cognito-identity',\n 'react-oidc-context',\n ]\n : []) as any),\n ...((auth === 'cognito' ? ['react-oidc-context'] : []) as any),\n ]),\n withVersions([...((auth === 'iam' ? ['@smithy/types'] : []) as any)]),\n );\n\n // Agents only publish their runtime ARN to the 'agentcore' namespace by\n // default, which isn't exposed to the website. Patch the agent's CDK/TF\n // construct to also publish under 'connection' so the browser can read it\n // from runtime-config.json.\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n};\n\nconst resolveAgUiTheme = (\n frontendProjectConfig: ProjectConfiguration,\n): AgUiTheme => {\n const ux = (\n (frontendProjectConfig.metadata as any)?.ux as string | undefined\n )?.toLowerCase();\n switch (ux) {\n case 'cloudscape':\n return 'cloudscape';\n case 'shadcn':\n return 'shadcn';\n default:\n return 'default';\n }\n};\n\n/**\n * Register this agent's hook in the shared `AguiProvider` using GritQL AST\n * patches. The provider starts out with an empty `selfManagedAgents` registry\n * (from the template); each call appends:\n * - `import { useAgui<Name> } from '../hooks/useAgui<Name>';`\n * - `const <varName> = useAgui<Name>();` before the `useMemo` call\n * - `...<varName>` into the memoised object literal\n * - `<varName>` into the `useMemo` deps array\n *\n * All steps are guarded so re-running produces byte-identical output.\n */\nconst registerAgentHookInProvider = async (\n tree: Tree,\n frontendProjectConfig: ProjectConfiguration,\n agentNameClassName: string,\n) => {\n const providerPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'components',\n 'AguiProvider.tsx',\n );\n const hookName = `useAgui${agentNameClassName}`;\n // useAguiStoryAgent -> storyAgentAgents\n const varName = `${agentNameClassName.charAt(0).toLowerCase()}${agentNameClassName.slice(1)}Agents`;\n\n // 1. Add the hook import\n await addDestructuredImport(\n tree,\n providerPath,\n [hookName],\n `../hooks/${hookName}`,\n );\n\n // 2. Insert `const <varName> = <hookName>();` before the useMemo declaration\n await applyGritQL(\n tree,\n providerPath,\n `\\`const selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` => ` +\n `\\`const ${varName} = ${hookName}();\\nconst selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` ` +\n `where { $program <: not contains \\`const ${varName} = ${hookName}()\\` }`,\n );\n\n // 3. Spread `...<varName>` into the memoised object and add `<varName>` to\n // the deps array. Branches on `{}`/`[]` vs populated so both the\n // first-agent and nth-agent cases produce clean output.\n await applyGritQL(\n tree,\n providerPath,\n `\\`useMemo<Record<string, AbstractAgent>>(() => ($obj), $deps)\\` where {` +\n ` $obj <: not contains \\`...${varName}\\`,` +\n ` if ($obj <: \\`{}\\`) { $obj => \\`{ ...${varName} }\\` }` +\n ` else { $obj <: \\`{$items}\\` where { $items += \\`, ...${varName}\\` } },` +\n ` if ($deps <: \\`[]\\`) { $deps => \\`[${varName}]\\` }` +\n ` else { $deps <: \\`[$dd]\\` where { $dd += \\`, ${varName}\\` } }` +\n ` }`,\n );\n};\n"],"names":["addDependenciesToPackageJson","generateFiles","joinPathFragments","OverwriteStrategy","addAgentRuntimeToConnectionNamespace","addDestructuredImport","addSingleImport","applyGritQL","kebabCase","getNpmScopePrefix","toScopeAlias","registerPnpmBuiltDependencies","sharedShadcnGenerator","withVersions","runtimeConfigGenerator","addAgUiReactConnection","tree","options","frontendProjectConfig","agentName","agentNameClassName","auth","theme","resolveAgUiTheme","scopeAlias","dirname","root","overwriteStrategy","KeepExisting","sourceRoot","project","name","registerAgentHookInProvider","mainTsxPath","agentNameKebabCase","ux","metadata","toLowerCase","providerPath","hookName","varName","charAt","slice"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/agui/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config';\nimport {\n addDestructuredImport,\n addSingleImport,\n applyGritQL,\n} from '../../../utils/ast';\nimport { addDependenciesToPackageJson } from '../../../utils/dependencies';\nimport { kebabCase } from '../../../utils/names';\nimport { getNpmScopePrefix } from '../../../utils/npm-scope';\nimport { registerPnpmBuiltDependencies } from '../../../utils/pnpm-workspace';\nimport { sharedShadcnGenerator } from '../../../utils/shared-shadcn';\nimport { withVersions } from '../../../utils/versions';\nimport { runtimeConfigGenerator } from '../runtime-config/generator';\n\nexport type AgUiAuth = 'iam' | 'cognito' | 'none';\n\ntype AgUiTheme = 'cloudscape' | 'shadcn' | 'default';\n\nexport interface AgUiReactConnectionOptions {\n /** The React website project to connect FROM */\n frontendProjectConfig: ProjectConfiguration;\n /** The AG-UI agent's exposed name (used as CopilotKit's agent key) */\n agentName: string;\n /** PascalCase class name used for component names and runtime config keys */\n agentNameClassName: string;\n /** Auth scheme used by the agent */\n auth: AgUiAuth;\n}\n\n/**\n * Wires a React website up to an AG-UI agent using CopilotKit and\n * @ag-ui/client's HttpAgent. Agent-server-language agnostic.\n *\n * On first invocation creates a shared `AguiProvider` component (with an empty\n * `selfManagedAgents` registry) and wraps `<App />` in it. Each invocation\n * AST-patches `AguiProvider` to register one more agent hook — running the\n * generator multiple times is idempotent and additive.\n *\n * Also vends a `src/components/copilot` theme module picked from the\n * website's `metadata.ux` (cloudscape / shadcn / default).\n */\nexport const addAgUiReactConnection = async (\n tree: Tree,\n options: AgUiReactConnectionOptions,\n) => {\n const { frontendProjectConfig, agentName, agentNameClassName, auth } =\n options;\n\n const theme = resolveAgUiTheme(frontendProjectConfig);\n const scopeAlias = getNpmScopePrefix(tree);\n\n // Generates `src/components/AguiProvider.tsx` (if absent) and\n // `src/hooks/useAgui<AgentName>.tsx`. Existing files are kept so re-running\n // the generator is idempotent.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n frontendProjectConfig.root,\n { agentName, agentNameClassName, auth },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Shadcn theme imports from the shared shadcn library, so it must exist.\n if (theme === 'shadcn') {\n await sharedShadcnGenerator(tree);\n }\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', theme),\n frontendProjectConfig.root,\n { scopeAlias },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n });\n\n // AST-patch AguiProvider to register this agent's hook\n await registerAgentHookInProvider(\n tree,\n frontendProjectConfig,\n agentNameClassName,\n );\n\n // Wrap <App /> in <AguiProvider> in main.tsx (idempotent)\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'AguiProvider',\n './components/AguiProvider',\n );\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<AguiProvider><App /></AguiProvider>\\` where { $program <: not contains \\`<AguiProvider>$_</AguiProvider>\\` }`,\n );\n\n // @copilotkit/react-core transitively pulls in @scarf/scarf (telemetry),\n // which has a postinstall script. Under pnpm 11's default\n // `strictDepBuilds=true` that script is treated as an unreviewed build and\n // fails the install. Register it as an explicitly-rejected build so pnpm\n // knows we've seen it and will skip it instead of erroring.\n registerPnpmBuiltDependencies(tree, { '@scarf/scarf': false });\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@copilotkit/react-core',\n '@ag-ui/client',\n ...((theme === 'cloudscape'\n ? ['@cloudscape-design/chat-components']\n : []) as any),\n ...((theme === 'shadcn' ? ['lucide-react'] : []) as any),\n ...((auth === 'iam'\n ? [\n 'oidc-client-ts',\n 'aws4fetch',\n '@aws-sdk/credential-provider-cognito-identity',\n 'react-oidc-context',\n ]\n : []) as any),\n ...((auth === 'cognito' ? ['react-oidc-context'] : []) as any),\n ]),\n withVersions([...((auth === 'iam' ? ['@smithy/types'] : []) as any)]),\n joinPathFragments(frontendProjectConfig.root, 'package.json'),\n );\n\n // Agents only publish their runtime ARN to the 'agentcore' namespace by\n // default, which isn't exposed to the website. Patch the agent's CDK/TF\n // construct to also publish under 'connection' so the browser can read it\n // from runtime-config.json.\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n};\n\nconst resolveAgUiTheme = (\n frontendProjectConfig: ProjectConfiguration,\n): AgUiTheme => {\n const ux = (\n (frontendProjectConfig.metadata as any)?.ux as string | undefined\n )?.toLowerCase();\n switch (ux) {\n case 'cloudscape':\n return 'cloudscape';\n case 'shadcn':\n return 'shadcn';\n default:\n return 'default';\n }\n};\n\n/**\n * Register this agent's hook in the shared `AguiProvider` using GritQL AST\n * patches. The provider starts out with an empty `selfManagedAgents` registry\n * (from the template); each call appends:\n * - `import { useAgui<Name> } from '../hooks/useAgui<Name>';`\n * - `const <varName> = useAgui<Name>();` before the `useMemo` call\n * - `...<varName>` into the memoised object literal\n * - `<varName>` into the `useMemo` deps array\n *\n * All steps are guarded so re-running produces byte-identical output.\n */\nconst registerAgentHookInProvider = async (\n tree: Tree,\n frontendProjectConfig: ProjectConfiguration,\n agentNameClassName: string,\n) => {\n const providerPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'components',\n 'AguiProvider.tsx',\n );\n const hookName = `useAgui${agentNameClassName}`;\n // useAguiStoryAgent -> storyAgentAgents\n const varName = `${agentNameClassName.charAt(0).toLowerCase()}${agentNameClassName.slice(1)}Agents`;\n\n // 1. Add the hook import\n await addDestructuredImport(\n tree,\n providerPath,\n [hookName],\n `../hooks/${hookName}`,\n );\n\n // 2. Insert `const <varName> = <hookName>();` before the useMemo declaration\n await applyGritQL(\n tree,\n providerPath,\n `\\`const selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` => ` +\n `\\`const ${varName} = ${hookName}();\\nconst selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` ` +\n `where { $program <: not contains \\`const ${varName} = ${hookName}()\\` }`,\n );\n\n // 3. Spread `...<varName>` into the memoised object and add `<varName>` to\n // the deps array. Branches on `{}`/`[]` vs populated so both the\n // first-agent and nth-agent cases produce clean output.\n await applyGritQL(\n tree,\n providerPath,\n `\\`useMemo<Record<string, AbstractAgent>>(() => ($obj), $deps)\\` where {` +\n ` $obj <: not contains \\`...${varName}\\`,` +\n ` if ($obj <: \\`{}\\`) { $obj => \\`{ ...${varName} }\\` }` +\n ` else { $obj <: \\`{$items}\\` where { $items += \\`, ...${varName}\\` } },` +\n ` if ($deps <: \\`[]\\`) { $deps => \\`[${varName}]\\` }` +\n ` else { $deps <: \\`[$dd]\\` where { $dd += \\`, ${varName}\\` } }` +\n ` }`,\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","addAgentRuntimeToConnectionNamespace","addDestructuredImport","addSingleImport","applyGritQL","addDependenciesToPackageJson","kebabCase","getNpmScopePrefix","registerPnpmBuiltDependencies","sharedShadcnGenerator","withVersions","runtimeConfigGenerator","addAgUiReactConnection","tree","options","frontendProjectConfig","agentName","agentNameClassName","auth","theme","resolveAgUiTheme","scopeAlias","dirname","root","overwriteStrategy","KeepExisting","sourceRoot","project","name","registerAgentHookInProvider","mainTsxPath","agentNameKebabCase","ux","metadata","toLowerCase","providerPath","hookName","varName","charAt","slice"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,QAGZ,aAAa;AACpB,SAASC,oCAAoC,QAAQ,8CAA2C;AAChG,SACEC,qBAAqB,EACrBC,eAAe,EACfC,WAAW,QACN,wBAAqB;AAC5B,SAASC,4BAA4B,QAAQ,iCAA8B;AAC3E,SAASC,SAAS,QAAQ,0BAAuB;AACjD,SAASC,iBAAiB,QAAQ,8BAA2B;AAC7D,SAASC,6BAA6B,QAAQ,mCAAgC;AAC9E,SAASC,qBAAqB,QAAQ,kCAA+B;AACrE,SAASC,YAAY,QAAQ,6BAA0B;AACvD,SAASC,sBAAsB,QAAQ,iCAA8B;AAiBrE;;;;;;;;;;;CAWC,GACD,OAAO,MAAMC,yBAAyB,OACpCC,MACAC;IAEA,MAAM,EAAEC,qBAAqB,EAAEC,SAAS,EAAEC,kBAAkB,EAAEC,IAAI,EAAE,GAClEJ;IAEF,MAAMK,QAAQC,iBAAiBL;IAC/B,MAAMM,aAAad,kBAAkBM;IAErC,8DAA8D;IAC9D,4EAA4E;IAC5E,+BAA+B;IAC/Bf,cACEe,MACAd,kBAAkB,YAAYuB,OAAO,EAAE,SAAS,WAChDP,sBAAsBQ,IAAI,EAC1B;QAAEP;QAAWC;QAAoBC;IAAK,GACtC;QAAEM,mBAAmBxB,kBAAkByB,YAAY;IAAC;IAGtD,yEAAyE;IACzE,IAAIN,UAAU,UAAU;QACtB,MAAMV,sBAAsBI;IAC9B;IACAf,cACEe,MACAd,kBAAkB,YAAYuB,OAAO,EAAE,SAASH,QAChDJ,sBAAsBQ,IAAI,EAC1B;QAAEF;IAAW,GACb;QAAEG,mBAAmBxB,kBAAkByB,YAAY;IAAC;IAGtD,IAAIP,SAAS,OAAO;QAClBpB,cACEe,MACAd,kBACE,YAAYuB,OAAO,EACnB,6CAEFvB,kBAAkBgB,sBAAsBW,UAAU,EAAE,UACpD,CAAC,GACD;YAAEF,mBAAmBxB,kBAAkByB,YAAY;QAAC;IAExD;IAEA,MAAMd,uBAAuBE,MAAM;QACjCc,SAASZ,sBAAsBa,IAAI;IACrC;IAEA,uDAAuD;IACvD,MAAMC,4BACJhB,MACAE,uBACAE;IAGF,0DAA0D;IAC1D,MAAMa,cAAc/B,kBAClBgB,sBAAsBW,UAAU,EAChC;IAEF,MAAMvB,gBACJU,MACAiB,aACA,gBACA;IAEF,MAAM1B,YACJS,MACAiB,aACA,CAAC,8HAA8H,CAAC;IAGlI,yEAAyE;IACzE,0DAA0D;IAC1D,2EAA2E;IAC3E,yEAAyE;IACzE,4DAA4D;IAC5DtB,8BAA8BK,MAAM;QAAE,gBAAgB;IAAM;IAE5DR,6BACEQ,MACAH,aAAa;QACX;QACA;WACKS,UAAU,eACX;YAAC;SAAqC,GACtC,EAAE;WACDA,UAAU,WAAW;YAAC;SAAe,GAAG,EAAE;WAC1CD,SAAS,QACV;YACE;YACA;YACA;YACA;SACD,GACD,EAAE;WACDA,SAAS,YAAY;YAAC;SAAqB,GAAG,EAAE;KACtD,GACDR,aAAa;WAAMQ,SAAS,QAAQ;YAAC;SAAgB,GAAG,EAAE;KAAU,GACpEnB,kBAAkBgB,sBAAsBQ,IAAI,EAAE;IAGhD,wEAAwE;IACxE,wEAAwE;IACxE,0EAA0E;IAC1E,4BAA4B;IAC5B,MAAMtB,qCAAqCY,MAAM;QAC/CkB,oBAAoBzB,UAAUW;QAC9BA;IACF;AACF,EAAE;AAEF,MAAMG,mBAAmB,CACvBL;IAEA,MAAMiB,KACHjB,sBAAsBkB,QAAQ,EAAUD,IACxCE;IACH,OAAQF;QACN,KAAK;YACH,OAAO;QACT,KAAK;YACH,OAAO;QACT;YACE,OAAO;IACX;AACF;AAEA;;;;;;;;;;CAUC,GACD,MAAMH,8BAA8B,OAClChB,MACAE,uBACAE;IAEA,MAAMkB,eAAepC,kBACnBgB,sBAAsBW,UAAU,EAChC,cACA;IAEF,MAAMU,WAAW,CAAC,OAAO,EAAEnB,oBAAoB;IAC/C,wCAAwC;IACxC,MAAMoB,UAAU,GAAGpB,mBAAmBqB,MAAM,CAAC,GAAGJ,WAAW,KAAKjB,mBAAmBsB,KAAK,CAAC,GAAG,MAAM,CAAC;IAEnG,yBAAyB;IACzB,MAAMrC,sBACJW,MACAsB,cACA;QAACC;KAAS,EACV,CAAC,SAAS,EAAEA,UAAU;IAGxB,6EAA6E;IAC7E,MAAMhC,YACJS,MACAsB,cACA,CAAC,uFAAuF,CAAC,GACvF,CAAC,QAAQ,EAAEE,QAAQ,GAAG,EAAED,SAAS,uFAAuF,CAAC,GACzH,CAAC,yCAAyC,EAAEC,QAAQ,GAAG,EAAED,SAAS,MAAM,CAAC;IAG7E,2EAA2E;IAC3E,oEAAoE;IACpE,2DAA2D;IAC3D,MAAMhC,YACJS,MACAsB,cACA,CAAC,uEAAuE,CAAC,GACvE,CAAC,2BAA2B,EAAEE,QAAQ,GAAG,CAAC,GAC1C,CAAC,sCAAsC,EAAEA,QAAQ,MAAM,CAAC,GACxD,CAAC,sDAAsD,EAAEA,QAAQ,OAAO,CAAC,GACzE,CAAC,oCAAoC,EAAEA,QAAQ,KAAK,CAAC,GACrD,CAAC,8CAA8C,EAAEA,QAAQ,MAAM,CAAC,GAChE,CAAC,EAAE,CAAC;AAEV"}
@@ -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",
@@ -1820,6 +1854,9 @@ export class StaticWebsite extends Construct {
1820
1854
  destinationBucket: this.websiteBucket,
1821
1855
  // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
1822
1856
  distribution: this.cloudFrontDistribution,
1857
+ // Exclude the runtime config from this deployment's sync so its default pruning
1858
+ // never deletes the file managed separately by RuntimeConfigDeployment below.
1859
+ exclude: [DEFAULT_RUNTIME_CONFIG_FILENAME],
1823
1860
  memoryLimit: 1024,
1824
1861
  });
1825
1862
 
@@ -2111,9 +2148,25 @@ export default defineConfig(() => ({
2111
2148
 
2112
2149
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > pnpm-workspace.yaml 1`] = `
2113
2150
  "packages:
2114
- - "packages/*"
2115
- - "test-app"
2116
- - "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
2117
2170
  "
2118
2171
  `;
2119
2172
 
@@ -2187,6 +2240,25 @@ exports[`react-website generator > Tanstack router integration > should generate
2187
2240
  "
2188
2241
  `;
2189
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
+
2190
2262
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > test-app/project.json 1`] = `
2191
2263
  "{
2192
2264
  "name": "@proj/test-app",
@@ -2613,7 +2685,7 @@ export default defineConfig(() => ({
2613
2685
  provider: 'v8' as const,
2614
2686
  },
2615
2687
  },
2616
- resolve: { tsconfigPaths: true },
2688
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
2617
2689
  define: { global: {} },
2618
2690
  }));
2619
2691
  "
@@ -2623,10 +2695,10 @@ exports[`react-website generator > Tanstack router integration > should generate
2623
2695
  "{
2624
2696
  "compilerOptions": {
2625
2697
  "paths": {
2626
- ":proj/test-app": [
2698
+ "@proj/test-app": [
2627
2699
  "./test-app/src/index.ts"
2628
2700
  ],
2629
- ":proj/common-constructs": [
2701
+ "@proj/common-constructs": [
2630
2702
  "./packages/common/constructs/src/index.ts"
2631
2703
  ]
2632
2704
  },
@@ -2686,6 +2758,9 @@ exports[`react-website generator > Tanstack router integration > should generate
2686
2758
  "formatter": {
2687
2759
  "quoteStyle": "single",
2688
2760
  "trailingCommas": "all"
2761
+ },
2762
+ "resolver": {
2763
+ "experimentalPnpmCatalogs": true
2689
2764
  }
2690
2765
  },
2691
2766
  "css": {
@@ -2701,7 +2776,7 @@ exports[`react-website generator > Tanstack router integration > should generate
2701
2776
  "rules": {
2702
2777
  "preset": "none",
2703
2778
  "correctness": {
2704
- "noUndeclaredDependencies": "warn"
2779
+ "noUndeclaredDependencies": "error"
2705
2780
  }
2706
2781
  }
2707
2782
  },
@@ -2720,12 +2795,29 @@ exports[`react-website generator > Tanstack router integration > should generate
2720
2795
  "!**/node_modules",
2721
2796
  "!**/.nx",
2722
2797
  "!**/.venv",
2798
+ "!**/.grit",
2723
2799
  "!**/*.css",
2724
2800
  "!**/*.gen.*",
2725
2801
  "!**/generated/**",
2726
2802
  "!**/tsconfig*.json"
2727
2803
  ]
2728
- }
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
+ ]
2729
2821
  }
2730
2822
  "
2731
2823
  `;
@@ -2831,44 +2923,39 @@ exports[`react-website generator > Tanstack router integration > should generate
2831
2923
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > package.json 1`] = `
2832
2924
  "{
2833
2925
  "name": "@proj/source",
2834
- "dependencies": {
2835
- "@cloudscape-design/board-components": "3.0.205",
2836
- "@cloudscape-design/components": "3.0.1330",
2837
- "@cloudscape-design/global-styles": "1.0.62",
2838
- "@tanstack/react-router": "1.170.18",
2839
- "aws-cdk-lib": "2.261.0",
2840
- "constructs": "10.7.0",
2841
- "react": "19.2.7",
2842
- "react-dom": "19.2.7",
2843
- "tailwindcss": "4.3.3"
2844
- },
2926
+ "dependencies": {},
2845
2927
  "devDependencies": {
2846
2928
  "@nx/js": "23.1.0",
2847
- "@nx/react": "23.1.0",
2929
+ "@nx/react": "catalog:",
2848
2930
  "@nx/vite": "23.1.0",
2849
2931
  "@nx/vitest": "23.1.0",
2850
2932
  "@nx/web": "23.1.0",
2851
2933
  "@swc/helpers": "~0.5.18",
2852
- "@tailwindcss/vite": "4.3.3",
2853
- "@tanstack/router-generator": "1.167.21",
2854
- "@tanstack/router-plugin": "1.168.22",
2855
- "@tanstack/router-utils": "1.162.2",
2856
- "@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:",
2857
2939
  "@testing-library/dom": "10.4.0",
2858
2940
  "@testing-library/react": "16.3.0",
2859
- "@types/node": "26.1.1",
2941
+ "@types/node": "catalog:",
2860
2942
  "@types/react": "^19.0.0",
2861
2943
  "@types/react-dom": "^19.0.0",
2862
2944
  "@vitejs/plugin-react": "^6.0.0",
2863
- "@vitest/coverage-v8": "4.1.10",
2864
- "@vitest/ui": "4.1.10",
2945
+ "@vitest/coverage-v8": "catalog:",
2946
+ "@vitest/ui": "catalog:",
2865
2947
  "jiti": "2.4.2",
2866
2948
  "jsdom": "^27.1.0",
2867
2949
  "typescript": "~6.0.3",
2868
- "vite": "8.1.5",
2869
- "vitest": "4.1.10"
2950
+ "vite": "catalog:",
2951
+ "vitest": "catalog:"
2870
2952
  },
2871
- "type": "module"
2953
+ "type": "module",
2954
+ "workspaces": [
2955
+ "packages/*",
2956
+ "test-app",
2957
+ "packages/common/constructs"
2958
+ ]
2872
2959
  }
2873
2960
  "
2874
2961
  `;
@@ -2910,6 +2997,24 @@ You can also automatiaclly fix some lint errors by running the following command
2910
2997
  "
2911
2998
  `;
2912
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
+
2913
3018
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/project.json 1`] = `
2914
3019
  "{
2915
3020
  "name": "@proj/common-constructs",
@@ -3538,6 +3643,9 @@ export class StaticWebsite extends Construct {
3538
3643
  destinationBucket: this.websiteBucket,
3539
3644
  // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
3540
3645
  distribution: this.cloudFrontDistribution,
3646
+ // Exclude the runtime config from this deployment's sync so its default pruning
3647
+ // never deletes the file managed separately by RuntimeConfigDeployment below.
3648
+ exclude: [DEFAULT_RUNTIME_CONFIG_FILENAME],
3541
3649
  memoryLimit: 1024,
3542
3650
  });
3543
3651
 
@@ -3829,9 +3937,30 @@ export default defineConfig(() => ({
3829
3937
 
3830
3938
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > pnpm-workspace.yaml 1`] = `
3831
3939
  "packages:
3832
- - "packages/*"
3833
- - "test-app"
3834
- - "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
3835
3964
  "
3836
3965
  `;
3837
3966
 
@@ -3905,6 +4034,26 @@ exports[`react-website generator > Tanstack router integration > should generate
3905
4034
  "
3906
4035
  `;
3907
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
+
3908
4057
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > test-app/project.json 1`] = `
3909
4058
  "{
3910
4059
  "name": "@proj/test-app",
@@ -4524,7 +4673,7 @@ export default defineConfig(() => ({
4524
4673
  provider: 'v8' as const,
4525
4674
  },
4526
4675
  },
4527
- resolve: { tsconfigPaths: true },
4676
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
4528
4677
  define: { global: {} },
4529
4678
  }));
4530
4679
  "
@@ -4534,10 +4683,10 @@ exports[`react-website generator > Tanstack router integration > should generate
4534
4683
  "{
4535
4684
  "compilerOptions": {
4536
4685
  "paths": {
4537
- ":proj/test-app": [
4686
+ "@proj/test-app": [
4538
4687
  "./test-app/src/index.ts"
4539
4688
  ],
4540
- ":proj/common-constructs": [
4689
+ "@proj/common-constructs": [
4541
4690
  "./packages/common/constructs/src/index.ts"
4542
4691
  ]
4543
4692
  },
@@ -4645,7 +4794,7 @@ export default defineConfig(() => ({
4645
4794
  provider: 'v8' as const,
4646
4795
  },
4647
4796
  },
4648
- resolve: { tsconfigPaths: true },
4797
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
4649
4798
  define: { global: {} },
4650
4799
  }));
4651
4800
  "
@@ -5163,6 +5312,9 @@ export class StaticWebsite extends Construct {
5163
5312
  destinationBucket: this.websiteBucket,
5164
5313
  // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
5165
5314
  distribution: this.cloudFrontDistribution,
5315
+ // Exclude the runtime config from this deployment's sync so its default pruning
5316
+ // never deletes the file managed separately by RuntimeConfigDeployment below.
5317
+ exclude: [DEFAULT_RUNTIME_CONFIG_FILENAME],
5166
5318
  memoryLimit: 1024,
5167
5319
  });
5168
5320
 
@@ -5365,19 +5517,7 @@ root &&
5365
5517
  "
5366
5518
  `;
5367
5519
 
5368
- exports[`react-website generator > should handle npm scope prefix correctly > scoped-dependencies 1`] = `
5369
- {
5370
- "@cloudscape-design/board-components": "3.0.205",
5371
- "@cloudscape-design/components": "3.0.1330",
5372
- "@cloudscape-design/global-styles": "1.0.62",
5373
- "@tanstack/react-router": "1.170.18",
5374
- "aws-cdk-lib": "2.261.0",
5375
- "constructs": "10.7.0",
5376
- "react": "19.2.7",
5377
- "react-dom": "19.2.7",
5378
- "tailwindcss": "4.3.3",
5379
- }
5380
- `;
5520
+ exports[`react-website generator > should handle npm scope prefix correctly > scoped-dependencies 1`] = `{}`;
5381
5521
 
5382
5522
  exports[`react-website generator ux tests > Cloudscape > should update package.json with required dependencies > test-app/src/components/AppLayout/index.tsx 1`] = `
5383
5523
  "import * as React from 'react';
@@ -5723,8 +5863,8 @@ import {
5723
5863
  SidebarInset,
5724
5864
  SidebarProvider,
5725
5865
  SidebarTrigger,
5726
- } from ':proj/common-shadcn/components/ui/sidebar';
5727
- 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';
5728
5868
  import Config from '../../config';
5729
5869
 
5730
5870
  import { Link, useLocation, useMatchRoute } from '@tanstack/react-router';
@@ -5735,7 +5875,7 @@ import {
5735
5875
  BreadcrumbList,
5736
5876
  BreadcrumbPage,
5737
5877
  BreadcrumbSeparator,
5738
- } from ':proj/common-shadcn/components/ui/breadcrumb';
5878
+ } from '@proj/common-shadcn/components/ui/breadcrumb';
5739
5879
  import { AppSidebar } from '../app-sidebar';
5740
5880
 
5741
5881
  const getBreadcrumbs = (
@@ -5846,7 +5986,7 @@ import {
5846
5986
  Alert as ShadcnAlert,
5847
5987
  AlertDescription,
5848
5988
  AlertTitle,
5849
- } from ':proj/common-shadcn/components/ui/alert';
5989
+ } from '@proj/common-shadcn/components/ui/alert';
5850
5990
 
5851
5991
  type AlertType = 'info' | 'error';
5852
5992
 
@@ -5886,7 +6026,7 @@ import {
5886
6026
  SidebarMenu,
5887
6027
  SidebarMenuButton,
5888
6028
  SidebarMenuItem,
5889
- } from ':proj/common-shadcn/components/ui/sidebar';
6029
+ } from '@proj/common-shadcn/components/ui/sidebar';
5890
6030
  import { Link } from '@tanstack/react-router';
5891
6031
 
5892
6032
  import Config from '../config';
@@ -5928,7 +6068,7 @@ export function AppSidebar() {
5928
6068
  `;
5929
6069
 
5930
6070
  exports[`react-website generator ux tests > Shadcn > should update package.json with required dependencies > test-app/src/components/spinner.tsx 1`] = `
5931
- "import { Spinner as ShadcnSpinner } from ':proj/common-shadcn/components/ui/spinner';
6071
+ "import { Spinner as ShadcnSpinner } from '@proj/common-shadcn/components/ui/spinner';
5932
6072
 
5933
6073
  export const Spinner = ShadcnSpinner;
5934
6074
  "