@botonic/nx-plugin 2.23.0

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 (206) hide show
  1. package/CHANGELOG.md +420 -0
  2. package/README.md +279 -0
  3. package/executors.json +55 -0
  4. package/generators.json +61 -0
  5. package/migrations.json +40 -0
  6. package/package.json +54 -0
  7. package/src/cursor-commands/update-bot.md +114 -0
  8. package/src/cursor-commands/update-botonic.md +63 -0
  9. package/src/executors/build-node-app/executor.d.ts +5 -0
  10. package/src/executors/build-node-app/executor.js +65 -0
  11. package/src/executors/build-node-app/schema.d.js +16 -0
  12. package/src/executors/build-node-app/schema.json +25 -0
  13. package/src/executors/delete-bot/executor.d.ts +5 -0
  14. package/src/executors/delete-bot/executor.js +112 -0
  15. package/src/executors/delete-bot/schema.d.js +16 -0
  16. package/src/executors/delete-bot/schema.json +35 -0
  17. package/src/executors/deploy-local-runtime/executor.d.ts +5 -0
  18. package/src/executors/deploy-local-runtime/executor.js +144 -0
  19. package/src/executors/deploy-local-runtime/schema.d.js +16 -0
  20. package/src/executors/deploy-local-runtime/schema.json +34 -0
  21. package/src/executors/deploy-netlify-snapshot/executor.d.ts +8 -0
  22. package/src/executors/deploy-netlify-snapshot/executor.js +79 -0
  23. package/src/executors/deploy-netlify-snapshot/schema.d.js +16 -0
  24. package/src/executors/deploy-netlify-snapshot/schema.json +31 -0
  25. package/src/executors/deploy-to-hubtype/executor.d.ts +5 -0
  26. package/src/executors/deploy-to-hubtype/executor.js +308 -0
  27. package/src/executors/deploy-to-hubtype/schema.d.js +16 -0
  28. package/src/executors/deploy-to-hubtype/schema.json +31 -0
  29. package/src/executors/e2e-webchat/botonic-package-publish.spec.ts +84 -0
  30. package/src/executors/e2e-webchat/executor.d.ts +5 -0
  31. package/src/executors/e2e-webchat/executor.js +134 -0
  32. package/src/executors/e2e-webchat/schema.d.js +16 -0
  33. package/src/executors/e2e-webchat/schema.json +35 -0
  34. package/src/executors/integrate-provider/executor.d.ts +5 -0
  35. package/src/executors/integrate-provider/executor.js +155 -0
  36. package/src/executors/integrate-provider/schema.d.js +16 -0
  37. package/src/executors/integrate-provider/schema.json +30 -0
  38. package/src/executors/login-to-hubtype/executor.d.ts +5 -0
  39. package/src/executors/login-to-hubtype/executor.js +79 -0
  40. package/src/executors/login-to-hubtype/schema.d.js +16 -0
  41. package/src/executors/login-to-hubtype/schema.json +25 -0
  42. package/src/executors/logout-from-hubtype/executor.d.ts +3 -0
  43. package/src/executors/logout-from-hubtype/executor.js +54 -0
  44. package/src/executors/logout-from-hubtype/schema.d.js +16 -0
  45. package/src/executors/logout-from-hubtype/schema.json +9 -0
  46. package/src/executors/run-lambda/executor.d.ts +5 -0
  47. package/src/executors/run-lambda/executor.js +65 -0
  48. package/src/executors/run-lambda/schema.d.js +16 -0
  49. package/src/executors/run-lambda/schema.json +20 -0
  50. package/src/executors/serve-bot/executor.d.ts +5 -0
  51. package/src/executors/serve-bot/executor.js +330 -0
  52. package/src/executors/serve-bot/schema.d.js +16 -0
  53. package/src/executors/serve-bot/schema.json +40 -0
  54. package/src/generators/action/files/__name__.spec.ts.template +15 -0
  55. package/src/generators/action/files/__name__.ts.template +15 -0
  56. package/src/generators/action/generator.d.ts +4 -0
  57. package/src/generators/action/generator.js +112 -0
  58. package/src/generators/action/schema.d.ts +7 -0
  59. package/src/generators/action/schema.js +16 -0
  60. package/src/generators/action/schema.json +43 -0
  61. package/src/generators/bot-app/files/.eslintrc.json.template +18 -0
  62. package/src/generators/bot-app/files/README.md.template +148 -0
  63. package/src/generators/bot-app/files/src/client/custom-messages/index.ts.template +2 -0
  64. package/src/generators/bot-app/files/src/client/webchat/index.html.template +35 -0
  65. package/src/generators/bot-app/files/src/client/webchat/index.tsx.template +107 -0
  66. package/src/generators/bot-app/files/src/client/webchat/styles.css.template +17 -0
  67. package/src/generators/bot-app/files/src/client/webchat/webchat-tokens-overrides.css.template +2 -0
  68. package/src/generators/bot-app/files/src/client/webviews/app.tsx.template +8 -0
  69. package/src/generators/bot-app/files/src/client/webviews/index.html.template +32 -0
  70. package/src/generators/bot-app/files/src/client/webviews/index.tsx.template +18 -0
  71. package/src/generators/bot-app/files/src/server/bot/actions/index.ts.template +2 -0
  72. package/src/generators/bot-app/files/src/server/bot/actions/not-found.ts.template +13 -0
  73. package/src/generators/bot-app/files/src/server/bot/actions/welcome.ts.template +13 -0
  74. package/src/generators/bot-app/files/src/server/bot/index.ts.template +43 -0
  75. package/src/generators/bot-app/files/src/server/bot/plugins/ai-agents/index.ts.template +30 -0
  76. package/src/generators/bot-app/files/src/server/bot/plugins/flow-builder/index.ts.template +28 -0
  77. package/src/generators/bot-app/files/src/server/bot/plugins/index.ts.template +11 -0
  78. package/src/generators/bot-app/files/src/server/bot/routes.ts.template +23 -0
  79. package/src/generators/bot-app/files/src/server/bot/tools/index.ts.template +5 -0
  80. package/src/generators/bot-app/files/src/server/bot/tracking.ts.template +35 -0
  81. package/src/generators/bot-app/files/src/server/bot/types.ts.template +4 -0
  82. package/src/generators/bot-app/files/src/server/bot/utils.ts.template +9 -0
  83. package/src/generators/bot-app/files/src/server/lambda/handler.js.template +24 -0
  84. package/src/generators/bot-app/files/src/server/lambda/package.json +20 -0
  85. package/src/generators/bot-app/files/src/server/lambda/template.yaml.template +20 -0
  86. package/src/generators/bot-app/files/src/shared/constants.ts.template +12 -0
  87. package/src/generators/bot-app/files/vite/base-client.config.ts.template +14 -0
  88. package/src/generators/bot-app/files/vite/base.config.ts.template +20 -0
  89. package/src/generators/bot-app/files/vite/build.config.ts.template +65 -0
  90. package/src/generators/bot-app/files/vite/node.config.ts.template +41 -0
  91. package/src/generators/bot-app/files/vite/plugins/move-html.plugin.ts.template +36 -0
  92. package/src/generators/bot-app/files/vite/webchat.config.ts.template +58 -0
  93. package/src/generators/bot-app/files/vite/webviews.config.ts.template +57 -0
  94. package/src/generators/bot-app/files/vite.config.ts.template +36 -0
  95. package/src/generators/bot-app/generator.d.ts +4 -0
  96. package/src/generators/bot-app/generator.js +294 -0
  97. package/src/generators/bot-app/schema.d.ts +6 -0
  98. package/src/generators/bot-app/schema.js +16 -0
  99. package/src/generators/bot-app/schema.json +36 -0
  100. package/src/generators/bot-app-migrations/migrate-fix-css-code-split/generator.d.ts +5 -0
  101. package/src/generators/bot-app-migrations/migrate-fix-css-code-split/generator.js +92 -0
  102. package/src/generators/bot-app-migrations/migrate-fix-css-code-split/schema.json +15 -0
  103. package/src/generators/bot-app-migrations/migrate-pnpm-compat/generator.d.ts +5 -0
  104. package/src/generators/bot-app-migrations/migrate-pnpm-compat/generator.js +97 -0
  105. package/src/generators/bot-app-migrations/migrate-pnpm-compat/schema.json +15 -0
  106. package/src/generators/bot-app-migrations/migrate-webchat-trigger/generator.d.ts +5 -0
  107. package/src/generators/bot-app-migrations/migrate-webchat-trigger/generator.js +165 -0
  108. package/src/generators/bot-app-migrations/migrate-webchat-trigger/schema.json +15 -0
  109. package/src/generators/custom-message/files/__name__-output.ts.template +21 -0
  110. package/src/generators/custom-message/files/__name__.spec.tsx.template +27 -0
  111. package/src/generators/custom-message/files/__name__.tsx.template +18 -0
  112. package/src/generators/custom-message/generator.d.ts +4 -0
  113. package/src/generators/custom-message/generator.js +235 -0
  114. package/src/generators/custom-message/schema.d.ts +7 -0
  115. package/src/generators/custom-message/schema.js +16 -0
  116. package/src/generators/custom-message/schema.json +44 -0
  117. package/src/generators/preset/files/.cursor/commands/update-bot.md +5 -0
  118. package/src/generators/preset/files/.cursor/commands/update-botonic.md +5 -0
  119. package/src/generators/preset/files/.cursor/scripts/update-bot/discover-bots.sh +67 -0
  120. package/src/generators/preset/files/.cursor/scripts/update-bot/find-migration-guides.sh +70 -0
  121. package/src/generators/preset/files/.cursor/skills/botonic-action/SKILL.md +167 -0
  122. package/src/generators/preset/files/.cursor/skills/botonic-custom-message/SKILL.md +231 -0
  123. package/src/generators/preset/files/.cursor/skills/botonic-webview/SKILL.md +179 -0
  124. package/src/generators/preset/files/.env.prod.template +2 -0
  125. package/src/generators/preset/files/.env.template +2 -0
  126. package/src/generators/preset/files/.npmrc.template +1 -0
  127. package/src/generators/preset/files/README.md.template +174 -0
  128. package/src/generators/preset/files/nx.json +66 -0
  129. package/src/generators/preset/files/package.json +26 -0
  130. package/src/generators/preset/files/tsconfig.base.json +27 -0
  131. package/src/generators/preset/files/tsconfig.base.json.template +27 -0
  132. package/src/generators/preset/files/tsconfig.json +9 -0
  133. package/src/generators/preset/generator.d.ts +4 -0
  134. package/src/generators/preset/generator.js +127 -0
  135. package/src/generators/preset/schema.d.ts +6 -0
  136. package/src/generators/preset/schema.js +16 -0
  137. package/src/generators/preset/schema.json +50 -0
  138. package/src/generators/remove-custom-message/generator.d.ts +4 -0
  139. package/src/generators/remove-custom-message/generator.js +259 -0
  140. package/src/generators/remove-custom-message/schema.d.ts +6 -0
  141. package/src/generators/remove-custom-message/schema.js +16 -0
  142. package/src/generators/remove-custom-message/schema.json +39 -0
  143. package/src/generators/shared/bot-app-utils.d.ts +25 -0
  144. package/src/generators/shared/bot-app-utils.js +209 -0
  145. package/src/generators/webview/files/__name__.spec.tsx.template +20 -0
  146. package/src/generators/webview/files/__name__.tsx.template +19 -0
  147. package/src/generators/webview/generator.d.ts +4 -0
  148. package/src/generators/webview/generator.js +179 -0
  149. package/src/generators/webview/schema.d.ts +5 -0
  150. package/src/generators/webview/schema.js +16 -0
  151. package/src/generators/webview/schema.json +34 -0
  152. package/src/index.d.ts +7 -0
  153. package/src/index.js +56 -0
  154. package/src/lib/api-service.d.ts +110 -0
  155. package/src/lib/api-service.js +591 -0
  156. package/src/lib/bot-config.d.ts +30 -0
  157. package/src/lib/bot-config.js +203 -0
  158. package/src/lib/cloudflared-tunnel.d.ts +29 -0
  159. package/src/lib/cloudflared-tunnel.js +95 -0
  160. package/src/lib/constants.d.ts +13 -0
  161. package/src/lib/constants.js +60 -0
  162. package/src/lib/credentials-handler.d.ts +40 -0
  163. package/src/lib/credentials-handler.js +115 -0
  164. package/src/lib/index.d.ts +10 -0
  165. package/src/lib/index.js +47 -0
  166. package/src/lib/interfaces.d.ts +49 -0
  167. package/src/lib/interfaces.js +16 -0
  168. package/src/lib/util/executor-helpers.d.ts +97 -0
  169. package/src/lib/util/executor-helpers.js +574 -0
  170. package/src/lib/util/file-system.d.ts +8 -0
  171. package/src/lib/util/file-system.js +65 -0
  172. package/src/lib/util/sam-container-cleanup.d.ts +11 -0
  173. package/src/lib/util/sam-container-cleanup.js +55 -0
  174. package/src/lib/util/sam-template.d.ts +9 -0
  175. package/src/lib/util/sam-template.js +71 -0
  176. package/src/lib/util/system.d.ts +1 -0
  177. package/src/lib/util/system.js +30 -0
  178. package/src/migrations/add-botonic-update-bots-skill/add-botonic-update-bots-skill.migration.d.ts +2 -0
  179. package/src/migrations/add-botonic-update-bots-skill/add-botonic-update-bots-skill.migration.js +52 -0
  180. package/src/migrations/add-botonic-update-bots-skill/add-botonic-update-bots-skill.migration.md +23 -0
  181. package/src/migrations/add-botonic-update-bots-skill/files/.cursor/commands/update-bot.md +5 -0
  182. package/src/migrations/add-botonic-update-bots-skill/files/.cursor/commands/update-botonic.md +5 -0
  183. package/src/migrations/add-botonic-update-bots-skill/files/.cursor/scripts/update-bot/discover-bots.sh +67 -0
  184. package/src/migrations/add-botonic-update-bots-skill/files/.cursor/scripts/update-bot/find-migration-guides.sh +70 -0
  185. package/src/migrations/add-botonic-update-bots-skill/schema.json +5 -0
  186. package/src/migrations/add-lilara-registry/add-lilara-registry.migration.d.ts +2 -0
  187. package/src/migrations/add-lilara-registry/add-lilara-registry.migration.js +49 -0
  188. package/src/migrations/add-lilara-registry/schema.json +5 -0
  189. package/src/migrations/fix-css-code-split/fix-css-code-split.migration.md +45 -0
  190. package/src/migrations/remove-codeartifact-registry/remove-codeartifact-registry.migration.d.ts +2 -0
  191. package/src/migrations/remove-codeartifact-registry/remove-codeartifact-registry.migration.js +59 -0
  192. package/src/migrations/remove-codeartifact-registry/schema.json +5 -0
  193. package/src/migrations/sync-pending-bot-migrations/schema.json +5 -0
  194. package/src/migrations/sync-pending-bot-migrations/sync-pending-bot-migrations.migration.d.ts +2 -0
  195. package/src/migrations/sync-pending-bot-migrations/sync-pending-bot-migrations.migration.js +137 -0
  196. package/src/migrations/sync-pending-bot-migrations/sync-pending-bot-migrations.migration.md +19 -0
  197. package/src/migrations/update-cursor-commands-to-stubs/schema.json +5 -0
  198. package/src/migrations/update-cursor-commands-to-stubs/update-cursor-commands-to-stubs.migration.d.ts +2 -0
  199. package/src/migrations/update-cursor-commands-to-stubs/update-cursor-commands-to-stubs.migration.js +61 -0
  200. package/src/migrations/update-pnpm-workspace-scripts/schema.json +4 -0
  201. package/src/migrations/update-pnpm-workspace-scripts/update-pnpm-workspace-scripts.migration.d.ts +2 -0
  202. package/src/migrations/update-pnpm-workspace-scripts/update-pnpm-workspace-scripts.migration.js +47 -0
  203. package/src/migrations/utils/migration-utils.d.ts +109 -0
  204. package/src/migrations/utils/migration-utils.js +448 -0
  205. package/src/plugin.d.ts +15 -0
  206. package/src/plugin.js +246 -0
