@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,448 @@
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 migration_utils_exports = {};
30
+ __export(migration_utils_exports, {
31
+ createBotonicMigrationConfig: () => createBotonicMigrationConfig,
32
+ createFileProcessor: () => createFileProcessor,
33
+ findBotApps: () => findBotApps,
34
+ getCurrentBotonicCoreVersion: () => getCurrentBotonicCoreVersion,
35
+ getMigrationTargetVersion: () => getMigrationTargetVersion,
36
+ getPluginVersion: () => getPluginVersion,
37
+ runBotonicMigration: () => runBotonicMigration,
38
+ selectBotProjectsForMigration: () => selectBotProjectsForMigration,
39
+ updateBotonicDependencies: () => updateBotonicDependencies
40
+ });
41
+ module.exports = __toCommonJS(migration_utils_exports);
42
+ var import_devkit = require("@nx/devkit");
43
+ var import_enquirer = require("enquirer");
44
+ var fs = __toESM(require("fs"));
45
+ var path = __toESM(require("path"));
46
+ function updateBotonicDependencies(tree, targetVersion, projectPath) {
47
+ const exactVersion = targetVersion.replace(/^[\^~]/, "");
48
+ const packageJsonPath = `${projectPath}/package.json`;
49
+ const packageJson = (0, import_devkit.readJson)(tree, packageJsonPath);
50
+ for (const section of [
51
+ "dependencies",
52
+ "devDependencies",
53
+ "peerDependencies"
54
+ ]) {
55
+ if (!packageJson[section]) continue;
56
+ for (const dep of Object.keys(packageJson[section])) {
57
+ if (dep.startsWith("@botonic/")) {
58
+ packageJson[section][dep] = exactVersion;
59
+ }
60
+ }
61
+ }
62
+ tree.write(packageJsonPath, JSON.stringify(packageJson, null, 2));
63
+ }
64
+ function getCurrentBotonicCoreVersion(tree, projectPath) {
65
+ try {
66
+ const packageJsonPath = `${projectPath}/package.json`;
67
+ if (!tree.exists(packageJsonPath)) {
68
+ return null;
69
+ }
70
+ const packageJson = (0, import_devkit.readJson)(tree, packageJsonPath);
71
+ const dependencies = {
72
+ ...packageJson.dependencies,
73
+ ...packageJson.devDependencies
74
+ };
75
+ const coreVersion = dependencies["@botonic/core"];
76
+ if (!coreVersion) {
77
+ return null;
78
+ }
79
+ return coreVersion.replace(/[\^~]/, "");
80
+ } catch (error) {
81
+ return null;
82
+ }
83
+ }
84
+ function getMigrationTargetVersion(tree, migrationName) {
85
+ try {
86
+ const migrationsJsonPath = "migrations.json";
87
+ if (!tree.exists(migrationsJsonPath)) {
88
+ throw new Error(
89
+ `Could not find migrations.json in workspace root. Make sure to run 'nx migrate @botonic/nx-plugin@latest' first.`
90
+ );
91
+ }
92
+ const migrationsJson = (0, import_devkit.readJson)(tree, migrationsJsonPath);
93
+ if (Array.isArray(migrationsJson.migrations)) {
94
+ const migration = migrationsJson.migrations.find(
95
+ (m) => m.name === migrationName
96
+ );
97
+ if (migration?.version) {
98
+ return migration.version;
99
+ }
100
+ }
101
+ if (!migrationsJson.migrations || migrationsJson.migrations.length === 0) {
102
+ throw new Error(
103
+ `Could not find migration version for '${migrationName}' in migrations.json`
104
+ );
105
+ }
106
+ return null;
107
+ } catch (error) {
108
+ const errorMessage = error instanceof Error ? error.message : String(error);
109
+ console.error("Error finding migration target version:", errorMessage);
110
+ return null;
111
+ }
112
+ }
113
+ function findBotApps(tree) {
114
+ const projects = [];
115
+ try {
116
+ const projectsMap = (0, import_devkit.getProjects)(tree);
117
+ console.log(`Found ${projectsMap.size} projects in workspace configuration`);
118
+ for (const [projectName, projectConfig] of projectsMap.entries()) {
119
+ console.log(`Checking project: ${projectName} at ${projectConfig.root}`);
120
+ if (projectConfig.tags?.includes("botonic:bot-app")) {
121
+ console.log(`\u2705 ${projectName} is a Botonic bot app (tagged)`);
122
+ projects.push(projectConfig.root);
123
+ } else {
124
+ console.log(`\u274C ${projectName} is not a Botonic bot app (no tag)`);
125
+ }
126
+ }
127
+ } catch (error) {
128
+ const errorMessage = error instanceof Error ? error.message : String(error);
129
+ console.warn(
130
+ "Could not read workspace configuration, falling back to manual detection:",
131
+ errorMessage
132
+ );
133
+ const manualProjects = findBotAppsManually(tree);
134
+ console.log(
135
+ `Found ${manualProjects.length} projects via manual detection:`,
136
+ manualProjects
137
+ );
138
+ return manualProjects;
139
+ }
140
+ return projects;
141
+ }
142
+ function findBotAppsManually(tree) {
143
+ const projects = [];
144
+ if (tree.exists("apps")) {
145
+ tree.children("apps").forEach((appDir) => {
146
+ const projectJsonPath = `apps/${appDir}/project.json`;
147
+ if (tree.exists(projectJsonPath)) {
148
+ try {
149
+ const projectJsonContent = tree.read(projectJsonPath, "utf-8");
150
+ if (!projectJsonContent) return;
151
+ const projectJson = JSON.parse(projectJsonContent);
152
+ if (projectJson.tags?.includes("botonic:bot-app")) {
153
+ projects.push(`apps/${appDir}`);
154
+ }
155
+ } catch (error) {
156
+ const errorMessage = error instanceof Error ? error.message : String(error);
157
+ console.warn(
158
+ `Could not parse project.json for ${appDir}:`,
159
+ errorMessage
160
+ );
161
+ }
162
+ }
163
+ });
164
+ }
165
+ return projects;
166
+ }
167
+ function createBotonicMigrationConfig(config) {
168
+ return {
169
+ skipDependencyUpdates: false,
170
+ successTitle: "Migration completed!",
171
+ additionalSteps: [],
172
+ ...config
173
+ };
174
+ }
175
+ function createFileProcessor(fileProcessors) {
176
+ return async (tree, projectPath, targetBotonicVersion) => {
177
+ let filesChanged = 0;
178
+ let transformed = false;
179
+ for (const processor of fileProcessors) {
180
+ const filePath = processor.filePath(projectPath);
181
+ if (tree.exists(filePath) && processor.shouldProcess(tree, filePath)) {
182
+ const content = tree.read(filePath, "utf-8");
183
+ if (!content) continue;
184
+ const result = processor.processFile(
185
+ tree,
186
+ filePath,
187
+ content,
188
+ targetBotonicVersion
189
+ );
190
+ if (result.transformed) {
191
+ if (result.newContent) {
192
+ tree.write(filePath, result.newContent);
193
+ }
194
+ if (result.logMessage) {
195
+ import_devkit.logger.info(` \u2705 ${result.logMessage}`);
196
+ }
197
+ filesChanged++;
198
+ transformed = true;
199
+ }
200
+ }
201
+ }
202
+ return { transformed, filesChanged };
203
+ };
204
+ }
205
+ async function runBotonicMigration(config) {
206
+ const {
207
+ tree,
208
+ options,
209
+ migrationKey,
210
+ migrationName,
211
+ processProject,
212
+ getSuccessMessage,
213
+ skipDependencyUpdates = false,
214
+ successTitle = "Migration completed!",
215
+ additionalSteps = []
216
+ } = config;
217
+ const tasks = [];
218
+ const botProjects = await selectBotProjectsForMigration(
219
+ tree,
220
+ options,
221
+ migrationName,
222
+ migrationKey
223
+ );
224
+ if (botProjects.length === 0) {
225
+ return;
226
+ }
227
+ const migrationVersion = getMigrationTargetVersion(tree, migrationKey);
228
+ if (!migrationVersion) {
229
+ import_devkit.logger.error(
230
+ `\u274C Could not find migration version for '${migrationKey}' in migrations.json`
231
+ );
232
+ import_devkit.logger.error(" Please ensure the migration is properly configured.");
233
+ throw new Error(`Migration version not found for ${migrationKey}`);
234
+ }
235
+ const targetBotonicVersion = migrationVersion.replace(/^[\^~]/, "");
236
+ import_devkit.logger.info(`\u{1F3AF} Target Botonic version: ${targetBotonicVersion}`);
237
+ let transformedProjects = 0;
238
+ let transformedFiles = 0;
239
+ for (const projectPath of botProjects) {
240
+ import_devkit.logger.info(`\u{1F527} Processing project: ${projectPath.replace("apps/", "")}`);
241
+ const result = await processProject(tree, projectPath, targetBotonicVersion);
242
+ let projectTransformed = result.transformed;
243
+ transformedFiles += result.filesChanged;
244
+ if (!skipDependencyUpdates) {
245
+ const packageJsonPath = `${projectPath}/package.json`;
246
+ if (tree.exists(packageJsonPath)) {
247
+ import_devkit.logger.info(
248
+ ` \u2705 Updating Botonic dependencies to version ${targetBotonicVersion}`
249
+ );
250
+ updateBotonicDependencies(tree, targetBotonicVersion, projectPath);
251
+ transformedFiles++;
252
+ projectTransformed = true;
253
+ }
254
+ }
255
+ if (projectTransformed) {
256
+ transformedProjects++;
257
+ } else {
258
+ import_devkit.logger.info(
259
+ ` \u2139\uFE0F No changes needed for ${projectPath.replace("apps/", "")} (already up to date)`
260
+ );
261
+ }
262
+ }
263
+ await (0, import_devkit.formatFiles)(tree);
264
+ import_devkit.logger.info(`\u2728 Migration completed successfully!`);
265
+ import_devkit.logger.info(
266
+ ` \u{1F4CA} Projects processed: ${transformedProjects}/${botProjects.length}`
267
+ );
268
+ import_devkit.logger.info(` \u{1F4C4} Files transformed: ${transformedFiles}`);
269
+ if (transformedFiles > 0) {
270
+ import_devkit.logger.info(``);
271
+ import_devkit.logger.info(`\u{1F389} ${successTitle}`);
272
+ import_devkit.logger.info(``);
273
+ import_devkit.logger.info(`\u{1F4DD} What changed:`);
274
+ const successMessages = getSuccessMessage(targetBotonicVersion);
275
+ successMessages.forEach((message) => import_devkit.logger.info(` ${message}`));
276
+ if (additionalSteps.length > 0) {
277
+ import_devkit.logger.info(``);
278
+ import_devkit.logger.info(`\u{1F4CB} Additional steps:`);
279
+ additionalSteps.forEach((step) => import_devkit.logger.info(` ${step}`));
280
+ }
281
+ import_devkit.logger.info(``);
282
+ import_devkit.logger.info(`\u{1F527} Next steps:`);
283
+ import_devkit.logger.info(` \u2022 Test your bot to ensure everything works correctly`);
284
+ import_devkit.logger.info(` \u2022 Check git diff to review all changes made`);
285
+ } else {
286
+ import_devkit.logger.info(``);
287
+ import_devkit.logger.info(`\u2728 All specified projects are already up to date!`);
288
+ }
289
+ return (0, import_devkit.runTasksInSerial)(...tasks);
290
+ }
291
+ async function selectBotProjectsForMigration(tree, options, migrationName, migrationKey) {
292
+ const { projects: targetProjects, skipPrompt = false } = options;
293
+ const targetVersion = migrationKey ? getMigrationTargetVersion(tree, migrationKey) : null;
294
+ import_devkit.logger.info(`\u{1F504} Starting ${migrationName} migration...`);
295
+ if (targetVersion) {
296
+ import_devkit.logger.info(`\u{1F3AF} Target version: v${targetVersion}`);
297
+ }
298
+ const allBotProjects = findBotApps(tree);
299
+ if (allBotProjects.length === 0) {
300
+ import_devkit.logger.info("\u2139\uFE0F No Botonic bot apps found. Skipping migration.");
301
+ return [];
302
+ }
303
+ let botProjects;
304
+ if (targetProjects && targetProjects.length > 0) {
305
+ const invalidProjects = targetProjects.filter((project) => {
306
+ const projectPath = project.startsWith("apps/") ? project : `apps/${project}`;
307
+ return !allBotProjects.includes(projectPath);
308
+ });
309
+ if (invalidProjects.length > 0) {
310
+ import_devkit.logger.error(
311
+ `\u274C The following projects are not valid Botonic bot apps: ${invalidProjects.join(", ")}`
312
+ );
313
+ import_devkit.logger.info(
314
+ `\u{1F4A1} Available bot apps: ${allBotProjects.map((p) => p.replace("apps/", "")).join(", ")}`
315
+ );
316
+ return [];
317
+ }
318
+ botProjects = targetProjects.map(
319
+ (project) => project.startsWith("apps/") ? project : `apps/${project}`
320
+ );
321
+ import_devkit.logger.info(
322
+ `\u{1F3AF} Targeting specific bot apps: ${botProjects.map((p) => p.replace("apps/", "")).join(", ")}`
323
+ );
324
+ for (const projectPath of botProjects) {
325
+ const currentVersion = getCurrentBotonicCoreVersion(tree, projectPath);
326
+ const projectName = projectPath.replace("apps/", "");
327
+ if (currentVersion && targetVersion) {
328
+ import_devkit.logger.info(
329
+ ` \u{1F4E6} ${projectName}: v${currentVersion} \u2192 v${targetVersion}`
330
+ );
331
+ } else if (currentVersion) {
332
+ import_devkit.logger.info(` \u{1F4E6} ${projectName}: v${currentVersion}`);
333
+ } else {
334
+ import_devkit.logger.info(` \u{1F4E6} ${projectName}: version unknown`);
335
+ }
336
+ }
337
+ } else if (!skipPrompt && allBotProjects.length > 1) {
338
+ import_devkit.logger.info(`\u{1F4E6} Found ${allBotProjects.length} Botonic bot app(s)`);
339
+ import_devkit.logger.info("\u{1F3AF} Select which apps to migrate:\n");
340
+ try {
341
+ const projectChoices = allBotProjects.map(
342
+ (projectPath) => {
343
+ const projectName = projectPath.replace("apps/", "");
344
+ const currentVersion = getCurrentBotonicCoreVersion(tree, projectPath);
345
+ let displayName = projectName;
346
+ if (currentVersion) {
347
+ displayName = `${projectName} (v${currentVersion})`;
348
+ }
349
+ let hint = "";
350
+ if (currentVersion && targetVersion) {
351
+ hint = `v${currentVersion} \u2192 v${targetVersion}`;
352
+ } else if (currentVersion) {
353
+ hint = `Current: v${currentVersion}`;
354
+ } else {
355
+ hint = "version unknown";
356
+ }
357
+ return {
358
+ name: projectPath,
359
+ message: displayName,
360
+ hint
361
+ };
362
+ }
363
+ );
364
+ const response = await (0, import_enquirer.prompt)({
365
+ type: "multiselect",
366
+ name: "selectedProjects",
367
+ message: targetVersion ? `Which bot apps would you like to apply ${migrationName} to? (Target: v${targetVersion})` : `Which bot apps would you like to apply ${migrationName} to?`,
368
+ choices: projectChoices,
369
+ result(names) {
370
+ return names;
371
+ }
372
+ });
373
+ botProjects = response.selectedProjects;
374
+ if (botProjects.length === 0) {
375
+ import_devkit.logger.info("\u2139\uFE0F No bot apps selected. Skipping migration.");
376
+ return [];
377
+ }
378
+ import_devkit.logger.info(
379
+ `
380
+ \u{1F3AF} Selected bot apps: ${botProjects.map((p) => p.replace("apps/", "")).join(", ")}`
381
+ );
382
+ for (const projectPath of botProjects) {
383
+ const currentVersion = getCurrentBotonicCoreVersion(tree, projectPath);
384
+ const projectName = projectPath.replace("apps/", "");
385
+ if (currentVersion && targetVersion) {
386
+ import_devkit.logger.info(
387
+ ` \u{1F4E6} ${projectName}: v${currentVersion} \u2192 v${targetVersion}`
388
+ );
389
+ } else if (currentVersion) {
390
+ import_devkit.logger.info(` \u{1F4E6} ${projectName}: v${currentVersion}`);
391
+ } else {
392
+ import_devkit.logger.info(` \u{1F4E6} ${projectName}: version unknown`);
393
+ }
394
+ }
395
+ } catch (error) {
396
+ import_devkit.logger.warn(
397
+ "\u26A0\uFE0F Interactive selection not available. Processing all bot apps."
398
+ );
399
+ botProjects = allBotProjects;
400
+ }
401
+ } else {
402
+ botProjects = allBotProjects;
403
+ import_devkit.logger.info(
404
+ `\u{1F4E6} Found ${botProjects.length} Botonic bot app(s): ${botProjects.map((p) => p.replace("apps/", "")).join(", ")}`
405
+ );
406
+ for (const projectPath of botProjects) {
407
+ const currentVersion = getCurrentBotonicCoreVersion(tree, projectPath);
408
+ const projectName = projectPath.replace("apps/", "");
409
+ if (currentVersion && targetVersion) {
410
+ import_devkit.logger.info(
411
+ ` \u{1F4E6} ${projectName}: v${currentVersion} \u2192 v${targetVersion}`
412
+ );
413
+ } else if (currentVersion) {
414
+ import_devkit.logger.info(` \u{1F4E6} ${projectName}: v${currentVersion}`);
415
+ } else {
416
+ import_devkit.logger.info(` \u{1F4E6} ${projectName}: version unknown`);
417
+ }
418
+ }
419
+ }
420
+ return botProjects;
421
+ }
422
+ function getPluginVersion(moduleDir) {
423
+ try {
424
+ const pkgJsonPath = path.resolve(
425
+ moduleDir,
426
+ "..",
427
+ "..",
428
+ "..",
429
+ "package.json"
430
+ );
431
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
432
+ return pkgJson.version || "latest";
433
+ } catch {
434
+ return "latest";
435
+ }
436
+ }
437
+ // Annotate the CommonJS export names for ESM import in node:
438
+ 0 && (module.exports = {
439
+ createBotonicMigrationConfig,
440
+ createFileProcessor,
441
+ findBotApps,
442
+ getCurrentBotonicCoreVersion,
443
+ getMigrationTargetVersion,
444
+ getPluginVersion,
445
+ runBotonicMigration,
446
+ selectBotProjectsForMigration,
447
+ updateBotonicDependencies
448
+ });
@@ -0,0 +1,15 @@
1
+ import { CreateNodesV2 } from '@nx/devkit';
2
+ export interface BotonicPluginOptions {
3
+ buildTargetName?: string;
4
+ serveTargetName?: string;
5
+ testTargetName?: string;
6
+ lintTargetName?: string;
7
+ }
8
+ export declare const createNodesV2: CreateNodesV2<BotonicPluginOptions>;
9
+ /**
10
+ * Plugin configuration for nx.json
11
+ */
12
+ export declare const BotonicPlugin: {
13
+ name: string;
14
+ createNodesV2: CreateNodesV2<BotonicPluginOptions>;
15
+ };
package/src/plugin.js ADDED
@@ -0,0 +1,246 @@
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 __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var plugin_exports = {};
20
+ __export(plugin_exports, {
21
+ BotonicPlugin: () => BotonicPlugin,
22
+ createNodesV2: () => createNodesV2
23
+ });
24
+ module.exports = __toCommonJS(plugin_exports);
25
+ var import_devkit = require("@nx/devkit");
26
+ var import_fs = require("fs");
27
+ var import_path = require("path");
28
+ const DEFAULT_OPTIONS = {
29
+ buildTargetName: "build",
30
+ serveTargetName: "serve",
31
+ testTargetName: "test",
32
+ lintTargetName: "lint"
33
+ };
34
+ const botonicCreateNodesFunction = async (configFiles, options, context) => {
35
+ const normalizedOptions = { ...DEFAULT_OPTIONS, ...options };
36
+ const results = [];
37
+ for (const projectJsonPath of configFiles) {
38
+ const projectRoot = (0, import_path.dirname)(projectJsonPath);
39
+ try {
40
+ const projectJson = await readProjectJson(projectJsonPath, context);
41
+ if (!isBotonicProject(projectJson)) {
42
+ continue;
43
+ }
44
+ import_devkit.logger.debug(
45
+ `[Botonic Plugin] Detected Botonic project at: ${projectRoot}`
46
+ );
47
+ const targets = await createBotonicTargets(
48
+ projectRoot,
49
+ normalizedOptions,
50
+ context
51
+ );
52
+ const result = {
53
+ projects: {
54
+ [projectRoot]: {
55
+ targets
56
+ }
57
+ }
58
+ };
59
+ results.push([projectJsonPath, result]);
60
+ } catch (error) {
61
+ import_devkit.logger.warn(
62
+ `[Botonic Plugin] Error processing ${projectJsonPath}: ${error.message}`
63
+ );
64
+ }
65
+ }
66
+ return results;
67
+ };
68
+ const createNodesV2 = [
69
+ "**/project.json",
70
+ botonicCreateNodesFunction
71
+ ];
72
+ async function readProjectJson(projectJsonPath, context) {
73
+ try {
74
+ const fullPath = (0, import_path.join)(context.workspaceRoot, projectJsonPath);
75
+ const projectJsonContent = (0, import_fs.readFileSync)(fullPath, "utf-8");
76
+ return JSON.parse(projectJsonContent);
77
+ } catch (error) {
78
+ import_devkit.logger.debug(
79
+ `[Botonic Plugin] Could not read ${projectJsonPath}: ${error.message}`
80
+ );
81
+ return null;
82
+ }
83
+ }
84
+ function isBotonicProject(projectConfig) {
85
+ if (!projectConfig) return false;
86
+ const hasBotonicTag = projectConfig.tags?.includes("botonic:bot-app") ?? false;
87
+ const isApplication = projectConfig.projectType === "application";
88
+ return hasBotonicTag && isApplication;
89
+ }
90
+ const configurations = {
91
+ local: {
92
+ configuration: "local"
93
+ },
94
+ dev2: {
95
+ configuration: "dev2",
96
+ env: {
97
+ VITE_HUBTYPE_CLIENT_ID: "WlvymZ703Y5zGnmaCZ9Da5vf0lNX08jFvgC4pRMT",
98
+ VITE_HUBTYPE_API_URL: "https://api.dev2.dev.dev.hubtype.com",
99
+ VITE_PUSHER_API_PREFIX: "dev-dev-dev2"
100
+ }
101
+ },
102
+ dev: {
103
+ configuration: "dev",
104
+ env: {
105
+ VITE_HUBTYPE_CLIENT_ID: "AcIVeUMYaqH6O17LiCzbR3phZcRmfxYQNYFMr3BI",
106
+ VITE_HUBTYPE_API_URL: "https://api.dev.dev.dev.hubtype.com",
107
+ VITE_PUSHER_API_PREFIX: "dev-dev-dev"
108
+ }
109
+ },
110
+ qa: {
111
+ configuration: "qa",
112
+ env: {
113
+ VITE_HUBTYPE_CLIENT_ID: "kf7Dr7wLBMxZ9bKYIyZE4fzBpDlWGp4yR9CnXa5v",
114
+ VITE_HUBTYPE_API_URL: "https://api.int.qa.hubtype.com",
115
+ VITE_PUSHER_API_PREFIX: "qa-test-int"
116
+ }
117
+ },
118
+ prod: {
119
+ configuration: "prod",
120
+ env: {
121
+ VITE_HUBTYPE_CLIENT_ID: "jOIYDdvcfwqwSs7ZJ1CpmTKcE7UDapZDOSobFmEp",
122
+ VITE_HUBTYPE_API_URL: "https://api.hubtype.com",
123
+ VITE_PUSHER_API_PREFIX: "prod-ent0-ent0"
124
+ }
125
+ }
126
+ };
127
+ async function createBotonicTargets(projectRoot, options, context) {
128
+ const targets = {};
129
+ import_devkit.logger.debug(
130
+ `[Botonic Plugin] Creating all Botonic targets for ${projectRoot}`
131
+ );
132
+ targets["run-lambda"] = {
133
+ executor: "@botonic/nx-plugin:run-lambda",
134
+ options: {
135
+ lambdaPath: "src/server/lambda"
136
+ },
137
+ continuous: true,
138
+ dependsOn: ["build-node-app-watch"]
139
+ };
140
+ targets[options.serveTargetName] = {
141
+ executor: "@botonic/nx-plugin:serve-bot",
142
+ options: {},
143
+ configurations,
144
+ continuous: true
145
+ };
146
+ targets["serve:webchat"] = {
147
+ executor: "@botonic/nx-plugin:serve-bot",
148
+ options: {
149
+ skipWebviews: true
150
+ },
151
+ configurations,
152
+ continuous: true
153
+ };
154
+ targets["serve:webview"] = {
155
+ executor: "@botonic/nx-plugin:serve-bot",
156
+ options: {},
157
+ configurations,
158
+ continuous: true
159
+ };
160
+ targets["serve-dev"] = {
161
+ executor: "@botonic/nx-plugin:serve-bot",
162
+ options: {},
163
+ configurations,
164
+ continuous: true
165
+ };
166
+ targets["serve-dev-tunnel"] = {
167
+ executor: "@botonic/nx-plugin:serve-bot",
168
+ options: {},
169
+ configurations,
170
+ continuous: true
171
+ };
172
+ targets["build-node-app"] = {
173
+ executor: "nx:run-commands",
174
+ options: {
175
+ command: `VITE_CJS_IGNORE_WARNING=true BUILD_TARGET=node vite build --config ${projectRoot}/vite.config.ts`,
176
+ forwardAllArgs: false
177
+ },
178
+ configurations
179
+ };
180
+ targets["build-node-app-watch"] = {
181
+ executor: "nx:run-commands",
182
+ options: {
183
+ command: `VITE_CJS_IGNORE_WARNING=true BUILD_TARGET=node vite build --config ${projectRoot}/vite.config.ts --watch`,
184
+ forwardAllArgs: false
185
+ },
186
+ continuous: true,
187
+ configurations
188
+ };
189
+ targets["build-webchat-app"] = {
190
+ executor: "nx:run-commands",
191
+ options: {
192
+ command: `TARGET_APP=webchat vite build --config ${projectRoot}/vite.config.ts`,
193
+ forwardAllArgs: false
194
+ },
195
+ configurations
196
+ };
197
+ targets["build-webviews-app"] = {
198
+ executor: "nx:run-commands",
199
+ options: {
200
+ command: `TARGET_APP=webviews vite build --config ${projectRoot}/vite.config.ts`,
201
+ forwardAllArgs: false
202
+ },
203
+ configurations
204
+ };
205
+ targets["login-to-hubtype"] = {
206
+ executor: "@botonic/nx-plugin:login-to-hubtype",
207
+ configurations
208
+ };
209
+ targets["logout-from-hubtype"] = {
210
+ executor: "@botonic/nx-plugin:logout-from-hubtype"
211
+ };
212
+ targets["deploy-to-hubtype"] = {
213
+ executor: "@botonic/nx-plugin:deploy-to-hubtype",
214
+ configurations
215
+ };
216
+ targets["deploy-local-runtime"] = {
217
+ executor: "@botonic/nx-plugin:deploy-local-runtime",
218
+ configurations
219
+ };
220
+ targets["integrate-provider"] = {
221
+ executor: "@botonic/nx-plugin:integrate-provider",
222
+ configurations
223
+ };
224
+ targets["delete-bot"] = {
225
+ executor: "@botonic/nx-plugin:delete-bot",
226
+ configurations
227
+ };
228
+ targets["deploy-netlify-snapshot"] = {
229
+ executor: "@botonic/nx-plugin:deploy-netlify-snapshot",
230
+ options: {}
231
+ };
232
+ targets["e2e-webchat"] = {
233
+ executor: "@botonic/nx-plugin:e2e-webchat",
234
+ options: {}
235
+ };
236
+ return targets;
237
+ }
238
+ const BotonicPlugin = {
239
+ name: "@botonic/nx-plugin",
240
+ createNodesV2
241
+ };
242
+ // Annotate the CommonJS export names for ESM import in node:
243
+ 0 && (module.exports = {
244
+ BotonicPlugin,
245
+ createNodesV2
246
+ });