@idealyst/cli 1.2.0 → 1.2.1

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 (324) hide show
  1. package/dist/commands/add.js +233 -0
  2. package/dist/commands/add.js.map +1 -0
  3. package/dist/commands/index.js +13 -0
  4. package/dist/commands/index.js.map +1 -0
  5. package/dist/commands/info.js +193 -0
  6. package/dist/commands/info.js.map +1 -0
  7. package/dist/commands/init.js +155 -0
  8. package/dist/commands/init.js.map +1 -0
  9. package/dist/constants.js +119 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/generators/core/index.js +23 -0
  12. package/dist/generators/core/index.js.map +1 -0
  13. package/dist/generators/core/mobile.js +286 -0
  14. package/dist/generators/core/mobile.js.map +1 -0
  15. package/dist/generators/core/shared.js +207 -0
  16. package/dist/generators/core/shared.js.map +1 -0
  17. package/dist/generators/core/web.js +377 -0
  18. package/dist/generators/core/web.js.map +1 -0
  19. package/dist/generators/extensions/api.js +223 -0
  20. package/dist/generators/extensions/api.js.map +1 -0
  21. package/dist/generators/extensions/devcontainer.js +510 -0
  22. package/dist/generators/extensions/devcontainer.js.map +1 -0
  23. package/dist/generators/extensions/graphql.js +202 -0
  24. package/dist/generators/extensions/graphql.js.map +1 -0
  25. package/dist/generators/extensions/index.js +17 -0
  26. package/dist/generators/extensions/index.js.map +1 -0
  27. package/dist/generators/extensions/prisma.js +249 -0
  28. package/dist/generators/extensions/prisma.js.map +1 -0
  29. package/dist/generators/extensions/trpc.js +258 -0
  30. package/dist/generators/extensions/trpc.js.map +1 -0
  31. package/dist/generators/index.js +106 -4
  32. package/dist/generators/index.js.map +1 -1
  33. package/dist/generators/reactNative.js +177 -0
  34. package/dist/generators/reactNative.js.map +1 -0
  35. package/dist/generators/workspace.js +272 -0
  36. package/dist/generators/workspace.js.map +1 -0
  37. package/dist/identifiers/android.js +75 -0
  38. package/dist/identifiers/android.js.map +1 -0
  39. package/dist/identifiers/index.js +35 -0
  40. package/dist/identifiers/index.js.map +1 -0
  41. package/dist/identifiers/ios.js +65 -0
  42. package/dist/identifiers/ios.js.map +1 -0
  43. package/dist/index.js +41 -319
  44. package/dist/index.js.map +1 -1
  45. package/dist/templates/copier.js +135 -0
  46. package/dist/templates/copier.js.map +1 -0
  47. package/dist/templates/index.js +23 -0
  48. package/dist/templates/index.js.map +1 -0
  49. package/dist/templates/merger.js +113 -0
  50. package/dist/templates/merger.js.map +1 -0
  51. package/dist/templates/processor.js +142 -0
  52. package/dist/templates/processor.js.map +1 -0
  53. package/dist/types/commands/add.d.ts +14 -0
  54. package/dist/types/commands/index.d.ts +6 -0
  55. package/dist/types/commands/info.d.ts +10 -0
  56. package/dist/types/commands/init.d.ts +19 -0
  57. package/dist/types/constants.d.ts +76 -0
  58. package/dist/types/generators/core/index.d.ts +6 -0
  59. package/dist/types/generators/core/mobile.d.ts +13 -0
  60. package/dist/types/generators/core/shared.d.ts +8 -0
  61. package/dist/types/generators/core/web.d.ts +8 -0
  62. package/dist/types/generators/extensions/api.d.ts +8 -0
  63. package/dist/types/generators/extensions/devcontainer.d.ts +15 -0
  64. package/dist/types/generators/extensions/graphql.d.ts +8 -0
  65. package/dist/types/generators/extensions/index.d.ts +8 -0
  66. package/dist/types/generators/extensions/prisma.d.ts +8 -0
  67. package/dist/types/generators/extensions/trpc.d.ts +9 -0
  68. package/dist/types/generators/index.d.ts +11 -3
  69. package/dist/types/generators/reactNative.d.ts +19 -0
  70. package/dist/types/generators/workspace.d.ts +8 -0
  71. package/dist/types/identifiers/android.d.ts +26 -0
  72. package/dist/types/identifiers/index.d.ts +26 -0
  73. package/dist/types/identifiers/ios.d.ts +21 -0
  74. package/dist/types/index.d.ts +3 -0
  75. package/dist/types/templates/copier.d.ts +24 -0
  76. package/dist/types/templates/index.d.ts +6 -0
  77. package/dist/types/templates/merger.d.ts +43 -0
  78. package/dist/types/templates/processor.d.ts +39 -0
  79. package/dist/types/types.d.ts +153 -5
  80. package/dist/types/utils/filesystem.d.ts +56 -0
  81. package/dist/types/utils/index.d.ts +7 -0
  82. package/dist/types/utils/logger.d.ts +58 -0
  83. package/dist/types/utils/shell.d.ts +35 -0
  84. package/dist/types/utils/validation.d.ts +32 -0
  85. package/dist/types/wizard/index.d.ts +20 -0
  86. package/dist/types/wizard/steps/apiExtension.d.ts +5 -0
  87. package/dist/types/wizard/steps/appDisplayName.d.ts +5 -0
  88. package/dist/types/wizard/steps/devcontainerExtension.d.ts +5 -0
  89. package/dist/types/wizard/steps/graphqlExtension.d.ts +5 -0
  90. package/dist/types/wizard/steps/index.d.ts +12 -0
  91. package/dist/types/wizard/steps/orgDomain.d.ts +5 -0
  92. package/dist/types/wizard/steps/prismaExtension.d.ts +5 -0
  93. package/dist/types/wizard/steps/projectName.d.ts +5 -0
  94. package/dist/types/wizard/steps/summary.d.ts +5 -0
  95. package/dist/types/wizard/steps/trpcExtension.d.ts +5 -0
  96. package/dist/types/wizard/validators.d.ts +17 -0
  97. package/dist/types.js +41 -0
  98. package/dist/types.js.map +1 -1
  99. package/dist/utils/filesystem.js +173 -0
  100. package/dist/utils/filesystem.js.map +1 -0
  101. package/dist/utils/index.js +24 -0
  102. package/dist/utils/index.js.map +1 -0
  103. package/dist/utils/logger.js +95 -0
  104. package/dist/utils/logger.js.map +1 -0
  105. package/dist/utils/shell.js +113 -0
  106. package/dist/utils/shell.js.map +1 -0
  107. package/dist/utils/validation.js +196 -0
  108. package/dist/utils/validation.js.map +1 -0
  109. package/dist/wizard/index.js +177 -0
  110. package/dist/wizard/index.js.map +1 -0
  111. package/dist/wizard/steps/apiExtension.js +33 -0
  112. package/dist/wizard/steps/apiExtension.js.map +1 -0
  113. package/dist/wizard/steps/appDisplayName.js +53 -0
  114. package/dist/wizard/steps/appDisplayName.js.map +1 -0
  115. package/dist/wizard/steps/devcontainerExtension.js +78 -0
  116. package/dist/wizard/steps/devcontainerExtension.js.map +1 -0
  117. package/dist/wizard/steps/graphqlExtension.js +37 -0
  118. package/dist/wizard/steps/graphqlExtension.js.map +1 -0
  119. package/dist/wizard/steps/index.js +25 -0
  120. package/dist/wizard/steps/index.js.map +1 -0
  121. package/dist/wizard/steps/orgDomain.js +40 -0
  122. package/dist/wizard/steps/orgDomain.js.map +1 -0
  123. package/dist/wizard/steps/prismaExtension.js +33 -0
  124. package/dist/wizard/steps/prismaExtension.js.map +1 -0
  125. package/dist/wizard/steps/projectName.js +40 -0
  126. package/dist/wizard/steps/projectName.js.map +1 -0
  127. package/dist/wizard/steps/summary.js +107 -0
  128. package/dist/wizard/steps/summary.js.map +1 -0
  129. package/dist/wizard/steps/trpcExtension.js +37 -0
  130. package/dist/wizard/steps/trpcExtension.js.map +1 -0
  131. package/dist/wizard/validators.js +35 -0
  132. package/dist/wizard/validators.js.map +1 -0
  133. package/package.json +6 -19
  134. package/README.md +0 -110
  135. package/dist/generators/init.js +0 -268
  136. package/dist/generators/init.js.map +0 -1
  137. package/dist/generators/utils.js +0 -682
  138. package/dist/generators/utils.js.map +0 -1
  139. package/dist/scripts/configure-react-native-monorepo.js +0 -144
  140. package/dist/scripts/configure-react-native-monorepo.js.map +0 -1
  141. package/dist/template/.devcontainer/Dockerfile +0 -26
  142. package/dist/template/.devcontainer/devcontainer.json +0 -113
  143. package/dist/template/.devcontainer/docker-compose.yml +0 -59
  144. package/dist/template/.devcontainer/figma-mcp.sh +0 -32
  145. package/dist/template/.devcontainer/gitignore.template +0 -2
  146. package/dist/template/.devcontainer/setup.sh +0 -45
  147. package/dist/template/DOCKER.md +0 -0
  148. package/dist/template/Dockerfile +0 -111
  149. package/dist/template/README.md +0 -233
  150. package/dist/template/docker/nginx/prod.conf +0 -238
  151. package/dist/template/docker/nginx.conf +0 -131
  152. package/dist/template/docker/postgres/init.sql +0 -41
  153. package/dist/template/docker/prometheus/prometheus.yml +0 -52
  154. package/dist/template/docker-compose.prod.yml +0 -146
  155. package/dist/template/docker-compose.yml +0 -143
  156. package/dist/template/dockerignore.template +0 -151
  157. package/dist/template/env.example.template +0 -36
  158. package/dist/template/gitignore.template +0 -56
  159. package/dist/template/jest.config.js +0 -20
  160. package/dist/template/mcp.json.template +0 -8
  161. package/dist/template/package.json +0 -45
  162. package/dist/template/packages/api/README.md +0 -510
  163. package/dist/template/packages/api/__tests__/api.test.ts +0 -26
  164. package/dist/template/packages/api/env.example.template +0 -6
  165. package/dist/template/packages/api/gitignore.template +0 -35
  166. package/dist/template/packages/api/jest.config.js +0 -23
  167. package/dist/template/packages/api/jest.setup.js +0 -9
  168. package/dist/template/packages/api/package.json +0 -66
  169. package/dist/template/packages/api/src/context.ts +0 -52
  170. package/dist/template/packages/api/src/controllers/TestController.ts +0 -0
  171. package/dist/template/packages/api/src/graphql/builder.ts +0 -75
  172. package/dist/template/packages/api/src/graphql/generated.ts +0 -64
  173. package/dist/template/packages/api/src/graphql/index.ts +0 -75
  174. package/dist/template/packages/api/src/graphql/types/index.ts +0 -44
  175. package/dist/template/packages/api/src/graphql/types/test.ts +0 -245
  176. package/dist/template/packages/api/src/index.ts +0 -26
  177. package/dist/template/packages/api/src/lib/database.ts +0 -23
  178. package/dist/template/packages/api/src/router/index.ts +0 -163
  179. package/dist/template/packages/api/src/routers/test.ts +0 -161
  180. package/dist/template/packages/api/src/server.ts +0 -68
  181. package/dist/template/packages/api/src/trpc.ts +0 -28
  182. package/dist/template/packages/api/tsconfig.json +0 -44
  183. package/dist/template/packages/database/README.md +0 -162
  184. package/dist/template/packages/database/gitignore.template +0 -41
  185. package/dist/template/packages/database/package.json +0 -49
  186. package/dist/template/packages/database/prisma/seed.ts +0 -64
  187. package/dist/template/packages/database/schema.prisma +0 -107
  188. package/dist/template/packages/database/src/index.ts +0 -15
  189. package/dist/template/packages/database/src/validators.ts +0 -10
  190. package/dist/template/packages/database/tsconfig.json +0 -18
  191. package/dist/template/packages/mobile/README.md +0 -86
  192. package/dist/template/packages/mobile/__tests__/App.test.tsx +0 -156
  193. package/dist/template/packages/mobile/__tests__/components.test.tsx +0 -300
  194. package/dist/template/packages/mobile/app.json +0 -5
  195. package/dist/template/packages/mobile/babel.config.js +0 -10
  196. package/dist/template/packages/mobile/gitignore.template +0 -73
  197. package/dist/template/packages/mobile/index.js +0 -6
  198. package/dist/template/packages/mobile/jest.config.js +0 -21
  199. package/dist/template/packages/mobile/jest.setup.js +0 -12
  200. package/dist/template/packages/mobile/metro.config.js +0 -36
  201. package/dist/template/packages/mobile/package.json +0 -60
  202. package/dist/template/packages/mobile/src/App.tsx +0 -8
  203. package/dist/template/packages/mobile/src/utils/trpc.ts +0 -7
  204. package/dist/template/packages/mobile/tsconfig.json +0 -28
  205. package/dist/template/packages/shared/README.md +0 -135
  206. package/dist/template/packages/shared/__tests__/shared.test.ts +0 -51
  207. package/dist/template/packages/shared/gitignore.template +0 -35
  208. package/dist/template/packages/shared/jest.config.js +0 -22
  209. package/dist/template/packages/shared/package.json +0 -68
  210. package/dist/template/packages/shared/src/components/App.tsx +0 -57
  211. package/dist/template/packages/shared/src/components/HelloWorld.tsx +0 -531
  212. package/dist/template/packages/shared/src/components/index.ts +0 -1
  213. package/dist/template/packages/shared/src/graphql/client.ts +0 -34
  214. package/dist/template/packages/shared/src/index.ts +0 -22
  215. package/dist/template/packages/shared/src/navigation/AppRouter.tsx +0 -565
  216. package/dist/template/packages/shared/src/trpc/client.ts +0 -44
  217. package/dist/template/packages/shared/tsconfig.json +0 -22
  218. package/dist/template/packages/web/README.md +0 -131
  219. package/dist/template/packages/web/__tests__/App.test.tsx +0 -342
  220. package/dist/template/packages/web/__tests__/components.test.tsx +0 -564
  221. package/dist/template/packages/web/gitignore.template +0 -35
  222. package/dist/template/packages/web/index.html +0 -13
  223. package/dist/template/packages/web/jest.config.js +0 -27
  224. package/dist/template/packages/web/jest.setup.js +0 -24
  225. package/dist/template/packages/web/package.json +0 -69
  226. package/dist/template/packages/web/src/App.tsx +0 -14
  227. package/dist/template/packages/web/src/components/TestDemo.tsx +0 -164
  228. package/dist/template/packages/web/src/main.tsx +0 -25
  229. package/dist/template/packages/web/src/utils/trpc.ts +0 -7
  230. package/dist/template/packages/web/tsconfig.json +0 -26
  231. package/dist/template/packages/web/vite.config.ts +0 -98
  232. package/dist/template/setup.sh +0 -30
  233. package/dist/template/tsconfig.json +0 -22
  234. package/dist/template/yarnrc.yml.template +0 -4
  235. package/dist/types/generators/init.d.ts +0 -5
  236. package/dist/types/generators/utils.d.ts +0 -45
  237. package/dist/types/scripts/configure-react-native-monorepo.d.ts +0 -23
  238. package/template/.devcontainer/Dockerfile +0 -26
  239. package/template/.devcontainer/devcontainer.json +0 -113
  240. package/template/.devcontainer/docker-compose.yml +0 -59
  241. package/template/.devcontainer/figma-mcp.sh +0 -32
  242. package/template/.devcontainer/setup.sh +0 -45
  243. package/template/.dockerignore +0 -151
  244. package/template/.env.example +0 -36
  245. package/template/.env.production +0 -56
  246. package/template/DOCKER.md +0 -0
  247. package/template/Dockerfile +0 -111
  248. package/template/README.md +0 -233
  249. package/template/docker/nginx/prod.conf +0 -238
  250. package/template/docker/nginx.conf +0 -131
  251. package/template/docker/postgres/init.sql +0 -41
  252. package/template/docker/prometheus/prometheus.yml +0 -52
  253. package/template/docker-compose.prod.yml +0 -146
  254. package/template/docker-compose.yml +0 -143
  255. package/template/jest.config.js +0 -20
  256. package/template/package.json +0 -45
  257. package/template/packages/api/.env.example +0 -6
  258. package/template/packages/api/README.md +0 -510
  259. package/template/packages/api/__tests__/api.test.ts +0 -26
  260. package/template/packages/api/jest.config.js +0 -23
  261. package/template/packages/api/jest.setup.js +0 -9
  262. package/template/packages/api/package.json +0 -66
  263. package/template/packages/api/src/context.ts +0 -52
  264. package/template/packages/api/src/controllers/TestController.ts +0 -0
  265. package/template/packages/api/src/graphql/builder.ts +0 -75
  266. package/template/packages/api/src/graphql/generated.ts +0 -64
  267. package/template/packages/api/src/graphql/index.ts +0 -75
  268. package/template/packages/api/src/graphql/types/index.ts +0 -44
  269. package/template/packages/api/src/graphql/types/test.ts +0 -245
  270. package/template/packages/api/src/index.ts +0 -26
  271. package/template/packages/api/src/lib/database.ts +0 -23
  272. package/template/packages/api/src/router/index.ts +0 -163
  273. package/template/packages/api/src/routers/test.ts +0 -161
  274. package/template/packages/api/src/server.ts +0 -68
  275. package/template/packages/api/src/trpc.ts +0 -28
  276. package/template/packages/api/tsconfig.json +0 -44
  277. package/template/packages/database/README.md +0 -162
  278. package/template/packages/database/package.json +0 -49
  279. package/template/packages/database/prisma/seed.ts +0 -64
  280. package/template/packages/database/schema.prisma +0 -107
  281. package/template/packages/database/src/index.ts +0 -15
  282. package/template/packages/database/src/validators.ts +0 -10
  283. package/template/packages/database/tsconfig.json +0 -18
  284. package/template/packages/mobile/README.md +0 -86
  285. package/template/packages/mobile/__tests__/App.test.tsx +0 -156
  286. package/template/packages/mobile/__tests__/components.test.tsx +0 -300
  287. package/template/packages/mobile/app.json +0 -5
  288. package/template/packages/mobile/babel.config.js +0 -26
  289. package/template/packages/mobile/index.js +0 -8
  290. package/template/packages/mobile/jest.config.js +0 -21
  291. package/template/packages/mobile/jest.setup.js +0 -12
  292. package/template/packages/mobile/metro.config.js +0 -36
  293. package/template/packages/mobile/package.json +0 -60
  294. package/template/packages/mobile/src/App.tsx +0 -8
  295. package/template/packages/mobile/src/utils/trpc.ts +0 -7
  296. package/template/packages/mobile/tsconfig.json +0 -28
  297. package/template/packages/shared/README.md +0 -135
  298. package/template/packages/shared/__tests__/shared.test.ts +0 -51
  299. package/template/packages/shared/jest.config.js +0 -22
  300. package/template/packages/shared/package.json +0 -68
  301. package/template/packages/shared/src/components/App.tsx +0 -57
  302. package/template/packages/shared/src/components/HelloWorld.tsx +0 -531
  303. package/template/packages/shared/src/components/index.ts +0 -1
  304. package/template/packages/shared/src/graphql/client.ts +0 -34
  305. package/template/packages/shared/src/index.ts +0 -25
  306. package/template/packages/shared/src/navigation/AppRouter.tsx +0 -565
  307. package/template/packages/shared/src/trpc/client.ts +0 -44
  308. package/template/packages/shared/src/unistyles.ts +0 -50
  309. package/template/packages/shared/tsconfig.json +0 -22
  310. package/template/packages/web/README.md +0 -131
  311. package/template/packages/web/__tests__/App.test.tsx +0 -342
  312. package/template/packages/web/__tests__/components.test.tsx +0 -564
  313. package/template/packages/web/index.html +0 -13
  314. package/template/packages/web/jest.config.js +0 -27
  315. package/template/packages/web/jest.setup.js +0 -24
  316. package/template/packages/web/package.json +0 -69
  317. package/template/packages/web/src/App.tsx +0 -14
  318. package/template/packages/web/src/components/TestDemo.tsx +0 -164
  319. package/template/packages/web/src/main.tsx +0 -27
  320. package/template/packages/web/src/utils/trpc.ts +0 -7
  321. package/template/packages/web/tsconfig.json +0 -26
  322. package/template/packages/web/vite.config.ts +0 -114
  323. package/template/setup.sh +0 -30
  324. package/template/tsconfig.json +0 -22
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ /**
3
+ * File system utilities for template copying and file operations
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.shouldIgnore = shouldIgnore;
10
+ exports.shouldProcessTemplate = shouldProcessTemplate;
11
+ exports.processTemplateContent = processTemplateContent;
12
+ exports.copyTemplate = copyTemplate;
13
+ exports.ensureDir = ensureDir;
14
+ exports.pathExists = pathExists;
15
+ exports.readJson = readJson;
16
+ exports.writeJson = writeJson;
17
+ exports.readFile = readFile;
18
+ exports.writeFile = writeFile;
19
+ exports.copyFile = copyFile;
20
+ exports.remove = remove;
21
+ exports.getTemplatePath = getTemplatePath;
22
+ const fs_extra_1 = __importDefault(require("fs-extra"));
23
+ const path_1 = __importDefault(require("path"));
24
+ const constants_1 = require("../constants");
25
+ /**
26
+ * Check if a path matches any ignore patterns
27
+ */
28
+ function shouldIgnore(filePath) {
29
+ const basename = path_1.default.basename(filePath);
30
+ for (const pattern of constants_1.IGNORE_PATTERNS) {
31
+ if (pattern.includes('*')) {
32
+ // Simple glob matching for *.ext patterns
33
+ const regex = new RegExp('^' + pattern.replace('*', '.*') + '$');
34
+ if (regex.test(basename)) {
35
+ return true;
36
+ }
37
+ }
38
+ else if (basename === pattern) {
39
+ return true;
40
+ }
41
+ }
42
+ return false;
43
+ }
44
+ /**
45
+ * Check if a file should have template variables processed
46
+ */
47
+ function shouldProcessTemplate(filePath) {
48
+ const ext = path_1.default.extname(filePath).toLowerCase();
49
+ return constants_1.TEMPLATE_EXTENSIONS.includes(ext);
50
+ }
51
+ /**
52
+ * Replace template variables in content
53
+ */
54
+ function processTemplateContent(content, data) {
55
+ let result = content;
56
+ // Replace all {{variable}} patterns
57
+ result = result.replace(/\{\{projectName\}\}/g, data.projectName);
58
+ result = result.replace(/\{\{packageName\}\}/g, data.packageName);
59
+ result = result.replace(/\{\{workspaceScope\}\}/g, data.workspaceScope);
60
+ result = result.replace(/\{\{version\}\}/g, data.version);
61
+ result = result.replace(/\{\{description\}\}/g, data.description);
62
+ result = result.replace(/\{\{appDisplayName\}\}/g, data.appDisplayName);
63
+ result = result.replace(/\{\{iosBundleId\}\}/g, data.iosBundleId);
64
+ result = result.replace(/\{\{androidPackageName\}\}/g, data.androidPackageName);
65
+ result = result.replace(/\{\{idealystVersion\}\}/g, data.idealystVersion);
66
+ // Boolean flags for conditional content
67
+ result = result.replace(/\{\{hasApi\}\}/g, String(data.hasApi));
68
+ result = result.replace(/\{\{hasPrisma\}\}/g, String(data.hasPrisma));
69
+ result = result.replace(/\{\{hasTrpc\}\}/g, String(data.hasTrpc));
70
+ result = result.replace(/\{\{hasGraphql\}\}/g, String(data.hasGraphql));
71
+ return result;
72
+ }
73
+ /**
74
+ * Copy a template directory with variable replacement
75
+ */
76
+ async function copyTemplate(sourceDir, destDir, data) {
77
+ // Ensure destination exists
78
+ await fs_extra_1.default.ensureDir(destDir);
79
+ const entries = await fs_extra_1.default.readdir(sourceDir, { withFileTypes: true });
80
+ for (const entry of entries) {
81
+ const sourcePath = path_1.default.join(sourceDir, entry.name);
82
+ let destName = entry.name;
83
+ // Handle .template suffix (for dotfiles)
84
+ if (destName.endsWith('.template')) {
85
+ destName = '.' + destName.replace('.template', '');
86
+ }
87
+ const destPath = path_1.default.join(destDir, destName);
88
+ // Skip ignored files/directories
89
+ if (shouldIgnore(entry.name)) {
90
+ continue;
91
+ }
92
+ if (entry.isDirectory()) {
93
+ // Recursively copy directory
94
+ await copyTemplate(sourcePath, destPath, data);
95
+ }
96
+ else {
97
+ // Copy file
98
+ if (shouldProcessTemplate(sourcePath)) {
99
+ // Read, process, and write
100
+ const content = await fs_extra_1.default.readFile(sourcePath, 'utf8');
101
+ const processed = processTemplateContent(content, data);
102
+ await fs_extra_1.default.writeFile(destPath, processed);
103
+ }
104
+ else {
105
+ // Binary file - copy directly
106
+ await fs_extra_1.default.copy(sourcePath, destPath);
107
+ }
108
+ }
109
+ }
110
+ }
111
+ /**
112
+ * Ensure a directory exists
113
+ */
114
+ async function ensureDir(dirPath) {
115
+ await fs_extra_1.default.ensureDir(dirPath);
116
+ }
117
+ /**
118
+ * Check if a path exists
119
+ */
120
+ async function pathExists(filePath) {
121
+ return fs_extra_1.default.pathExists(filePath);
122
+ }
123
+ /**
124
+ * Read a JSON file
125
+ */
126
+ async function readJson(filePath) {
127
+ return fs_extra_1.default.readJson(filePath);
128
+ }
129
+ /**
130
+ * Write a JSON file
131
+ */
132
+ async function writeJson(filePath, data) {
133
+ await fs_extra_1.default.writeJson(filePath, data, { spaces: 2 });
134
+ }
135
+ /**
136
+ * Read a text file
137
+ */
138
+ async function readFile(filePath) {
139
+ return fs_extra_1.default.readFile(filePath, 'utf8');
140
+ }
141
+ /**
142
+ * Write a text file
143
+ */
144
+ async function writeFile(filePath, content) {
145
+ await fs_extra_1.default.writeFile(filePath, content, 'utf8');
146
+ }
147
+ /**
148
+ * Copy a file
149
+ */
150
+ async function copyFile(source, dest) {
151
+ await fs_extra_1.default.copy(source, dest);
152
+ }
153
+ /**
154
+ * Remove a file or directory
155
+ */
156
+ async function remove(filePath) {
157
+ await fs_extra_1.default.remove(filePath);
158
+ }
159
+ /**
160
+ * Get the template path for cli-beta
161
+ */
162
+ function getTemplatePath(templateName) {
163
+ // In development, templates are in ../templates relative to dist
164
+ // In production, they're in the same dist folder
165
+ const distPath = path_1.default.resolve(__dirname, '..', '..', 'templates', templateName);
166
+ const srcPath = path_1.default.resolve(__dirname, '..', '..', '..', 'templates', templateName);
167
+ // Check dist first (production), then src (development)
168
+ if (fs_extra_1.default.existsSync(distPath)) {
169
+ return distPath;
170
+ }
171
+ return srcPath;
172
+ }
173
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Utility exports
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./logger"), exports);
21
+ __exportStar(require("./filesystem"), exports);
22
+ __exportStar(require("./shell"), exports);
23
+ __exportStar(require("./validation"), exports);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,2CAAyB;AACzB,+CAA6B;AAC7B,0CAAwB;AACxB,+CAA6B"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Logger utility for consistent CLI output
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.logger = void 0;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ exports.logger = {
12
+ /**
13
+ * Log an info message
14
+ */
15
+ info(message) {
16
+ console.log(chalk_1.default.blue(message));
17
+ },
18
+ /**
19
+ * Log a success message
20
+ */
21
+ success(message) {
22
+ console.log(chalk_1.default.green(message));
23
+ },
24
+ /**
25
+ * Log a warning message
26
+ */
27
+ warn(message) {
28
+ console.log(chalk_1.default.yellow(`Warning: ${message}`));
29
+ },
30
+ /**
31
+ * Log an error message
32
+ */
33
+ error(message) {
34
+ console.log(chalk_1.default.red(`Error: ${message}`));
35
+ },
36
+ /**
37
+ * Log a step in the process
38
+ */
39
+ step(message) {
40
+ console.log(chalk_1.default.cyan(`\n→ ${message}`));
41
+ },
42
+ /**
43
+ * Log a bullet point item
44
+ */
45
+ bullet(message, color = 'white') {
46
+ const colorFn = chalk_1.default[color];
47
+ console.log(colorFn(` • ${message}`));
48
+ },
49
+ /**
50
+ * Log a code snippet or command
51
+ */
52
+ code(message) {
53
+ console.log(chalk_1.default.gray(` $ ${message}`));
54
+ },
55
+ /**
56
+ * Log a dimmed/subtle message
57
+ */
58
+ dim(message) {
59
+ console.log(chalk_1.default.dim(message));
60
+ },
61
+ /**
62
+ * Log a bold message
63
+ */
64
+ bold(message) {
65
+ console.log(chalk_1.default.bold(message));
66
+ },
67
+ /**
68
+ * Log a newline
69
+ */
70
+ newline() {
71
+ console.log('');
72
+ },
73
+ /**
74
+ * Log a horizontal separator
75
+ */
76
+ separator() {
77
+ console.log(chalk_1.default.gray('─'.repeat(50)));
78
+ },
79
+ /**
80
+ * Log a header with separator
81
+ */
82
+ header(message) {
83
+ console.log('');
84
+ console.log(chalk_1.default.bold.blue(message));
85
+ console.log(chalk_1.default.gray('─'.repeat(message.length)));
86
+ },
87
+ /**
88
+ * Log a key-value pair
89
+ */
90
+ keyValue(key, value) {
91
+ console.log(` ${chalk_1.default.gray(key + ':')} ${value}`);
92
+ },
93
+ };
94
+ exports.default = exports.logger;
95
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAEH,kDAA0B;AAEb,QAAA,MAAM,GAAG;IACpB;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAe,EAAE,QAA+C,OAAO;QAC5E,MAAM,OAAO,GAAG,eAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe;QACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAe;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW,EAAE,KAAa;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;CACF,CAAC;AAEF,kBAAe,cAAM,CAAC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * Shell command execution utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runCommand = runCommand;
7
+ exports.installDependencies = installDependencies;
8
+ exports.commandExists = commandExists;
9
+ exports.getYarnVersion = getYarnVersion;
10
+ exports.getNodeVersion = getNodeVersion;
11
+ const child_process_1 = require("child_process");
12
+ const constants_1 = require("../constants");
13
+ const logger_1 = require("./logger");
14
+ /**
15
+ * Run a shell command and return the result
16
+ */
17
+ async function runCommand(command, args, options = {}) {
18
+ const { cwd, timeout = constants_1.DEFAULT_TIMEOUT, silent = false } = options;
19
+ return new Promise((resolve, reject) => {
20
+ const child = (0, child_process_1.spawn)(command, args, {
21
+ cwd,
22
+ shell: true,
23
+ stdio: silent ? 'pipe' : 'inherit',
24
+ });
25
+ let stdout = '';
26
+ let stderr = '';
27
+ if (silent && child.stdout) {
28
+ child.stdout.on('data', (data) => {
29
+ stdout += data.toString();
30
+ });
31
+ }
32
+ if (silent && child.stderr) {
33
+ child.stderr.on('data', (data) => {
34
+ stderr += data.toString();
35
+ });
36
+ }
37
+ // Set up timeout
38
+ const timeoutId = setTimeout(() => {
39
+ child.kill();
40
+ reject(new Error(`Command timed out after ${timeout}ms`));
41
+ }, timeout);
42
+ child.on('close', (code) => {
43
+ clearTimeout(timeoutId);
44
+ resolve({
45
+ stdout,
46
+ stderr,
47
+ exitCode: code ?? 0,
48
+ });
49
+ });
50
+ child.on('error', (error) => {
51
+ clearTimeout(timeoutId);
52
+ reject(error);
53
+ });
54
+ // Close stdin to prevent hanging on interactive prompts
55
+ if (child.stdin) {
56
+ child.stdin.end();
57
+ }
58
+ });
59
+ }
60
+ /**
61
+ * Run yarn install in a directory
62
+ */
63
+ async function installDependencies(directory, options = {}) {
64
+ const { silent = false } = options;
65
+ if (!silent) {
66
+ logger_1.logger.info('Installing dependencies...');
67
+ }
68
+ const result = await runCommand('yarn', ['install'], {
69
+ cwd: directory,
70
+ silent,
71
+ timeout: constants_1.DEFAULT_TIMEOUT,
72
+ });
73
+ if (result.exitCode !== 0) {
74
+ throw new Error('Failed to install dependencies');
75
+ }
76
+ }
77
+ /**
78
+ * Check if a command exists
79
+ */
80
+ async function commandExists(command) {
81
+ try {
82
+ const result = await runCommand('which', [command], { silent: true });
83
+ return result.exitCode === 0;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ /**
90
+ * Get the current yarn version
91
+ */
92
+ async function getYarnVersion() {
93
+ try {
94
+ const result = await runCommand('yarn', ['--version'], { silent: true });
95
+ return result.stdout.trim();
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Get the current node version
103
+ */
104
+ async function getNodeVersion() {
105
+ try {
106
+ const result = await runCommand('node', ['--version'], { silent: true });
107
+ return result.stdout.trim().replace('v', '');
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * Input validation utilities
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.validateProjectName = validateProjectName;
10
+ exports.validateOrgDomain = validateOrgDomain;
11
+ exports.validateAppDisplayName = validateAppDisplayName;
12
+ exports.validateBundleId = validateBundleId;
13
+ exports.validateAndroidPackageName = validateAndroidPackageName;
14
+ exports.validateExtensions = validateExtensions;
15
+ const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
16
+ const constants_1 = require("../constants");
17
+ /**
18
+ * Validate a project name
19
+ */
20
+ function validateProjectName(name) {
21
+ // Check npm package name validity
22
+ const npmResult = (0, validate_npm_package_name_1.default)(name);
23
+ if (!npmResult.validForNewPackages) {
24
+ const errors = [...(npmResult.errors || []), ...(npmResult.warnings || [])];
25
+ return {
26
+ valid: false,
27
+ error: errors.join(', '),
28
+ suggestions: [
29
+ 'Use lowercase letters, numbers, and hyphens only',
30
+ 'Start with a letter',
31
+ 'Example: my-awesome-app',
32
+ ],
33
+ };
34
+ }
35
+ // Check our additional constraints
36
+ if (!constants_1.PATTERNS.PROJECT_NAME.test(name)) {
37
+ return {
38
+ valid: false,
39
+ error: 'Project name must be lowercase and start with a letter',
40
+ suggestions: [
41
+ 'Use only lowercase letters, numbers, and hyphens',
42
+ 'Start with a letter',
43
+ 'Example: my-awesome-app',
44
+ ],
45
+ };
46
+ }
47
+ // Check length
48
+ if (name.length < 2) {
49
+ return {
50
+ valid: false,
51
+ error: 'Project name must be at least 2 characters',
52
+ };
53
+ }
54
+ if (name.length > 50) {
55
+ return {
56
+ valid: false,
57
+ error: 'Project name must be 50 characters or less',
58
+ };
59
+ }
60
+ return { valid: true };
61
+ }
62
+ /**
63
+ * Validate an organization domain
64
+ */
65
+ function validateOrgDomain(domain) {
66
+ // Check basic format
67
+ if (!constants_1.PATTERNS.ORG_DOMAIN.test(domain)) {
68
+ return {
69
+ valid: false,
70
+ error: 'Domain must be lowercase with dot-separated segments',
71
+ suggestions: [
72
+ 'Use format like: com.company or io.myorg',
73
+ 'Each segment must start with a letter',
74
+ 'Only lowercase letters and numbers allowed',
75
+ ],
76
+ };
77
+ }
78
+ // Check for at least two segments
79
+ const segments = domain.split('.');
80
+ if (segments.length < 2) {
81
+ return {
82
+ valid: false,
83
+ error: 'Domain must have at least two segments',
84
+ suggestions: ['Example: com.company, io.myorg, org.example'],
85
+ };
86
+ }
87
+ // Check for Java reserved keywords
88
+ for (const segment of segments) {
89
+ if (constants_1.JAVA_RESERVED_KEYWORDS.includes(segment)) {
90
+ return {
91
+ valid: false,
92
+ error: `"${segment}" is a Java reserved keyword and cannot be used`,
93
+ suggestions: [`Change "${segment}" to something else like "${segment}app"`],
94
+ };
95
+ }
96
+ }
97
+ return { valid: true };
98
+ }
99
+ /**
100
+ * Validate an app display name
101
+ */
102
+ function validateAppDisplayName(name) {
103
+ if (!name || name.trim().length === 0) {
104
+ return {
105
+ valid: false,
106
+ error: 'App name cannot be empty',
107
+ };
108
+ }
109
+ if (name.length > 50) {
110
+ return {
111
+ valid: false,
112
+ error: 'App name must be 50 characters or less',
113
+ };
114
+ }
115
+ // Check for at least one letter
116
+ if (!/[a-zA-Z]/.test(name)) {
117
+ return {
118
+ valid: false,
119
+ error: 'App name must contain at least one letter',
120
+ };
121
+ }
122
+ return { valid: true };
123
+ }
124
+ /**
125
+ * Validate an iOS bundle ID
126
+ */
127
+ function validateBundleId(bundleId) {
128
+ // Must start with letter
129
+ if (!/^[a-zA-Z]/.test(bundleId)) {
130
+ return {
131
+ valid: false,
132
+ error: 'Bundle ID must start with a letter',
133
+ };
134
+ }
135
+ // Only alphanumeric, dots, and hyphens
136
+ if (!constants_1.PATTERNS.IOS_BUNDLE_ID.test(bundleId)) {
137
+ return {
138
+ valid: false,
139
+ error: 'Bundle ID can only contain letters, numbers, dots, and hyphens',
140
+ };
141
+ }
142
+ // Must have at least two segments
143
+ const segments = bundleId.split('.');
144
+ if (segments.length < 2) {
145
+ return {
146
+ valid: false,
147
+ error: 'Bundle ID must have at least two segments (e.g., com.app)',
148
+ };
149
+ }
150
+ return { valid: true };
151
+ }
152
+ /**
153
+ * Validate an Android package name
154
+ */
155
+ function validateAndroidPackageName(packageName) {
156
+ // Must be lowercase with dots separating segments
157
+ if (!constants_1.PATTERNS.ANDROID_PACKAGE.test(packageName)) {
158
+ return {
159
+ valid: false,
160
+ error: 'Package name must be lowercase, start with letter, and have dot-separated segments',
161
+ };
162
+ }
163
+ // Check for Java reserved keywords
164
+ const segments = packageName.split('.');
165
+ for (const segment of segments) {
166
+ if (constants_1.JAVA_RESERVED_KEYWORDS.includes(segment)) {
167
+ return {
168
+ valid: false,
169
+ error: `"${segment}" is a Java reserved keyword`,
170
+ };
171
+ }
172
+ }
173
+ return { valid: true };
174
+ }
175
+ /**
176
+ * Validate that extension dependencies are met
177
+ */
178
+ function validateExtensions(options) {
179
+ const { withApi, withTrpc, withGraphql } = options;
180
+ if (withTrpc && !withApi) {
181
+ return {
182
+ valid: false,
183
+ error: 'tRPC requires API to be enabled',
184
+ suggestions: ['Add --with-api flag to enable API server'],
185
+ };
186
+ }
187
+ if (withGraphql && !withApi) {
188
+ return {
189
+ valid: false,
190
+ error: 'GraphQL requires API to be enabled',
191
+ suggestions: ['Add --with-api flag to enable API server'],
192
+ };
193
+ }
194
+ return { valid: true };
195
+ }
196
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}