@@ -0,0 +1,12 @@
1
+ export const CUSTOM_MESSAGE_TYPES = {
2
+ // Add your custom message types here
3
+ } as const
4
+
5
+ export const WEBVIEWS = {
6
+ // Add your webviews here
7
+ } as const
8
+
9
+ export const PAYLOADS = {
10
+ // Add your payloads here
11
+ } as const
12
+
@@ -0,0 +1,14 @@
1
+ import react from '@vitejs/plugin-react-swc'
2
+ import { mergeConfig, type UserConfig } from 'vite'
3
+
4
+ import { getBaseConfig } from './base.config'
5
+
6
+ export function getBaseClientConfig(): UserConfig {
7
+ const baseConfig = getBaseConfig()
8
+
9
+ const clientConfig: UserConfig = {
10
+ plugins: [react()],
11
+ }
12
+
13
+ return mergeConfig(baseConfig, clientConfig)
14
+ }
@@ -0,0 +1,20 @@
1
+ import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'
2
+
3
+ export function getBaseConfig() {
4
+ return {
5
+ plugins: [nxViteTsPaths()],
6
+
7
+ test: {
8
+ watch: false,
9
+ globals: true,
10
+ environment: 'jsdom',
11
+ include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
12
+ reporters: ['default'],
13
+ coverage: {
14
+ reportsDirectory: '../../coverage/apps/<%= projectName %>',
15
+ provider: 'v8',
16
+ },
17
+ },
18
+ }
19
+ }
20
+
@@ -0,0 +1,65 @@
1
+ export const BUILD_CONFIG = {
2
+ // Target apps
3
+ TARGET_APPS: {
4
+ WEBCHAT: 'webchat',
5
+ WEBVIEWS: 'webviews',
6
+ NODE: 'node',
7
+ } as const,
8
+
9
+ // Input paths (source)
10
+ INPUT: {
11
+ webchat: {
12
+ root: 'src/client/webchat',
13
+ html: 'src/client/webchat/index.html',
14
+ entry: 'src/client/webchat/index.tsx',
15
+ },
16
+ webviews: {
17
+ root: 'src/client/webviews',
18
+ html: 'src/client/webviews/index.html',
19
+ entry: 'src/client/webviews/index.tsx',
20
+ },
21
+ node: {
22
+ root: 'src/server',
23
+ entry: 'src/server/bot/index.ts',
24
+ },
25
+ } as const,
26
+
27
+ // Output paths (build artifacts)
28
+ OUTPUT: {
29
+ webchat: {
30
+ dir: 'dist/webchat',
31
+ html: 'index.html',
32
+ js: 'webchat.botonic.js',
33
+ css: 'webchat.botonic.css',
34
+ },
35
+ webviews: {
36
+ dir: 'dist/webviews',
37
+ html: 'index.html',
38
+ js: 'webviews.botonic.js',
39
+ css: 'webviews.botonic.css',
40
+ },
41
+ node: {
42
+ dir: 'src/server/lambda/dist',
43
+ js: 'index.js',
44
+ },
45
+ } as const,
46
+
47
+ // Cache & build settings
48
+ CACHE_DIR: {
49
+ webchat: '../../node_modules/.vite/apps/<%= projectName %>-webchat',
50
+ webviews: '../../node_modules/.vite/apps/<%= projectName %>-webviews',
51
+ node: '../../node_modules/.vite/apps/<%= projectName %>-node',
52
+ },
53
+ PUBLIC_DIR: 'public',
54
+
55
+ // Server ports
56
+ SERVER: {
57
+ webchat: { port: 4201, preview: 4300 },
58
+ webviews: { port: 4202, preview: 4301 },
59
+ } as const,
60
+ }
61
+
62
+ export type TargetApp =
63
+ (typeof BUILD_CONFIG.TARGET_APPS)[keyof typeof BUILD_CONFIG.TARGET_APPS]
64
+
65
+ export type ClientTargetApp = 'webchat' | 'webviews'
@@ -0,0 +1,41 @@
1
+ import { resolve } from 'path'
2
+ import type { UserConfig } from 'vite'
3
+
4
+ import { BUILD_CONFIG } from './build.config'
5
+
6
+ const projectRoot = resolve(__dirname, '..')
7
+ const input = BUILD_CONFIG.INPUT.node
8
+ const output = BUILD_CONFIG.OUTPUT.node
9
+
10
+ export function getNodeConfig(): UserConfig {
11
+ return {
12
+ root: projectRoot,
13
+ cacheDir: resolve(projectRoot, BUILD_CONFIG.CACHE_DIR.node),
14
+
15
+ // SSR configuration - bundle @botonic/* packages into the lambda
16
+ // By default, Vite externalizes node_modules in SSR mode, but we need
17
+ // @botonic packages bundled since they won't be available at runtime in Lambda
18
+ ssr: {
19
+ noExternal: [/@botonic\/.*/],
20
+ },
21
+
22
+ build: {
23
+ // Server build configuration
24
+ outDir: resolve(projectRoot, output.dir),
25
+ emptyOutDir: true,
26
+ ssr: true,
27
+ target: 'node20',
28
+ lib: {
29
+ entry: resolve(projectRoot, input.entry),
30
+ name: 'bot',
31
+ fileName: output.js,
32
+ formats: ['es'],
33
+ },
34
+ rollupOptions: {
35
+ output: {
36
+ exports: 'named',
37
+ },
38
+ },
39
+ },
40
+ }
41
+ }
@@ -0,0 +1,36 @@
1
+ import { copyFileSync, existsSync, rmSync } from 'fs'
2
+ import { resolve } from 'path'
3
+ import type { Plugin } from 'vite'
4
+
5
+ import { BUILD_CONFIG, type ClientTargetApp } from '../build.config'
6
+
7
+ export function moveHtmlToRootPlugin(
8
+ projectRoot: string,
9
+ targetApp: ClientTargetApp
10
+ ): Plugin {
11
+ return {
12
+ name: 'move-html-to-root',
13
+ apply: 'build',
14
+ closeBundle() {
15
+ const outputConfig = BUILD_CONFIG.OUTPUT[targetApp]
16
+ const inputConfig = BUILD_CONFIG.INPUT[targetApp]
17
+
18
+ const distDir = resolve(projectRoot, outputConfig.dir)
19
+ const srcDir = resolve(distDir, 'src')
20
+
21
+ if (existsSync(srcDir)) {
22
+ const nestedHtml = resolve(distDir, inputConfig.html)
23
+ const targetHtml = resolve(distDir, outputConfig.html)
24
+
25
+ if (existsSync(nestedHtml)) {
26
+ // Move the HTML file to root
27
+ copyFileSync(nestedHtml, targetHtml)
28
+ // Remove the src directory
29
+ rmSync(srcDir, { recursive: true, force: true })
30
+ console.log(`✓ Moved ${outputConfig.html} to ${outputConfig.dir}/`)
31
+ }
32
+ }
33
+ },
34
+ }
35
+ }
36
+
@@ -0,0 +1,58 @@
1
+ import { resolve } from 'path'
2
+ import type { UserConfig } from 'vite'
3
+
4
+ import { BUILD_CONFIG } from './build.config'
5
+ import { moveHtmlToRootPlugin } from './plugins/move-html.plugin'
6
+
7
+ const projectRoot = resolve(__dirname, '..')
8
+ const output = BUILD_CONFIG.OUTPUT.webchat
9
+ const server = BUILD_CONFIG.SERVER.webchat
10
+
11
+ export function getWebchatConfig(command: 'serve' | 'build'): UserConfig {
12
+ return {
13
+ // For serve mode, use the webchat directory as root so dev server finds index.html
14
+ // For build mode, use project root to avoid relative path issues
15
+ root:
16
+ command === 'serve'
17
+ ? resolve(projectRoot, BUILD_CONFIG.INPUT.webchat.root)
18
+ : projectRoot,
19
+
20
+ cacheDir: resolve(projectRoot, BUILD_CONFIG.CACHE_DIR.webchat),
21
+ publicDir: resolve(projectRoot, BUILD_CONFIG.PUBLIC_DIR),
22
+ appType: 'spa',
23
+ base: '/',
24
+
25
+ server: {
26
+ port: server.port,
27
+ host: 'localhost',
28
+ open: '/',
29
+ },
30
+
31
+ preview: {
32
+ port: server.preview,
33
+ host: 'localhost',
34
+ },
35
+
36
+ build: {
37
+ outDir: resolve(projectRoot, output.dir),
38
+ emptyOutDir: true,
39
+ reportCompressedSize: true,
40
+ cssCodeSplit: false,
41
+ commonjsOptions: {
42
+ transformMixedEsModules: true,
43
+ },
44
+ rollupOptions: {
45
+ input: resolve(projectRoot, BUILD_CONFIG.INPUT.webchat.html),
46
+ output: {
47
+ entryFileNames: output.js,
48
+ chunkFileNames: output.js,
49
+ assetFileNames: 'webchat.botonic.[ext]',
50
+ },
51
+ },
52
+ },
53
+
54
+ plugins: [
55
+ moveHtmlToRootPlugin(projectRoot, BUILD_CONFIG.TARGET_APPS.WEBCHAT),
56
+ ],
57
+ }
58
+ }
@@ -0,0 +1,57 @@
1
+ import { resolve } from 'path'
2
+ import type { UserConfig } from 'vite'
3
+
4
+ import { BUILD_CONFIG } from './build.config'
5
+ import { moveHtmlToRootPlugin } from './plugins/move-html.plugin'
6
+
7
+ const projectRoot = resolve(__dirname, '..')
8
+ const output = BUILD_CONFIG.OUTPUT.webviews
9
+ const server = BUILD_CONFIG.SERVER.webviews
10
+
11
+ export function getWebviewsConfig(command: 'serve' | 'build'): UserConfig {
12
+ return {
13
+ // For serve mode, use the webviews directory as root so dev server finds index.html
14
+ // For build mode, use project root to avoid relative path issues
15
+ root:
16
+ command === 'serve'
17
+ ? resolve(projectRoot, BUILD_CONFIG.INPUT.webviews.root)
18
+ : projectRoot,
19
+
20
+ cacheDir: resolve(projectRoot, BUILD_CONFIG.CACHE_DIR.webviews),
21
+ publicDir: resolve(projectRoot, BUILD_CONFIG.PUBLIC_DIR),
22
+ appType: 'spa',
23
+ base: '/webviews/',
24
+
25
+ server: {
26
+ port: server.port,
27
+ host: 'localhost',
28
+ },
29
+
30
+ preview: {
31
+ port: server.preview,
32
+ host: 'localhost',
33
+ },
34
+
35
+ build: {
36
+ outDir: resolve(projectRoot, output.dir),
37
+ emptyOutDir: true,
38
+ reportCompressedSize: true,
39
+ cssCodeSplit: false,
40
+ commonjsOptions: {
41
+ transformMixedEsModules: true,
42
+ },
43
+ rollupOptions: {
44
+ input: resolve(projectRoot, BUILD_CONFIG.INPUT.webviews.html),
45
+ output: {
46
+ entryFileNames: output.js,
47
+ chunkFileNames: output.js,
48
+ assetFileNames: 'webviews.botonic.[ext]',
49
+ },
50
+ },
51
+ },
52
+
53
+ plugins: [
54
+ moveHtmlToRootPlugin(projectRoot, BUILD_CONFIG.TARGET_APPS.WEBVIEWS),
55
+ ],
56
+ }
57
+ }
@@ -0,0 +1,36 @@
1
+ /// <reference types='vitest' />
2
+ import { mergeConfig } from 'vite'
3
+ import { defineConfig, type UserConfig } from 'vitest/config'
4
+
5
+ import { getBaseConfig } from './vite/base.config'
6
+ import { getBaseClientConfig } from './vite/base-client.config'
7
+ import { BUILD_CONFIG } from './vite/build.config'
8
+ import { getNodeConfig } from './vite/node.config'
9
+ import { getWebchatConfig } from './vite/webchat.config'
10
+ import { getWebviewsConfig } from './vite/webviews.config'
11
+
12
+ const isNodeAppBuild = process.env.BUILD_TARGET === 'node'
13
+ const targetApp = process.env.TARGET_APP || 'webchat'
14
+ const isTestMode =
15
+ process.env.VITEST === 'true' || process.env.NODE_ENV === 'test'
16
+
17
+ export default defineConfig(({ command }): UserConfig => {
18
+ // Test mode - use base config only to avoid root directory issues
19
+ if (isTestMode) {
20
+ return getBaseConfig() as UserConfig
21
+ }
22
+
23
+ // Server/Node build
24
+ if (isNodeAppBuild) {
25
+ return mergeConfig(getBaseConfig(), getNodeConfig()) as UserConfig
26
+ }
27
+
28
+ // Client builds - baseClientConfig already includes base config
29
+ const baseClientConfig = getBaseClientConfig()
30
+ const clientConfig =
31
+ targetApp === BUILD_CONFIG.TARGET_APPS.WEBVIEWS
32
+ ? getWebviewsConfig(command)
33
+ : getWebchatConfig(command)
34
+
35
+ return mergeConfig(baseClientConfig, clientConfig) as UserConfig
36
+ })
@@ -0,0 +1,4 @@
1
+ import { GeneratorCallback, Tree } from '@nx/devkit';
2
+ import type { BotAppGeneratorSchema } from './schema';
3
+ export default function (tree: Tree, options: BotAppGeneratorSchema): Promise<GeneratorCallback>;
4
+ export { BotAppGeneratorSchema };
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var generator_exports = {};
30
+ __export(generator_exports, {
31
+ default: () => generator_default
32
+ });
33
+ module.exports = __toCommonJS(generator_exports);
34
+ var import_devkit = require("@nx/devkit");
35
+ var fs = __toESM(require("fs"));
36
+ var path = __toESM(require("path"));
37
+ const MODULE_DIR = __dirname;
38
+ function getBotonicVersion(options) {
39
+ const version = options.botonicVersion;
40
+ if (version && version !== "{{WORKSPACE_VERSION}}" && version !== "latest") {
41
+ return version.replace(/^[\^~]/, "");
42
+ }
43
+ try {
44
+ const packageJsonPath = path.resolve(
45
+ MODULE_DIR,
46
+ "..",
47
+ "..",
48
+ "..",
49
+ "package.json"
50
+ );
51
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
52
+ return packageJson.version || "latest";
53
+ } catch (error) {
54
+ console.warn("Could not read plugin version, using latest:", error);
55
+ return "latest";
56
+ }
57
+ }
58
+ function normalizeOptions(tree, options) {
59
+ let appName = options.name;
60
+ let directory = options.directory;
61
+ if (options.name.includes("/")) {
62
+ const parts = options.name.split("/");
63
+ appName = parts.pop();
64
+ if (!directory) {
65
+ directory = parts.join("/");
66
+ }
67
+ }
68
+ const name = (0, import_devkit.names)(appName).fileName;
69
+ if (!name) {
70
+ throw new Error(`Failed to normalize app name: ${appName}`);
71
+ }
72
+ let projectDirectory;
73
+ if (directory) {
74
+ const directoryName = (0, import_devkit.names)(directory).fileName;
75
+ if (!directoryName) {
76
+ throw new Error(`Failed to normalize directory name: ${directory}`);
77
+ }
78
+ projectDirectory = `${directoryName}/${name}`;
79
+ } else {
80
+ projectDirectory = name;
81
+ }
82
+ if (!projectDirectory) {
83
+ throw new Error(
84
+ `Failed to determine project directory for app name: ${appName}`
85
+ );
86
+ }
87
+ const projectName = projectDirectory.replace(new RegExp("/", "g"), "-");
88
+ const projectRoot = `${(0, import_devkit.getWorkspaceLayout)(tree).appsDir}/${projectDirectory}`;
89
+ return {
90
+ ...options,
91
+ name: appName,
92
+ // Use the parsed app name
93
+ directory,
94
+ // Use the parsed directory
95
+ projectName,
96
+ projectRoot,
97
+ projectDirectory
98
+ };
99
+ }
100
+ function createProjectConfiguration(tree, options) {
101
+ const projectConfig = {
102
+ name: options.projectName,
103
+ root: options.projectRoot,
104
+ sourceRoot: `${options.projectRoot}/src`,
105
+ projectType: "application",
106
+ tags: ["type:app", "botonic:bot-app"]
107
+ // Note: targets are now inferred by the @botonic/nx-plugin based on the 'botonic:bot-app' tag
108
+ // and the presence of configuration files (vite.config.ts, bot-config.ts, etc.)
109
+ };
110
+ (0, import_devkit.addProjectConfiguration)(tree, options.projectName, projectConfig);
111
+ }
112
+ function createPackageJson(tree, options, botonicVersion) {
113
+ const packageJson = {
114
+ name: options.projectName,
115
+ version: "1.0.0",
116
+ type: "module",
117
+ private: true,
118
+ description: `Botonic bot application: ${options.projectName}`,
119
+ main: "dist/src/index.js",
120
+ scripts: {},
121
+ dependencies: {
122
+ "@botonic/core": botonicVersion,
123
+ "@botonic/shared": botonicVersion,
124
+ "@botonic/webchat-core": botonicVersion,
125
+ "@botonic/webchat-react": botonicVersion,
126
+ "@botonic/webviews": botonicVersion,
127
+ "@botonic/plugin-hubtype-analytics": botonicVersion,
128
+ "@botonic/plugin-flow-builder": botonicVersion,
129
+ "@botonic/plugin-ai-agents": botonicVersion,
130
+ react: "18.3.1",
131
+ "react-dom": "18.3.1"
132
+ },
133
+ devDependencies: {
134
+ "@nx/vite": "21.0.3",
135
+ "@types/node": "18.16.9",
136
+ "@types/react": "18.3.1",
137
+ "@types/react-dom": "18.3.0",
138
+ "@vitejs/plugin-react": "^4.2.0",
139
+ "@vitejs/plugin-react-swc": "^3.5.0",
140
+ typescript: "5.7.3",
141
+ vite: "^5.0.0",
142
+ vitest: "^1.3.1"
143
+ }
144
+ };
145
+ (0, import_devkit.writeJson)(tree, `${options.projectRoot}/package.json`, packageJson);
146
+ }
147
+ function createTsConfigs(tree, options) {
148
+ const tsconfig = {
149
+ compilerOptions: {
150
+ jsx: "react-jsx",
151
+ allowJs: false,
152
+ esModuleInterop: true,
153
+ allowSyntheticDefaultImports: true,
154
+ resolveJsonModule: true,
155
+ strict: true,
156
+ types: ["vite/client", "vitest"]
157
+ },
158
+ files: [],
159
+ include: ["src/**/*.ts", "src/**/*.tsx"],
160
+ references: [
161
+ { path: "./tsconfig.app.json" },
162
+ { path: "./tsconfig.spec.json" }
163
+ ],
164
+ extends: "../../tsconfig.base.json"
165
+ };
166
+ const tsconfigApp = {
167
+ extends: "./tsconfig.json",
168
+ compilerOptions: {
169
+ outDir: "./dist/out-tsc",
170
+ types: ["node", "vite/client"],
171
+ composite: true,
172
+ noEmit: false,
173
+ declaration: true
174
+ },
175
+ files: [
176
+ "../../node_modules/@nx/react/typings/cssmodule.d.ts",
177
+ "../../node_modules/@nx/react/typings/image.d.ts"
178
+ ],
179
+ exclude: [
180
+ "jest.config.ts",
181
+ "src/**/*.spec.ts",
182
+ "src/**/*.test.ts",
183
+ "src/**/*.spec.tsx",
184
+ "src/**/*.test.tsx",
185
+ "src/**/*.spec.js",
186
+ "src/**/*.test.js",
187
+ "src/**/*.spec.jsx",
188
+ "src/**/*.test.jsx"
189
+ ],
190
+ include: ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
191
+ };
192
+ const tsconfigSpec = {
193
+ extends: "./tsconfig.json",
194
+ compilerOptions: {
195
+ outDir: "./dist/out-tsc",
196
+ module: "commonjs",
197
+ types: ["vitest/globals", "vitest/importMeta", "vite/client", "node"],
198
+ composite: true,
199
+ noEmit: false,
200
+ declaration: true
201
+ },
202
+ include: [
203
+ "vite.config.ts",
204
+ "vitest.config.ts",
205
+ "src/**/*.test.ts",
206
+ "src/**/*.spec.ts",
207
+ "src/**/*.test.tsx",
208
+ "src/**/*.spec.tsx",
209
+ "src/**/*.test.js",
210
+ "src/**/*.spec.js",
211
+ "src/**/*.test.jsx",
212
+ "src/**/*.spec.jsx",
213
+ "src/**/*.d.ts"
214
+ ]
215
+ };
216
+ (0, import_devkit.writeJson)(tree, `${options.projectRoot}/tsconfig.json`, tsconfig);
217
+ (0, import_devkit.writeJson)(tree, `${options.projectRoot}/tsconfig.app.json`, tsconfigApp);
218
+ (0, import_devkit.writeJson)(tree, `${options.projectRoot}/tsconfig.spec.json`, tsconfigSpec);
219
+ }
220
+ function addBotonicDependencies(tree, botonicVersion) {
221
+ return (0, import_devkit.addDependenciesToPackageJson)(
222
+ tree,
223
+ // dependencies
224
+ {
225
+ react: "18.3.1",
226
+ "react-dom": "18.3.1"
227
+ },
228
+ // devDependencies
229
+ {
230
+ "@nx/vite": "21.0.3",
231
+ "@types/node": "18.16.9",
232
+ "@types/react": "18.3.1",
233
+ "@types/react-dom": "18.3.0",
234
+ "@vitejs/plugin-react": "4.2.0",
235
+ "@vitejs/plugin-react-swc": "3.5.0",
236
+ typescript: "5.7.3",
237
+ vite: "5.0.0",
238
+ vitest: "1.3.1"
239
+ }
240
+ );
241
+ }
242
+ function addBotonicFiles(tree, options, botonicVersion) {
243
+ const templateOptions = {
244
+ ...options,
245
+ ...(0, import_devkit.names)(options.name),
246
+ botonicVersion
247
+ };
248
+ (0, import_devkit.generateFiles)(
249
+ tree,
250
+ (0, import_devkit.joinPathFragments)(MODULE_DIR, "files"),
251
+ options.projectRoot,
252
+ templateOptions
253
+ );
254
+ }
255
+ async function generator_default(tree, options) {
256
+ const botonicVersion = getBotonicVersion(options);
257
+ const tasks = [];
258
+ console.log(`\u{1F916} Using Botonic version: ${botonicVersion}`);
259
+ console.log(`\u{1F50D} Creating project using programmatic configuration...`);
260
+ const normalizedOptions = normalizeOptions(tree, options);
261
+ console.log(`\u{1F50D} Normalized options:`, {
262
+ projectName: normalizedOptions.projectName,
263
+ projectRoot: normalizedOptions.projectRoot,
264
+ projectDirectory: normalizedOptions.projectDirectory
265
+ });
266
+ createProjectConfiguration(tree, normalizedOptions);
267
+ createPackageJson(tree, normalizedOptions, botonicVersion);
268
+ createTsConfigs(tree, normalizedOptions);
269
+ const depsTask = addBotonicDependencies(tree, botonicVersion);
270
+ tasks.push(depsTask);
271
+ tasks.push(() => (0, import_devkit.installPackagesTask)(tree));
272
+ tasks.push(
273
+ () => (0, import_devkit.installPackagesTask)(
274
+ tree,
275
+ true,
276
+ `${normalizedOptions.projectRoot}/src/server/lambda/`
277
+ )
278
+ );
279
+ addBotonicFiles(tree, normalizedOptions, botonicVersion);
280
+ await (0, import_devkit.formatFiles)(tree);
281
+ tasks.push(() => {
282
+ console.log(
283
+ `
284
+ \u{1F389} Successfully created Botonic bot app: ${normalizedOptions.projectName}`
285
+ );
286
+ console.log(`\u{1F4C1} Project location: ${normalizedOptions.projectRoot}`);
287
+ console.log(`
288
+ \u{1F4CB} Next step:`);
289
+ console.log(` npx nx run ${normalizedOptions.projectName}:serve`);
290
+ console.log(`
291
+ \u{1F680} Happy bot building!`);
292
+ });
293
+ return (0, import_devkit.runTasksInSerial)(...tasks);
294
+ }
@@ -0,0 +1,6 @@
1
+ export interface BotAppGeneratorSchema {
2
+ name: string;
3
+ directory?: string;
4
+ packageManager?: 'pnpm' | 'npm';
5
+ botonicVersion?: string;
6
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var schema_exports = {};
16
+ module.exports = __toCommonJS(schema_exports);