@aws/nx-plugin 1.0.0-rc.46 → 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 (158) hide show
  1. package/LICENSE-THIRD-PARTY +3 -60
  2. package/generators.json +1 -1
  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/generator.js +2 -1
  28. package/src/py/rdb/generator.js.map +1 -1
  29. package/src/smithy/ts/api/generator.js +5 -2
  30. package/src/smithy/ts/api/generator.js.map +1 -1
  31. package/src/terraform/project/generator.js +4 -1
  32. package/src/terraform/project/generator.js.map +1 -1
  33. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +6 -6
  34. package/src/trpc/backend/generator.js +7 -5
  35. package/src/trpc/backend/generator.js.map +1 -1
  36. package/src/trpc/react/generator.js +4 -4
  37. package/src/trpc/react/generator.js.map +1 -1
  38. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +2 -2
  39. package/src/ts/agent/a2a-connection/generator.js +3 -2
  40. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  41. package/src/ts/agent/gateway-connection/generator.js +4 -3
  42. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  43. package/src/ts/agent/generator.js +8 -5
  44. package/src/ts/agent/generator.js.map +1 -1
  45. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +1 -1
  46. package/src/ts/agent/mcp-connection/generator.js +4 -3
  47. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  48. package/src/ts/agent/react-connection/generator.js +10 -19
  49. package/src/ts/agent/react-connection/generator.js.map +1 -1
  50. package/src/ts/astro-docs/generator.js +12 -3
  51. package/src/ts/astro-docs/generator.js.map +1 -1
  52. package/src/ts/dcr-proxy/generator.js +5 -5
  53. package/src/ts/dcr-proxy/generator.js.map +1 -1
  54. package/src/ts/dynamodb/generator.js +5 -2
  55. package/src/ts/dynamodb/generator.js.map +1 -1
  56. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -2
  57. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  58. package/src/ts/lambda-function/generator.js +3 -2
  59. package/src/ts/lambda-function/generator.js.map +1 -1
  60. package/src/ts/lib/ts-project-utils.js +17 -10
  61. package/src/ts/lib/ts-project-utils.js.map +1 -1
  62. package/src/ts/lib/vitest.js +2 -1
  63. package/src/ts/lib/vitest.js.map +1 -1
  64. package/src/ts/mcp-server/generator.js +11 -11
  65. package/src/ts/mcp-server/generator.js.map +1 -1
  66. package/src/ts/nx-generator/generator.js +5 -0
  67. package/src/ts/nx-generator/generator.js.map +1 -1
  68. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +5 -6
  69. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  70. package/src/ts/nx-plugin/utils.js +2 -1
  71. package/src/ts/nx-plugin/utils.js.map +1 -1
  72. package/src/ts/rdb/agent-connection/generator.js +1 -2
  73. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  74. package/src/ts/rdb/generator.js +10 -6
  75. package/src/ts/rdb/generator.js.map +1 -1
  76. package/src/ts/rdb/mcp-server-connection/generator.js +1 -2
  77. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  78. package/src/ts/rdb/smithy-connection/generator.js +1 -2
  79. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  80. package/src/ts/rdb/trpc-connection/generator.js +1 -2
  81. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  82. package/src/ts/react-website/agui/generator.js +5 -4
  83. package/src/ts/react-website/agui/generator.js.map +1 -1
  84. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +210 -79
  85. package/src/ts/react-website/app/generator.js +34 -14
  86. package/src/ts/react-website/app/generator.js.map +1 -1
  87. package/src/ts/react-website/cognito-auth/generator.js +3 -2
  88. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  89. package/src/ts/react-website/runtime-config/generator.js +2 -2
  90. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  91. package/src/ts/sync/generator.js +81 -3
  92. package/src/ts/sync/generator.js.map +1 -1
  93. package/src/utils/agent-connection/agent-connection.d.ts +1 -1
  94. package/src/utils/agent-connection/agent-connection.js +50 -1
  95. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  96. package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -1
  97. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  98. package/src/utils/api-constructs/api-constructs.js +15 -1
  99. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  100. package/src/utils/bundle/bundle.js +2 -1
  101. package/src/utils/bundle/bundle.js.map +1 -1
  102. package/src/utils/commands.d.ts +5 -3
  103. package/src/utils/commands.js +24 -3
  104. package/src/utils/commands.js.map +1 -1
  105. package/src/utils/config/index.d.ts +16 -0
  106. package/src/utils/config/index.js.map +1 -1
  107. package/src/utils/config/utils.d.ts +3 -2
  108. package/src/utils/config/utils.js +4 -3
  109. package/src/utils/config/utils.js.map +1 -1
  110. package/src/utils/connection/open-api/react.js +3 -2
  111. package/src/utils/connection/open-api/react.js.map +1 -1
  112. package/src/utils/containers.js +1 -1
  113. package/src/utils/containers.js.map +1 -1
  114. package/src/utils/dependencies.d.ts +18 -0
  115. package/src/utils/dependencies.js +206 -0
  116. package/src/utils/dependencies.js.map +1 -0
  117. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  118. package/src/utils/files/shadcn/components.json.template +1 -1
  119. package/src/utils/format.d.ts +20 -1
  120. package/src/utils/format.js +83 -49
  121. package/src/utils/format.js.map +1 -1
  122. package/src/utils/fs.d.ts +1 -1
  123. package/src/utils/fs.js +1 -1
  124. package/src/utils/fs.js.map +1 -1
  125. package/src/utils/iac.js +1 -1
  126. package/src/utils/iac.js.map +1 -1
  127. package/src/utils/init.d.ts +7 -1
  128. package/src/utils/init.js +38 -17
  129. package/src/utils/init.js.map +1 -1
  130. package/src/utils/install.js +3 -1
  131. package/src/utils/install.js.map +1 -1
  132. package/src/utils/module-format.d.ts +5 -8
  133. package/src/utils/module-format.js +29 -12
  134. package/src/utils/module-format.js.map +1 -1
  135. package/src/utils/npm-scope.d.ts +0 -4
  136. package/src/utils/npm-scope.js +0 -5
  137. package/src/utils/npm-scope.js.map +1 -1
  138. package/src/utils/pnpm-workspace.d.ts +1 -12
  139. package/src/utils/pnpm-workspace.js +3 -30
  140. package/src/utils/pnpm-workspace.js.map +1 -1
  141. package/src/utils/project-package-json.d.ts +39 -0
  142. package/src/utils/project-package-json.js +119 -0
  143. package/src/utils/project-package-json.js.map +1 -0
  144. package/src/utils/shared-constructs.js +6 -5
  145. package/src/utils/shared-constructs.js.map +1 -1
  146. package/src/utils/shared-dynamodb-scripts.js +4 -2
  147. package/src/utils/shared-dynamodb-scripts.js.map +1 -1
  148. package/src/utils/shared-infra-scripts.js +5 -4
  149. package/src/utils/shared-infra-scripts.js.map +1 -1
  150. package/src/utils/shared-rdb-scripts.js +14 -1
  151. package/src/utils/shared-rdb-scripts.js.map +1 -1
  152. package/src/utils/shared-shadcn.js +11 -8
  153. package/src/utils/shared-shadcn.js.map +1 -1
  154. package/src/utils/test.js +8 -3
  155. package/src/utils/test.js.map +1 -1
  156. package/src/utils/versions.d.ts +3 -0
  157. package/src/utils/versions.js +3 -0
  158. package/src/utils/versions.js.map +1 -1
@@ -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":"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"}
@@ -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
  "