@fnd-platform/cli 1.0.0-alpha.3 → 1.0.0-alpha.31

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 (237) hide show
  1. package/LICENSE +21 -0
  2. package/lib/bin/fnd.js +101 -4
  3. package/lib/bin/fnd.js.map +1 -1
  4. package/lib/commands/add.d.ts.map +1 -1
  5. package/lib/commands/add.js +134 -67
  6. package/lib/commands/add.js.map +1 -1
  7. package/lib/commands/build.js +29 -34
  8. package/lib/commands/build.js.map +1 -1
  9. package/lib/commands/deploy.d.ts +34 -9
  10. package/lib/commands/deploy.d.ts.map +1 -1
  11. package/lib/commands/deploy.js +246 -52
  12. package/lib/commands/deploy.js.map +1 -1
  13. package/lib/commands/destroy.d.ts +69 -0
  14. package/lib/commands/destroy.d.ts.map +1 -0
  15. package/lib/commands/destroy.js +172 -0
  16. package/lib/commands/destroy.js.map +1 -0
  17. package/lib/commands/index.d.ts +2 -0
  18. package/lib/commands/index.d.ts.map +1 -1
  19. package/lib/commands/index.js +7 -13
  20. package/lib/commands/index.js.map +1 -1
  21. package/lib/commands/new.js +46 -50
  22. package/lib/commands/new.js.map +1 -1
  23. package/lib/commands/synth.d.ts +8 -1
  24. package/lib/commands/synth.d.ts.map +1 -1
  25. package/lib/commands/synth.js +82 -22
  26. package/lib/commands/synth.js.map +1 -1
  27. package/lib/commands/test.d.ts +73 -0
  28. package/lib/commands/test.d.ts.map +1 -0
  29. package/lib/commands/test.js +193 -0
  30. package/lib/commands/test.js.map +1 -0
  31. package/lib/index.d.ts +11 -2
  32. package/lib/index.d.ts.map +1 -1
  33. package/lib/index.js +31 -15
  34. package/lib/index.js.map +1 -1
  35. package/lib/lib/deploy-utils.d.ts +190 -0
  36. package/lib/lib/deploy-utils.d.ts.map +1 -0
  37. package/lib/lib/deploy-utils.js +372 -0
  38. package/lib/lib/deploy-utils.js.map +1 -0
  39. package/lib/lib/infra-generator.d.ts +118 -0
  40. package/lib/lib/infra-generator.d.ts.map +1 -1
  41. package/lib/lib/infra-generator.js +1051 -59
  42. package/lib/lib/infra-generator.js.map +1 -1
  43. package/lib/lib/logger.js +23 -29
  44. package/lib/lib/logger.js.map +1 -1
  45. package/lib/lib/nx-stats.js +12 -18
  46. package/lib/lib/nx-stats.js.map +1 -1
  47. package/lib/lib/project.js +7 -11
  48. package/lib/lib/project.js.map +1 -1
  49. package/lib/lib/templates.js +2 -6
  50. package/lib/lib/templates.js.map +1 -1
  51. package/lib/lib/timer.js +2 -7
  52. package/lib/lib/timer.js.map +1 -1
  53. package/lib/lib/validation.d.ts +135 -0
  54. package/lib/lib/validation.d.ts.map +1 -0
  55. package/lib/lib/validation.js +233 -0
  56. package/lib/lib/validation.js.map +1 -0
  57. package/lib/tui/App.d.ts +11 -0
  58. package/lib/tui/App.d.ts.map +1 -0
  59. package/lib/tui/App.js +98 -0
  60. package/lib/tui/App.js.map +1 -0
  61. package/lib/tui/components/branding/AsciiBanner.d.ts +21 -0
  62. package/lib/tui/components/branding/AsciiBanner.d.ts.map +1 -0
  63. package/lib/tui/components/branding/AsciiBanner.js +15 -0
  64. package/lib/tui/components/branding/AsciiBanner.js.map +1 -0
  65. package/lib/tui/components/branding/index.d.ts +5 -0
  66. package/lib/tui/components/branding/index.d.ts.map +1 -0
  67. package/lib/tui/components/branding/index.js +5 -0
  68. package/lib/tui/components/branding/index.js.map +1 -0
  69. package/lib/tui/components/feedback/Notification.d.ts +51 -0
  70. package/lib/tui/components/feedback/Notification.d.ts.map +1 -0
  71. package/lib/tui/components/feedback/Notification.js +89 -0
  72. package/lib/tui/components/feedback/Notification.js.map +1 -0
  73. package/lib/tui/components/feedback/ProgressBar.d.ts +46 -0
  74. package/lib/tui/components/feedback/ProgressBar.d.ts.map +1 -0
  75. package/lib/tui/components/feedback/ProgressBar.js +30 -0
  76. package/lib/tui/components/feedback/ProgressBar.js.map +1 -0
  77. package/lib/tui/components/feedback/ProgressSteps.d.ts +35 -0
  78. package/lib/tui/components/feedback/ProgressSteps.d.ts.map +1 -0
  79. package/lib/tui/components/feedback/ProgressSteps.js +37 -0
  80. package/lib/tui/components/feedback/ProgressSteps.js.map +1 -0
  81. package/lib/tui/components/feedback/Spinner.d.ts +18 -0
  82. package/lib/tui/components/feedback/Spinner.d.ts.map +1 -0
  83. package/lib/tui/components/feedback/Spinner.js +28 -0
  84. package/lib/tui/components/feedback/Spinner.js.map +1 -0
  85. package/lib/tui/components/feedback/index.d.ts +8 -0
  86. package/lib/tui/components/feedback/index.d.ts.map +1 -0
  87. package/lib/tui/components/feedback/index.js +8 -0
  88. package/lib/tui/components/feedback/index.js.map +1 -0
  89. package/lib/tui/components/index.d.ts +8 -0
  90. package/lib/tui/components/index.d.ts.map +1 -0
  91. package/lib/tui/components/index.js +8 -0
  92. package/lib/tui/components/index.js.map +1 -0
  93. package/lib/tui/components/input/Checkbox.d.ts +26 -0
  94. package/lib/tui/components/input/Checkbox.d.ts.map +1 -0
  95. package/lib/tui/components/input/Checkbox.js +20 -0
  96. package/lib/tui/components/input/Checkbox.js.map +1 -0
  97. package/lib/tui/components/input/SelectInput.d.ts +41 -0
  98. package/lib/tui/components/input/SelectInput.d.ts.map +1 -0
  99. package/lib/tui/components/input/SelectInput.js +53 -0
  100. package/lib/tui/components/input/SelectInput.js.map +1 -0
  101. package/lib/tui/components/input/TextInput.d.ts +30 -0
  102. package/lib/tui/components/input/TextInput.d.ts.map +1 -0
  103. package/lib/tui/components/input/TextInput.js +48 -0
  104. package/lib/tui/components/input/TextInput.js.map +1 -0
  105. package/lib/tui/components/input/index.d.ts +7 -0
  106. package/lib/tui/components/input/index.d.ts.map +1 -0
  107. package/lib/tui/components/input/index.js +7 -0
  108. package/lib/tui/components/input/index.js.map +1 -0
  109. package/lib/tui/components/layout/Breadcrumbs.d.ts +11 -0
  110. package/lib/tui/components/layout/Breadcrumbs.d.ts.map +1 -0
  111. package/lib/tui/components/layout/Breadcrumbs.js +34 -0
  112. package/lib/tui/components/layout/Breadcrumbs.js.map +1 -0
  113. package/lib/tui/components/layout/Footer.d.ts +11 -0
  114. package/lib/tui/components/layout/Footer.d.ts.map +1 -0
  115. package/lib/tui/components/layout/Footer.js +20 -0
  116. package/lib/tui/components/layout/Footer.js.map +1 -0
  117. package/lib/tui/components/layout/Header.d.ts +21 -0
  118. package/lib/tui/components/layout/Header.d.ts.map +1 -0
  119. package/lib/tui/components/layout/Header.js +21 -0
  120. package/lib/tui/components/layout/Header.js.map +1 -0
  121. package/lib/tui/components/layout/Screen.d.ts +27 -0
  122. package/lib/tui/components/layout/Screen.d.ts.map +1 -0
  123. package/lib/tui/components/layout/Screen.js +11 -0
  124. package/lib/tui/components/layout/Screen.js.map +1 -0
  125. package/lib/tui/components/layout/index.d.ts +8 -0
  126. package/lib/tui/components/layout/index.d.ts.map +1 -0
  127. package/lib/tui/components/layout/index.js +8 -0
  128. package/lib/tui/components/layout/index.js.map +1 -0
  129. package/lib/tui/hooks/index.d.ts +20 -0
  130. package/lib/tui/hooks/index.d.ts.map +1 -0
  131. package/lib/tui/hooks/index.js +18 -0
  132. package/lib/tui/hooks/index.js.map +1 -0
  133. package/lib/tui/hooks/useAddPackage.d.ts +120 -0
  134. package/lib/tui/hooks/useAddPackage.d.ts.map +1 -0
  135. package/lib/tui/hooks/useAddPackage.js +357 -0
  136. package/lib/tui/hooks/useAddPackage.js.map +1 -0
  137. package/lib/tui/hooks/useCreateProject.d.ts +66 -0
  138. package/lib/tui/hooks/useCreateProject.d.ts.map +1 -0
  139. package/lib/tui/hooks/useCreateProject.js +158 -0
  140. package/lib/tui/hooks/useCreateProject.js.map +1 -0
  141. package/lib/tui/hooks/useDeploy.d.ts +93 -0
  142. package/lib/tui/hooks/useDeploy.d.ts.map +1 -0
  143. package/lib/tui/hooks/useDeploy.js +254 -0
  144. package/lib/tui/hooks/useDeploy.js.map +1 -0
  145. package/lib/tui/hooks/useKeyboard.d.ts +66 -0
  146. package/lib/tui/hooks/useKeyboard.d.ts.map +1 -0
  147. package/lib/tui/hooks/useKeyboard.js +102 -0
  148. package/lib/tui/hooks/useKeyboard.js.map +1 -0
  149. package/lib/tui/hooks/useNavigation.d.ts +33 -0
  150. package/lib/tui/hooks/useNavigation.d.ts.map +1 -0
  151. package/lib/tui/hooks/useNavigation.js +27 -0
  152. package/lib/tui/hooks/useNavigation.js.map +1 -0
  153. package/lib/tui/hooks/useProject.d.ts +36 -0
  154. package/lib/tui/hooks/useProject.d.ts.map +1 -0
  155. package/lib/tui/hooks/useProject.js +47 -0
  156. package/lib/tui/hooks/useProject.js.map +1 -0
  157. package/lib/tui/index.d.ts +15 -0
  158. package/lib/tui/index.d.ts.map +1 -0
  159. package/lib/tui/index.js +16 -0
  160. package/lib/tui/index.js.map +1 -0
  161. package/lib/tui/lib/add-package-tui.d.ts +130 -0
  162. package/lib/tui/lib/add-package-tui.d.ts.map +1 -0
  163. package/lib/tui/lib/add-package-tui.js +492 -0
  164. package/lib/tui/lib/add-package-tui.js.map +1 -0
  165. package/lib/tui/lib/create-project-tui.d.ts +92 -0
  166. package/lib/tui/lib/create-project-tui.d.ts.map +1 -0
  167. package/lib/tui/lib/create-project-tui.js +181 -0
  168. package/lib/tui/lib/create-project-tui.js.map +1 -0
  169. package/lib/tui/lib/deploy-tui.d.ts +131 -0
  170. package/lib/tui/lib/deploy-tui.d.ts.map +1 -0
  171. package/lib/tui/lib/deploy-tui.js +347 -0
  172. package/lib/tui/lib/deploy-tui.js.map +1 -0
  173. package/lib/tui/screens/AddPackageScreen.d.ts +12 -0
  174. package/lib/tui/screens/AddPackageScreen.d.ts.map +1 -0
  175. package/lib/tui/screens/AddPackageScreen.js +436 -0
  176. package/lib/tui/screens/AddPackageScreen.js.map +1 -0
  177. package/lib/tui/screens/CreateProjectScreen.d.ts +12 -0
  178. package/lib/tui/screens/CreateProjectScreen.d.ts.map +1 -0
  179. package/lib/tui/screens/CreateProjectScreen.js +261 -0
  180. package/lib/tui/screens/CreateProjectScreen.js.map +1 -0
  181. package/lib/tui/screens/DeployScreen.d.ts +11 -0
  182. package/lib/tui/screens/DeployScreen.d.ts.map +1 -0
  183. package/lib/tui/screens/DeployScreen.js +224 -0
  184. package/lib/tui/screens/DeployScreen.js.map +1 -0
  185. package/lib/tui/screens/ProjectDashboard.d.ts +11 -0
  186. package/lib/tui/screens/ProjectDashboard.d.ts.map +1 -0
  187. package/lib/tui/screens/ProjectDashboard.js +81 -0
  188. package/lib/tui/screens/ProjectDashboard.js.map +1 -0
  189. package/lib/tui/screens/WelcomeScreen.d.ts +11 -0
  190. package/lib/tui/screens/WelcomeScreen.d.ts.map +1 -0
  191. package/lib/tui/screens/WelcomeScreen.js +26 -0
  192. package/lib/tui/screens/WelcomeScreen.js.map +1 -0
  193. package/lib/tui/screens/index.d.ts +9 -0
  194. package/lib/tui/screens/index.d.ts.map +1 -0
  195. package/lib/tui/screens/index.js +9 -0
  196. package/lib/tui/screens/index.js.map +1 -0
  197. package/lib/tui/services/ConfigService.d.ts +133 -0
  198. package/lib/tui/services/ConfigService.d.ts.map +1 -0
  199. package/lib/tui/services/ConfigService.js +221 -0
  200. package/lib/tui/services/ConfigService.js.map +1 -0
  201. package/lib/tui/services/ProjectService.d.ts +55 -0
  202. package/lib/tui/services/ProjectService.d.ts.map +1 -0
  203. package/lib/tui/services/ProjectService.js +179 -0
  204. package/lib/tui/services/ProjectService.js.map +1 -0
  205. package/lib/tui/services/index.d.ts +6 -0
  206. package/lib/tui/services/index.d.ts.map +1 -0
  207. package/lib/tui/services/index.js +6 -0
  208. package/lib/tui/services/index.js.map +1 -0
  209. package/lib/tui/state/AppContext.d.ts +58 -0
  210. package/lib/tui/state/AppContext.d.ts.map +1 -0
  211. package/lib/tui/state/AppContext.js +75 -0
  212. package/lib/tui/state/AppContext.js.map +1 -0
  213. package/lib/tui/state/index.d.ts +7 -0
  214. package/lib/tui/state/index.d.ts.map +1 -0
  215. package/lib/tui/state/index.js +7 -0
  216. package/lib/tui/state/index.js.map +1 -0
  217. package/lib/tui/state/reducer.d.ts +13 -0
  218. package/lib/tui/state/reducer.d.ts.map +1 -0
  219. package/lib/tui/state/reducer.js +136 -0
  220. package/lib/tui/state/reducer.js.map +1 -0
  221. package/lib/tui/state/types.d.ts +132 -0
  222. package/lib/tui/state/types.d.ts.map +1 -0
  223. package/lib/tui/state/types.js +38 -0
  224. package/lib/tui/state/types.js.map +1 -0
  225. package/lib/tui/utils/ascii.d.ts +42 -0
  226. package/lib/tui/utils/ascii.d.ts.map +1 -0
  227. package/lib/tui/utils/ascii.js +63 -0
  228. package/lib/tui/utils/ascii.js.map +1 -0
  229. package/lib/tui/utils/colors.d.ts +65 -0
  230. package/lib/tui/utils/colors.d.ts.map +1 -0
  231. package/lib/tui/utils/colors.js +65 -0
  232. package/lib/tui/utils/colors.js.map +1 -0
  233. package/lib/tui/utils/index.d.ts +6 -0
  234. package/lib/tui/utils/index.d.ts.map +1 -0
  235. package/lib/tui/utils/index.js +6 -0
  236. package/lib/tui/utils/index.js.map +1 -0
  237. package/package.json +23 -14
@@ -0,0 +1,492 @@
1
+ /**
2
+ * TUI-compatible package addition module.
3
+ *
4
+ * Adapted from the CLI add command to work with the TUI:
5
+ * - Does NOT call process.exit()
6
+ * - Reports progress via callback
7
+ * - Returns result object for handling by the UI
8
+ */
9
+ import { execSync } from 'child_process';
10
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { findProjectRoot } from '../../lib/project.js';
13
+ import { generateInfraPackage, generateFrontendStack, generateCmsStack, } from '../../lib/infra-generator.js';
14
+ import { ProjectService } from '../services/ProjectService.js';
15
+ /**
16
+ * Package version to use for @fnd-platform dependencies.
17
+ */
18
+ const FND_PACKAGE_VERSION = '^1.0.0-alpha.1';
19
+ /**
20
+ * Valid package name pattern: lowercase alphanumeric with hyphens.
21
+ * Must start with a letter.
22
+ */
23
+ export const PACKAGE_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
24
+ /**
25
+ * Validates a package name.
26
+ *
27
+ * @param name - The package name to validate
28
+ * @returns Validation result with error message if invalid
29
+ */
30
+ export function validatePackageName(name) {
31
+ if (!name || name.trim() === '') {
32
+ return { valid: false, error: 'Package name is required' };
33
+ }
34
+ if (name.length < 2) {
35
+ return { valid: false, error: 'Package name must be at least 2 characters' };
36
+ }
37
+ if (name.length > 50) {
38
+ return { valid: false, error: 'Package name must be 50 characters or less' };
39
+ }
40
+ if (!PACKAGE_NAME_PATTERN.test(name)) {
41
+ return {
42
+ valid: false,
43
+ error: 'Name must start with a letter and contain only lowercase letters, numbers, and hyphens',
44
+ };
45
+ }
46
+ // Reserved names
47
+ const reserved = ['node_modules', 'src', 'test', 'build', 'dist', 'lib', 'shared', 'types'];
48
+ if (reserved.includes(name)) {
49
+ return { valid: false, error: `'${name}' is a reserved name` };
50
+ }
51
+ return { valid: true };
52
+ }
53
+ /**
54
+ * Checks if a package already exists in the project.
55
+ *
56
+ * @param projectRoot - Project root directory
57
+ * @param packageName - Package name to check
58
+ * @returns True if package exists
59
+ */
60
+ export function checkPackageExists(projectRoot, packageName) {
61
+ const packagesDir = join(projectRoot, 'packages');
62
+ return existsSync(join(packagesDir, packageName));
63
+ }
64
+ /**
65
+ * Gets available API packages in the project.
66
+ *
67
+ * Checks both filesystem (for existing packages) and .projenrc.ts
68
+ * (for packages that may not be fully synthesized yet).
69
+ *
70
+ * @param projectRoot - Project root directory
71
+ * @returns Array of API package names
72
+ */
73
+ export function getAvailableApiPackages(projectRoot) {
74
+ const apiPackages = new Set();
75
+ // Check filesystem for existing API packages
76
+ const packages = ProjectService.detectPackages(projectRoot);
77
+ for (const pkg of packages) {
78
+ if (pkg.type === 'api') {
79
+ apiPackages.add(pkg.name);
80
+ }
81
+ }
82
+ // Also check .projenrc.ts for API packages that may not be synthesized yet
83
+ const projenrcPath = join(projectRoot, '.projenrc.ts');
84
+ if (existsSync(projenrcPath)) {
85
+ try {
86
+ const content = readFileSync(projenrcPath, 'utf-8');
87
+ // Match: const <name> = new FndApiProject({
88
+ const apiMatches = content.matchAll(/const\s+(\w+)\s*=\s*new\s+FndApiProject\s*\(/g);
89
+ for (const match of apiMatches) {
90
+ apiPackages.add(match[1]);
91
+ }
92
+ }
93
+ catch {
94
+ // Ignore read errors
95
+ }
96
+ }
97
+ return Array.from(apiPackages);
98
+ }
99
+ /**
100
+ * Checks if an API package exists in .projenrc.ts.
101
+ *
102
+ * @param projenrcContent - Content of .projenrc.ts
103
+ * @param apiName - API package name to check
104
+ * @returns True if API package exists
105
+ */
106
+ export function checkApiInProjenrc(projenrcContent, apiName) {
107
+ const apiVarPattern = new RegExp(`const\\s+${apiName}\\s*=\\s*new\\s+FndApiProject`);
108
+ return apiVarPattern.test(projenrcContent);
109
+ }
110
+ /**
111
+ * Extracts the project variable name from .projenrc.ts.
112
+ *
113
+ * @param content - .projenrc.ts content
114
+ * @returns Project variable name
115
+ */
116
+ function extractProjectVarName(content) {
117
+ const projectMatch = content.match(/const\s+(\w+)\s*=\s*new\s+FndMonorepoProject/);
118
+ return projectMatch ? projectMatch[1] : 'project';
119
+ }
120
+ /**
121
+ * Extracts the project name from .projenrc.ts content.
122
+ *
123
+ * @param content - .projenrc.ts file content
124
+ * @returns Project name
125
+ */
126
+ function extractProjectNameFromContent(content) {
127
+ const nameMatch = content.match(/new\s+FndMonorepoProject\s*\(\s*\{[^}]*name:\s*['"]([^'"]+)['"]/s);
128
+ if (nameMatch) {
129
+ return nameMatch[1];
130
+ }
131
+ const fallbackMatch = content.match(/name:\s*['"]([^'"]+)['"]/);
132
+ if (fallbackMatch) {
133
+ return fallbackMatch[1];
134
+ }
135
+ return 'my-app';
136
+ }
137
+ /**
138
+ * Generates the FndApiProject instantiation code.
139
+ */
140
+ function generateApiProjectCode(parentVar, options) {
141
+ const outdirLine = options.outdir ? `\n outdir: '${options.outdir}',` : '';
142
+ const dynamodbLine = options.dynamodb === false ? '\n dynamodb: false,' : '';
143
+ const cognitoLine = options.cognito === false ? '\n cognito: false,' : '';
144
+ return `const ${options.name} = new FndApiProject({
145
+ parent: ${parentVar},
146
+ name: '${options.name}',${outdirLine}${dynamodbLine}${cognitoLine}
147
+ });`;
148
+ }
149
+ /**
150
+ * Generates the FndFrontendProject instantiation code.
151
+ */
152
+ function generateFrontendProjectCode(parentVar, options) {
153
+ const outdirLine = options.outdir ? `\n outdir: '${options.outdir}',` : '';
154
+ const authLine = options.auth === false ? '\n auth: false,' : '';
155
+ const portLine = options.port && options.port !== 3000 ? `\n port: ${options.port},` : '';
156
+ const themeLine = options.theme && options.theme !== 'zinc' ? `\n shadcnTheme: '${options.theme}',` : '';
157
+ return `new FndFrontendProject({
158
+ parent: ${parentVar},
159
+ name: '${options.name}',
160
+ api: ${options.api},${outdirLine}${authLine}${portLine}${themeLine}
161
+ });`;
162
+ }
163
+ /**
164
+ * Generates the FndCmsProject instantiation code.
165
+ */
166
+ function generateCmsProjectCode(parentVar, options) {
167
+ const outdirLine = options.outdir ? `\n outdir: '${options.outdir}',` : '';
168
+ const portLine = options.port && options.port !== 3001 ? `\n port: ${options.port},` : '';
169
+ const mediaUploadLine = options.mediaUpload === false ? '\n mediaUpload: false,' : '';
170
+ const richTextEditorLine = options.richTextEditor && options.richTextEditor !== 'tiptap'
171
+ ? `\n richTextEditor: '${options.richTextEditor}',`
172
+ : '';
173
+ const themeLine = options.theme && options.theme !== 'zinc' ? `\n shadcnTheme: '${options.theme}',` : '';
174
+ return `new FndCmsProject({
175
+ parent: ${parentVar},
176
+ name: '${options.name}',
177
+ api: ${options.api},${outdirLine}${portLine}${mediaUploadLine}${richTextEditorLine}${themeLine}
178
+ });`;
179
+ }
180
+ /**
181
+ * Generates the FndComponentLibraryProject instantiation code.
182
+ */
183
+ function generateComponentLibraryProjectCode(parentVar, options) {
184
+ const outdirLine = options.outdir ? `\n outdir: '${options.outdir}',` : '';
185
+ const portLine = options.port && options.port !== 6006 ? `\n storybookPort: ${options.port},` : '';
186
+ return `new FndComponentLibraryProject({
187
+ parent: ${parentVar},
188
+ name: '${options.name}',${outdirLine}${portLine}
189
+ });`;
190
+ }
191
+ /**
192
+ * Modifies .projenrc.ts to add a package.
193
+ */
194
+ function modifyProjenrc(content, options) {
195
+ const lines = content.split('\n');
196
+ const result = [];
197
+ const projectVarName = extractProjectVarName(content);
198
+ let addedImport = false;
199
+ let insertedProject = false;
200
+ // Determine import and code based on package type
201
+ let importStatement;
202
+ let projectCode;
203
+ let importSource;
204
+ switch (options.type) {
205
+ case 'api':
206
+ importStatement = "import { FndApiProject } from '@fnd-platform/api';";
207
+ importSource = '@fnd-platform/api';
208
+ projectCode = generateApiProjectCode(projectVarName, options);
209
+ break;
210
+ case 'frontend':
211
+ importStatement = "import { FndFrontendProject } from '@fnd-platform/frontend';";
212
+ importSource = '@fnd-platform/frontend';
213
+ projectCode = generateFrontendProjectCode(projectVarName, options);
214
+ break;
215
+ case 'cms':
216
+ importStatement = "import { FndCmsProject } from '@fnd-platform/cms';";
217
+ importSource = '@fnd-platform/cms';
218
+ projectCode = generateCmsProjectCode(projectVarName, options);
219
+ break;
220
+ case 'component-library':
221
+ importStatement = "import { FndComponentLibraryProject } from '@fnd-platform/component-library';";
222
+ importSource = '@fnd-platform/component-library';
223
+ projectCode = generateComponentLibraryProjectCode(projectVarName, options);
224
+ break;
225
+ default:
226
+ throw new Error(`Unknown package type: ${options.type}`);
227
+ }
228
+ // Check if import already exists
229
+ if (content.includes(importSource)) {
230
+ addedImport = true;
231
+ }
232
+ for (let i = 0; i < lines.length; i++) {
233
+ const line = lines[i];
234
+ // Add import after last @fnd-platform import
235
+ if (!addedImport &&
236
+ (line.includes("from '@fnd-platform/cms'") ||
237
+ line.includes("from '@fnd-platform/frontend'") ||
238
+ line.includes("from '@fnd-platform/api'") ||
239
+ line.includes("from '@fnd-platform/core'") ||
240
+ line.includes("from '@fnd-platform/component-library'"))) {
241
+ result.push(line);
242
+ const nextLine = lines[i + 1] || '';
243
+ if (!nextLine.includes("from '@fnd-platform/")) {
244
+ result.push(importStatement);
245
+ addedImport = true;
246
+ }
247
+ continue;
248
+ }
249
+ // Insert project before synth() call
250
+ if (!insertedProject && line.includes('.synth()')) {
251
+ result.push('');
252
+ result.push(projectCode);
253
+ result.push('');
254
+ insertedProject = true;
255
+ }
256
+ result.push(line);
257
+ }
258
+ // If we didn't find synth(), append at the end
259
+ if (!insertedProject) {
260
+ result.push('');
261
+ result.push(projectCode);
262
+ result.push('');
263
+ result.push(`${projectVarName}.synth();`);
264
+ }
265
+ return result.join('\n');
266
+ }
267
+ /**
268
+ * Adds a devDependency to the root package.json using pnpm.
269
+ */
270
+ async function addDevDependency(projectRoot, packageName) {
271
+ const fullPackageName = `${packageName}@${FND_PACKAGE_VERSION}`;
272
+ try {
273
+ execSync(`pnpm add -D -w ${fullPackageName}`, {
274
+ cwd: projectRoot,
275
+ stdio: 'pipe',
276
+ });
277
+ }
278
+ catch {
279
+ // If pnpm fails, try npm
280
+ try {
281
+ execSync(`npm install --save-dev ${fullPackageName}`, {
282
+ cwd: projectRoot,
283
+ stdio: 'pipe',
284
+ });
285
+ }
286
+ catch {
287
+ // Non-fatal, user can add manually
288
+ }
289
+ }
290
+ }
291
+ /**
292
+ * Adds a package in TUI mode.
293
+ *
294
+ * Unlike the CLI version, this function:
295
+ * - Does NOT call process.exit()
296
+ * - Reports progress via callback
297
+ * - Returns result object
298
+ *
299
+ * @param options - Package addition options
300
+ * @param onProgress - Progress callback
301
+ * @returns Result indicating success or failure
302
+ */
303
+ export async function addPackageForTUI(options, onProgress) {
304
+ // Find project root
305
+ const projectRoot = findProjectRoot();
306
+ if (!projectRoot) {
307
+ onProgress({ step: 'error', message: 'Not in an fnd-platform project' });
308
+ return { success: false, error: 'Not inside an fnd-platform project' };
309
+ }
310
+ const projenrcPath = join(projectRoot, '.projenrc.ts');
311
+ // Step 1: Validate
312
+ onProgress({ step: 'validating', message: 'Validating configuration...' });
313
+ // Validate package name
314
+ const validation = validatePackageName(options.name);
315
+ if (!validation.valid) {
316
+ onProgress({ step: 'error', message: validation.error || 'Invalid package name' });
317
+ return { success: false, error: validation.error };
318
+ }
319
+ // Check if package already exists
320
+ if (checkPackageExists(projectRoot, options.name)) {
321
+ const error = `Package '${options.name}' already exists`;
322
+ onProgress({ step: 'error', message: error });
323
+ return { success: false, error };
324
+ }
325
+ // Read existing .projenrc.ts
326
+ let existingContent;
327
+ try {
328
+ existingContent = readFileSync(projenrcPath, 'utf-8');
329
+ }
330
+ catch {
331
+ const error = '.projenrc.ts not found';
332
+ onProgress({ step: 'error', message: error });
333
+ return { success: false, error };
334
+ }
335
+ // For frontend/cms, validate API package exists
336
+ if (options.type === 'frontend' || options.type === 'cms') {
337
+ if (!options.api) {
338
+ const error = 'API package name is required for frontend/cms packages';
339
+ onProgress({ step: 'error', message: error });
340
+ return { success: false, error };
341
+ }
342
+ if (!checkApiInProjenrc(existingContent, options.api)) {
343
+ const error = `API package '${options.api}' not found in .projenrc.ts`;
344
+ onProgress({ step: 'error', message: error });
345
+ return { success: false, error };
346
+ }
347
+ }
348
+ // Check for duplicate project type import (warn but continue)
349
+ const typeClassName = getProjectClassName(options.type);
350
+ if (existingContent.includes(typeClassName)) {
351
+ // Package type already exists, but we can still add another instance
352
+ }
353
+ try {
354
+ // Step 2: Modify .projenrc.ts
355
+ onProgress({ step: 'modifying-projenrc', message: 'Updating .projenrc.ts...' });
356
+ const newContent = modifyProjenrc(existingContent, options);
357
+ writeFileSync(projenrcPath, newContent);
358
+ // Step 3: Install dependencies
359
+ onProgress({ step: 'installing-deps', message: 'Installing dependencies...' });
360
+ const packageNameForDep = getPackageNameForType(options.type);
361
+ await addDevDependency(projectRoot, packageNameForDep);
362
+ // Step 4: Generate infrastructure (for api, frontend, cms)
363
+ onProgress({ step: 'generating-infra', message: 'Generating infrastructure...' });
364
+ const projectName = extractProjectNameFromContent(existingContent);
365
+ if (options.type === 'api') {
366
+ generateInfraPackage({
367
+ projectRoot,
368
+ projectName,
369
+ apiPackageName: options.name,
370
+ });
371
+ }
372
+ else if (options.type === 'frontend' && options.api) {
373
+ try {
374
+ await generateFrontendStack({
375
+ projectPath: projectRoot,
376
+ projectName,
377
+ apiName: options.api,
378
+ frontendName: options.name,
379
+ });
380
+ }
381
+ catch {
382
+ // Non-fatal for frontend stack
383
+ }
384
+ }
385
+ else if (options.type === 'cms' && options.api) {
386
+ try {
387
+ await generateCmsStack({
388
+ projectPath: projectRoot,
389
+ projectName,
390
+ apiName: options.api,
391
+ cmsName: options.name,
392
+ });
393
+ }
394
+ catch {
395
+ // Non-fatal for cms stack
396
+ }
397
+ }
398
+ // Step 5: Run synth (optional, non-blocking)
399
+ onProgress({ step: 'running-synth', message: 'Running Projen synthesis...' });
400
+ try {
401
+ execSync('pnpm exec projen', { cwd: projectRoot, stdio: 'pipe' });
402
+ }
403
+ catch {
404
+ // Synth failure is non-fatal in TUI mode
405
+ // User can run it manually
406
+ }
407
+ // Complete
408
+ onProgress({ step: 'complete', message: 'Package added successfully!' });
409
+ return { success: true, packageName: options.name };
410
+ }
411
+ catch (error) {
412
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
413
+ onProgress({ step: 'error', message: errorMessage });
414
+ return { success: false, error: errorMessage };
415
+ }
416
+ }
417
+ /**
418
+ * Gets the project class name for a package type.
419
+ */
420
+ function getProjectClassName(type) {
421
+ switch (type) {
422
+ case 'api':
423
+ return 'FndApiProject';
424
+ case 'frontend':
425
+ return 'FndFrontendProject';
426
+ case 'cms':
427
+ return 'FndCmsProject';
428
+ case 'component-library':
429
+ return 'FndComponentLibraryProject';
430
+ }
431
+ }
432
+ /**
433
+ * Gets the npm package name for a package type.
434
+ */
435
+ function getPackageNameForType(type) {
436
+ switch (type) {
437
+ case 'api':
438
+ return '@fnd-platform/api';
439
+ case 'frontend':
440
+ return '@fnd-platform/frontend';
441
+ case 'cms':
442
+ return '@fnd-platform/cms';
443
+ case 'component-library':
444
+ return '@fnd-platform/component-library';
445
+ }
446
+ }
447
+ /**
448
+ * Gets the display label for a package type.
449
+ */
450
+ export function getPackageTypeLabel(type) {
451
+ switch (type) {
452
+ case 'api':
453
+ return 'API';
454
+ case 'frontend':
455
+ return 'Frontend';
456
+ case 'cms':
457
+ return 'CMS';
458
+ case 'component-library':
459
+ return 'Component Library';
460
+ }
461
+ }
462
+ /**
463
+ * Gets the description for a package type.
464
+ */
465
+ export function getPackageTypeDescription(type) {
466
+ switch (type) {
467
+ case 'api':
468
+ return 'Backend Lambda functions with DynamoDB';
469
+ case 'frontend':
470
+ return 'Remix app with SSR and authentication';
471
+ case 'cms':
472
+ return 'Content management admin interface';
473
+ case 'component-library':
474
+ return 'Storybook component library';
475
+ }
476
+ }
477
+ /**
478
+ * Gets the default port for a package type.
479
+ */
480
+ export function getDefaultPort(type) {
481
+ switch (type) {
482
+ case 'frontend':
483
+ return 3000;
484
+ case 'cms':
485
+ return 3001;
486
+ case 'component-library':
487
+ return 6006;
488
+ default:
489
+ return 3000;
490
+ }
491
+ }
492
+ //# sourceMappingURL=add-package-tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-package-tui.js","sourceRoot":"","sources":["../../../src/tui/lib/add-package-tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * TUI-compatible project creation module.
3
+ *
4
+ * Adapted from the CLI new command to work with the TUI:
5
+ * - Does NOT call process.exit()
6
+ * - Reports progress via callback
7
+ * - Returns result object for handling by the UI
8
+ */
9
+ /**
10
+ * Valid project name pattern: lowercase alphanumeric with hyphens.
11
+ * Must start with a letter.
12
+ */
13
+ export declare const PROJECT_NAME_PATTERN: RegExp;
14
+ /**
15
+ * Options for creating a project.
16
+ */
17
+ export interface CreateProjectOptions {
18
+ /** Project name */
19
+ name: string;
20
+ /** Package manager to use */
21
+ packageManager: 'pnpm' | 'yarn';
22
+ /** Whether to initialize git */
23
+ git: boolean;
24
+ /** Whether to install dependencies */
25
+ install: boolean;
26
+ /** Whether to create in current directory (TUI mode) instead of a subdirectory */
27
+ useCurrentDirectory?: boolean;
28
+ }
29
+ /**
30
+ * Result of project creation.
31
+ */
32
+ export interface CreateProjectResult {
33
+ /** Whether creation succeeded */
34
+ success: boolean;
35
+ /** Path to created project (if successful) */
36
+ projectPath?: string;
37
+ /** Error message (if failed) */
38
+ error?: string;
39
+ }
40
+ /**
41
+ * Creation step identifiers.
42
+ */
43
+ export type CreationStep = 'idle' | 'creating-directory' | 'writing-files' | 'initializing-git' | 'installing-deps' | 'running-projen' | 'complete' | 'error';
44
+ /**
45
+ * Progress update during creation.
46
+ */
47
+ export interface CreationProgress {
48
+ /** Current step */
49
+ step: CreationStep;
50
+ /** Human-readable message */
51
+ message: string;
52
+ }
53
+ /**
54
+ * Validates a project name.
55
+ *
56
+ * @param name - The project name to validate
57
+ * @returns Validation result with error message if invalid
58
+ */
59
+ export declare function validateProjectName(name: string): {
60
+ valid: boolean;
61
+ error?: string;
62
+ };
63
+ /**
64
+ * Checks the status of a directory for project creation.
65
+ *
66
+ * @param name - The project name (directory name)
67
+ * @returns Directory status
68
+ */
69
+ export declare function checkDirectory(name: string): {
70
+ exists: boolean;
71
+ empty: boolean;
72
+ };
73
+ /**
74
+ * Checks if the current directory is empty or contains only hidden files.
75
+ *
76
+ * @returns True if current directory is empty/suitable for project creation
77
+ */
78
+ export declare function isCurrentDirectoryEmpty(): boolean;
79
+ /**
80
+ * Creates a project in TUI mode.
81
+ *
82
+ * Unlike the CLI version, this function:
83
+ * - Does NOT call process.exit()
84
+ * - Reports progress via callback
85
+ * - Cleans up on failure and returns error result
86
+ *
87
+ * @param options - Project creation options
88
+ * @param onProgress - Progress callback
89
+ * @returns Result indicating success or failure
90
+ */
91
+ export declare function createProjectForTUI(options: CreateProjectOptions, onProgress: (progress: CreationProgress) => void): Promise<CreateProjectResult>;
92
+ //# sourceMappingURL=create-project-tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project-tui.d.ts","sourceRoot":"","sources":["../../../src/tui/lib/create-project-tui.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,gCAAgC;IAChC,GAAG,EAAE,OAAO,CAAC;IACb,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,oBAAoB,GACpB,eAAe,GACf,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,UAAU,GACV,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBpF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAahF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CASjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAC/C,OAAO,CAAC,mBAAmB,CAAC,CAoG9B"}