create-nexo 1.0.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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/api/index.d.ts +196 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +390 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/bin/nexo.d.ts +3 -0
  8. package/dist/bin/nexo.d.ts.map +1 -0
  9. package/dist/bin/nexo.js +427 -0
  10. package/dist/bin/nexo.js.map +1 -0
  11. package/dist/configurators/core/framework.d.ts +3 -0
  12. package/dist/configurators/core/framework.d.ts.map +1 -0
  13. package/dist/configurators/core/framework.js +56 -0
  14. package/dist/configurators/core/framework.js.map +1 -0
  15. package/dist/configurators/core/index.d.ts +4 -0
  16. package/dist/configurators/core/index.d.ts.map +1 -0
  17. package/dist/configurators/core/index.js +4 -0
  18. package/dist/configurators/core/index.js.map +1 -0
  19. package/dist/configurators/core/language.d.ts +3 -0
  20. package/dist/configurators/core/language.d.ts.map +1 -0
  21. package/dist/configurators/core/language.js +59 -0
  22. package/dist/configurators/core/language.js.map +1 -0
  23. package/dist/configurators/core/variant.d.ts +3 -0
  24. package/dist/configurators/core/variant.d.ts.map +1 -0
  25. package/dist/configurators/core/variant.js +22 -0
  26. package/dist/configurators/core/variant.js.map +1 -0
  27. package/dist/configurators/index.d.ts +5 -0
  28. package/dist/configurators/index.d.ts.map +1 -0
  29. package/dist/configurators/index.js +6 -0
  30. package/dist/configurators/index.js.map +1 -0
  31. package/dist/configurators/project/auth.d.ts +3 -0
  32. package/dist/configurators/project/auth.d.ts.map +1 -0
  33. package/dist/configurators/project/auth.js +82 -0
  34. package/dist/configurators/project/auth.js.map +1 -0
  35. package/dist/configurators/project/cicd.d.ts +30 -0
  36. package/dist/configurators/project/cicd.d.ts.map +1 -0
  37. package/dist/configurators/project/cicd.js +289 -0
  38. package/dist/configurators/project/cicd.js.map +1 -0
  39. package/dist/configurators/project/i18n.d.ts +3 -0
  40. package/dist/configurators/project/i18n.d.ts.map +1 -0
  41. package/dist/configurators/project/i18n.js +67 -0
  42. package/dist/configurators/project/i18n.js.map +1 -0
  43. package/dist/configurators/project/index.d.ts +6 -0
  44. package/dist/configurators/project/index.d.ts.map +1 -0
  45. package/dist/configurators/project/index.js +6 -0
  46. package/dist/configurators/project/index.js.map +1 -0
  47. package/dist/configurators/project/mandatory.d.ts +3 -0
  48. package/dist/configurators/project/mandatory.d.ts.map +1 -0
  49. package/dist/configurators/project/mandatory.js +167 -0
  50. package/dist/configurators/project/mandatory.js.map +1 -0
  51. package/dist/configurators/project/structure.d.ts +3 -0
  52. package/dist/configurators/project/structure.d.ts.map +1 -0
  53. package/dist/configurators/project/structure.js +34 -0
  54. package/dist/configurators/project/structure.js.map +1 -0
  55. package/dist/configurators/state/dataFetching.d.ts +3 -0
  56. package/dist/configurators/state/dataFetching.d.ts.map +1 -0
  57. package/dist/configurators/state/dataFetching.js +23 -0
  58. package/dist/configurators/state/dataFetching.js.map +1 -0
  59. package/dist/configurators/state/forms.d.ts +3 -0
  60. package/dist/configurators/state/forms.d.ts.map +1 -0
  61. package/dist/configurators/state/forms.js +35 -0
  62. package/dist/configurators/state/forms.js.map +1 -0
  63. package/dist/configurators/state/index.d.ts +5 -0
  64. package/dist/configurators/state/index.d.ts.map +1 -0
  65. package/dist/configurators/state/index.js +5 -0
  66. package/dist/configurators/state/index.js.map +1 -0
  67. package/dist/configurators/state/routing.d.ts +3 -0
  68. package/dist/configurators/state/routing.d.ts.map +1 -0
  69. package/dist/configurators/state/routing.js +23 -0
  70. package/dist/configurators/state/routing.js.map +1 -0
  71. package/dist/configurators/state/state.d.ts +3 -0
  72. package/dist/configurators/state/state.d.ts.map +1 -0
  73. package/dist/configurators/state/state.js +91 -0
  74. package/dist/configurators/state/state.js.map +1 -0
  75. package/dist/configurators/styling/icons.d.ts +3 -0
  76. package/dist/configurators/styling/icons.d.ts.map +1 -0
  77. package/dist/configurators/styling/icons.js +27 -0
  78. package/dist/configurators/styling/icons.js.map +1 -0
  79. package/dist/configurators/styling/index.d.ts +4 -0
  80. package/dist/configurators/styling/index.d.ts.map +1 -0
  81. package/dist/configurators/styling/index.js +4 -0
  82. package/dist/configurators/styling/index.js.map +1 -0
  83. package/dist/configurators/styling/styling.d.ts +3 -0
  84. package/dist/configurators/styling/styling.d.ts.map +1 -0
  85. package/dist/configurators/styling/styling.js +62 -0
  86. package/dist/configurators/styling/styling.js.map +1 -0
  87. package/dist/configurators/styling/ui.d.ts +3 -0
  88. package/dist/configurators/styling/ui.d.ts.map +1 -0
  89. package/dist/configurators/styling/ui.js +188 -0
  90. package/dist/configurators/styling/ui.js.map +1 -0
  91. package/dist/core/index.d.ts +7 -0
  92. package/dist/core/index.d.ts.map +1 -0
  93. package/dist/core/index.js +7 -0
  94. package/dist/core/index.js.map +1 -0
  95. package/dist/core/lazy-loader.d.ts +57 -0
  96. package/dist/core/lazy-loader.d.ts.map +1 -0
  97. package/dist/core/lazy-loader.js +231 -0
  98. package/dist/core/lazy-loader.js.map +1 -0
  99. package/dist/core/parallel.d.ts +29 -0
  100. package/dist/core/parallel.d.ts.map +1 -0
  101. package/dist/core/parallel.js +127 -0
  102. package/dist/core/parallel.js.map +1 -0
  103. package/dist/core/presets.d.ts +10 -0
  104. package/dist/core/presets.d.ts.map +1 -0
  105. package/dist/core/presets.js +73 -0
  106. package/dist/core/presets.js.map +1 -0
  107. package/dist/core/prompts/core.d.ts +18 -0
  108. package/dist/core/prompts/core.d.ts.map +1 -0
  109. package/dist/core/prompts/core.js +420 -0
  110. package/dist/core/prompts/core.js.map +1 -0
  111. package/dist/core/prompts/filter.d.ts +34 -0
  112. package/dist/core/prompts/filter.d.ts.map +1 -0
  113. package/dist/core/prompts/filter.js +48 -0
  114. package/dist/core/prompts/filter.js.map +1 -0
  115. package/dist/core/prompts/index.d.ts +10 -0
  116. package/dist/core/prompts/index.d.ts.map +1 -0
  117. package/dist/core/prompts/index.js +16 -0
  118. package/dist/core/prompts/index.js.map +1 -0
  119. package/dist/core/prompts/optional.d.ts +15 -0
  120. package/dist/core/prompts/optional.d.ts.map +1 -0
  121. package/dist/core/prompts/optional.js +228 -0
  122. package/dist/core/prompts/optional.js.map +1 -0
  123. package/dist/core/prompts/utils.d.ts +37 -0
  124. package/dist/core/prompts/utils.d.ts.map +1 -0
  125. package/dist/core/prompts/utils.js +72 -0
  126. package/dist/core/prompts/utils.js.map +1 -0
  127. package/dist/core/prompts.d.ts +6 -0
  128. package/dist/core/prompts.d.ts.map +1 -0
  129. package/dist/core/prompts.js +6 -0
  130. package/dist/core/prompts.js.map +1 -0
  131. package/dist/core/setup.d.ts +28 -0
  132. package/dist/core/setup.d.ts.map +1 -0
  133. package/dist/core/setup.js +96 -0
  134. package/dist/core/setup.js.map +1 -0
  135. package/dist/core/wizard.d.ts +39 -0
  136. package/dist/core/wizard.d.ts.map +1 -0
  137. package/dist/core/wizard.js +259 -0
  138. package/dist/core/wizard.js.map +1 -0
  139. package/dist/errors/index.d.ts +67 -0
  140. package/dist/errors/index.d.ts.map +1 -0
  141. package/dist/errors/index.js +253 -0
  142. package/dist/errors/index.js.map +1 -0
  143. package/dist/errors/messages.d.ts +56 -0
  144. package/dist/errors/messages.d.ts.map +1 -0
  145. package/dist/errors/messages.js +234 -0
  146. package/dist/errors/messages.js.map +1 -0
  147. package/dist/generators/index.d.ts +86 -0
  148. package/dist/generators/index.d.ts.map +1 -0
  149. package/dist/generators/index.js +441 -0
  150. package/dist/generators/index.js.map +1 -0
  151. package/dist/index.d.ts +16 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +17 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/plugins/index.d.ts +48 -0
  156. package/dist/plugins/index.d.ts.map +1 -0
  157. package/dist/plugins/index.js +49 -0
  158. package/dist/plugins/index.js.map +1 -0
  159. package/dist/plugins/loader.d.ts +38 -0
  160. package/dist/plugins/loader.d.ts.map +1 -0
  161. package/dist/plugins/loader.js +229 -0
  162. package/dist/plugins/loader.js.map +1 -0
  163. package/dist/plugins/manager.d.ts +32 -0
  164. package/dist/plugins/manager.d.ts.map +1 -0
  165. package/dist/plugins/manager.js +220 -0
  166. package/dist/plugins/manager.js.map +1 -0
  167. package/dist/plugins/types.d.ts +186 -0
  168. package/dist/plugins/types.d.ts.map +1 -0
  169. package/dist/plugins/types.js +5 -0
  170. package/dist/plugins/types.js.map +1 -0
  171. package/dist/security/index.d.ts +59 -0
  172. package/dist/security/index.d.ts.map +1 -0
  173. package/dist/security/index.js +230 -0
  174. package/dist/security/index.js.map +1 -0
  175. package/dist/templates/entry.d.ts +9 -0
  176. package/dist/templates/entry.d.ts.map +1 -0
  177. package/dist/templates/entry.js +24 -0
  178. package/dist/templates/entry.js.map +1 -0
  179. package/dist/templates/index.d.ts +7 -0
  180. package/dist/templates/index.d.ts.map +1 -0
  181. package/dist/templates/index.js +10 -0
  182. package/dist/templates/index.js.map +1 -0
  183. package/dist/templates/main.d.ts +6 -0
  184. package/dist/templates/main.d.ts.map +1 -0
  185. package/dist/templates/main.js +72 -0
  186. package/dist/templates/main.js.map +1 -0
  187. package/dist/templates/readme.d.ts +3 -0
  188. package/dist/templates/readme.d.ts.map +1 -0
  189. package/dist/templates/readme.js +127 -0
  190. package/dist/templates/readme.js.map +1 -0
  191. package/dist/templates/styles.d.ts +6 -0
  192. package/dist/templates/styles.d.ts.map +1 -0
  193. package/dist/templates/styles.js +212 -0
  194. package/dist/templates/styles.js.map +1 -0
  195. package/dist/templates/welcome.d.ts +10 -0
  196. package/dist/templates/welcome.d.ts.map +1 -0
  197. package/dist/templates/welcome.js +322 -0
  198. package/dist/templates/welcome.js.map +1 -0
  199. package/dist/types/index.d.ts +46 -0
  200. package/dist/types/index.d.ts.map +1 -0
  201. package/dist/types/index.js +2 -0
  202. package/dist/types/index.js.map +1 -0
  203. package/dist/utils/batch-writer.d.ts +101 -0
  204. package/dist/utils/batch-writer.d.ts.map +1 -0
  205. package/dist/utils/batch-writer.js +232 -0
  206. package/dist/utils/batch-writer.js.map +1 -0
  207. package/dist/utils/cache.d.ts +60 -0
  208. package/dist/utils/cache.d.ts.map +1 -0
  209. package/dist/utils/cache.js +119 -0
  210. package/dist/utils/cache.js.map +1 -0
  211. package/dist/utils/fileTree.d.ts +3 -0
  212. package/dist/utils/fileTree.d.ts.map +1 -0
  213. package/dist/utils/fileTree.js +71 -0
  214. package/dist/utils/fileTree.js.map +1 -0
  215. package/dist/utils/fs.d.ts +22 -0
  216. package/dist/utils/fs.d.ts.map +1 -0
  217. package/dist/utils/fs.js +75 -0
  218. package/dist/utils/fs.js.map +1 -0
  219. package/dist/utils/helpers.d.ts +91 -0
  220. package/dist/utils/helpers.d.ts.map +1 -0
  221. package/dist/utils/helpers.js +192 -0
  222. package/dist/utils/helpers.js.map +1 -0
  223. package/dist/utils/index.d.ts +8 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +8 -0
  226. package/dist/utils/index.js.map +1 -0
  227. package/dist/utils/progress.d.ts +85 -0
  228. package/dist/utils/progress.d.ts.map +1 -0
  229. package/dist/utils/progress.js +142 -0
  230. package/dist/utils/progress.js.map +1 -0
  231. package/dist/utils/spinner.d.ts +9 -0
  232. package/dist/utils/spinner.d.ts.map +1 -0
  233. package/dist/utils/spinner.js +56 -0
  234. package/dist/utils/spinner.js.map +1 -0
  235. package/dist/validation/index.d.ts +63 -0
  236. package/dist/validation/index.d.ts.map +1 -0
  237. package/dist/validation/index.js +262 -0
  238. package/dist/validation/index.js.map +1 -0
  239. package/package.json +71 -0
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Welcome page generator (App.tsx/App.jsx + App.css)
3
+ */
4
+ import path from 'node:path';
5
+ import { writeFile } from '../utils/index.js';
6
+ // Tech icons mapping
7
+ const TECH_ICONS = {
8
+ 'React 19': '⚛️',
9
+ Vite: '⚡',
10
+ TypeScript: '🔷',
11
+ JavaScript: '🟨',
12
+ 'React Compiler': '🚀',
13
+ SWC: '🦀',
14
+ 'Tailwind CSS': '🌊',
15
+ 'Sass/SCSS': '💅',
16
+ 'CSS Modules': '📦',
17
+ 'shadcn/ui': '🎨',
18
+ 'Radix UI': '🔘',
19
+ Mantine: '🎯',
20
+ HeroUI: '🦸',
21
+ 'Ant Design': '🐜',
22
+ 'Chakra UI': '⚡',
23
+ Zustand: '🐻',
24
+ 'Redux Toolkit': '🔄',
25
+ Jotai: '👻',
26
+ 'React Router': '🧭',
27
+ 'TanStack Router': '🛤️',
28
+ 'TanStack Query': '🔄',
29
+ Axios: '📡',
30
+ 'Fetch API': '🌐',
31
+ 'React Hook Form + Zod': '📝',
32
+ 'React Hook Form + Yup': '📝',
33
+ 'Formik + Zod': '📋',
34
+ 'Formik + Yup': '📋',
35
+ Vitest: '🧪',
36
+ Jest: '🃏',
37
+ 'ESLint + Prettier': '✨',
38
+ Biome: '🌿',
39
+ 'Framer Motion': '🎬',
40
+ 'React Spring': '🌸',
41
+ };
42
+ /**
43
+ * Build tech stack array from selections
44
+ */
45
+ const buildTechStack = (ctx) => {
46
+ const { variant, styling, ui, forms, state, routing, dataFetching, testing, linting, animation } = ctx.selections;
47
+ const stack = [
48
+ { name: 'React 19', icon: TECH_ICONS['React 19'] ?? '⚛️' },
49
+ { name: 'Vite', icon: TECH_ICONS['Vite'] ?? '⚡' },
50
+ ];
51
+ // Variant
52
+ if (variant.includes('ts'))
53
+ stack.push({ name: 'TypeScript', icon: TECH_ICONS['TypeScript'] ?? '🔷' });
54
+ if (variant.includes('compiler'))
55
+ stack.push({ name: 'React Compiler', icon: TECH_ICONS['React Compiler'] ?? '🚀' });
56
+ if (variant.includes('swc'))
57
+ stack.push({ name: 'SWC', icon: TECH_ICONS['SWC'] ?? '🦀' });
58
+ // Styling
59
+ const stylingNames = {
60
+ tailwind: 'Tailwind CSS',
61
+ sass: 'Sass/SCSS',
62
+ 'css-modules': 'CSS Modules',
63
+ };
64
+ if (stylingNames[styling]) {
65
+ const name = stylingNames[styling];
66
+ stack.push({ name, icon: TECH_ICONS[name] ?? '🎨' });
67
+ }
68
+ // UI
69
+ const uiNames = {
70
+ shadcn: 'shadcn/ui',
71
+ radix: 'Radix UI',
72
+ mantine: 'Mantine',
73
+ heroui: 'HeroUI',
74
+ antd: 'Ant Design',
75
+ chakra: 'Chakra UI',
76
+ };
77
+ if (ui && ui !== 'none' && uiNames[ui]) {
78
+ const name = uiNames[ui];
79
+ stack.push({ name, icon: TECH_ICONS[name] ?? '📦' });
80
+ }
81
+ // State
82
+ const stateNames = {
83
+ zustand: 'Zustand',
84
+ redux: 'Redux Toolkit',
85
+ jotai: 'Jotai',
86
+ };
87
+ if (state && state !== 'none' && stateNames[state]) {
88
+ const name = stateNames[state];
89
+ stack.push({ name, icon: TECH_ICONS[name] ?? '📦' });
90
+ }
91
+ // Routing
92
+ const routingNames = {
93
+ 'react-router': 'React Router',
94
+ 'tanstack-router': 'TanStack Router',
95
+ };
96
+ if (routing && routing !== 'none' && routingNames[routing]) {
97
+ const name = routingNames[routing];
98
+ stack.push({ name, icon: TECH_ICONS[name] ?? '📦' });
99
+ }
100
+ // Data Fetching
101
+ const dataNames = {
102
+ 'tanstack-query': 'TanStack Query',
103
+ axios: 'Axios',
104
+ fetch: 'Fetch API',
105
+ };
106
+ if (dataFetching && dataFetching !== 'none' && dataNames[dataFetching]) {
107
+ const name = dataNames[dataFetching];
108
+ stack.push({ name, icon: TECH_ICONS[name] ?? '📦' });
109
+ }
110
+ // Forms
111
+ const formNames = {
112
+ 'rhf-zod': 'React Hook Form + Zod',
113
+ 'rhf-yup': 'React Hook Form + Yup',
114
+ 'formik-zod': 'Formik + Zod',
115
+ 'formik-yup': 'Formik + Yup',
116
+ };
117
+ if (forms && forms !== 'none' && formNames[forms]) {
118
+ const name = formNames[forms];
119
+ stack.push({ name, icon: TECH_ICONS[name] ?? '📝' });
120
+ }
121
+ // Testing
122
+ if (testing) {
123
+ const name = testing === 'vitest' ? 'Vitest' : 'Jest';
124
+ stack.push({ name, icon: TECH_ICONS[name] ?? '🧪' });
125
+ }
126
+ // Linting
127
+ if (linting) {
128
+ const name = linting === 'biome' ? 'Biome' : 'ESLint + Prettier';
129
+ stack.push({ name, icon: TECH_ICONS[name] ?? '✨' });
130
+ }
131
+ // Animation
132
+ if (animation) {
133
+ const name = animation === 'framer-motion' ? 'Framer Motion' : 'React Spring';
134
+ stack.push({ name, icon: TECH_ICONS[name] ?? '🎬' });
135
+ }
136
+ return stack;
137
+ };
138
+ /**
139
+ * Create App.tsx with Tailwind styling
140
+ */
141
+ const createTailwindApp = (projectName, techStack) => {
142
+ const techStackString = techStack.map((t) => `{ name: '${t.name}', icon: '${t.icon}' }`).join(', ');
143
+ return `const techStack = [${techStackString}]
144
+
145
+ function App() {
146
+ return (
147
+ <div className="min-h-screen bg-[#0a0a0a] text-white selection:bg-cyan-500/30">
148
+ {/* Background Gradients */}
149
+ <div className="fixed inset-0 z-0 pointer-events-none">
150
+ <div className="absolute top-[-10%] left-[-10%] w-[40%] h-[40%] rounded-full bg-purple-600/20 blur-[120px]" />
151
+ <div className="absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] rounded-full bg-cyan-600/10 blur-[120px]" />
152
+ </div>
153
+
154
+ <div className="relative z-10 max-w-5xl mx-auto px-6 py-20 flex flex-col items-center justify-center min-h-screen">
155
+
156
+ {/* Header */}
157
+ <div className="text-center mb-16 space-y-4 animate-in fade-in slide-in-from-bottom-4 duration-700">
158
+ <div className="inline-block px-3 py-1 pb-1.5 mb-4 text-xs font-medium tracking-wider text-cyan-400 uppercase bg-cyan-950/30 border border-cyan-800/50 rounded-full">
159
+ NEXO CLI
160
+ </div>
161
+ <h1 className="text-6xl md:text-7xl font-bold tracking-tight">
162
+ <span className="bg-gradient-to-br from-white via-white to-white/40 bg-clip-text text-transparent">
163
+ ${projectName}
164
+ </span>
165
+ </h1>
166
+ <p className="text-lg text-neutral-400 max-w-lg mx-auto">
167
+ Your high-performance React application is ready for takeoff.
168
+ </p>
169
+ </div>
170
+
171
+ {/* Tech Stack Grid */}
172
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6 w-full max-w-4xl mb-12">
173
+ {/* Tech Card */}
174
+ <div className="group relative p-8 rounded-3xl bg-neutral-900/50 border border-neutral-800 backdrop-blur-sm transition-all hover:border-neutral-700 hover:bg-neutral-900/80">
175
+ <div className="absolute inset-0 bg-gradient-to-br from-purple-600/5 to-transparent rounded-3xl opacity-0 group-hover:opacity-100 transition-opacity" />
176
+ <div className="relative">
177
+ <div className="flex items-center gap-3 mb-6">
178
+ <div className="p-2.5 bg-neutral-800 rounded-xl">
179
+ <svg className="w-6 h-6 text-purple-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
180
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z" />
181
+ </svg>
182
+ </div>
183
+ <h2 className="text-xl font-semibold text-white">Tech Stack</h2>
184
+ </div>
185
+ <div className="flex flex-wrap gap-2">
186
+ {techStack.map((tech, i) => (
187
+ <span key={i} className="px-3 py-1.5 flex items-center gap-1.5 border border-neutral-800 bg-neutral-900/50 rounded-lg text-sm text-neutral-300 hover:text-white hover:border-purple-500/30 hover:bg-purple-500/10 transition-colors cursor-default">
188
+ <span>{tech.icon}</span>
189
+ <span>{tech.name}</span>
190
+ </span>
191
+ ))}
192
+ </div>
193
+ </div>
194
+ </div>
195
+
196
+ {/* Steps Card */}
197
+ <div className="group relative p-8 rounded-3xl bg-neutral-900/50 border border-neutral-800 backdrop-blur-sm transition-all hover:border-neutral-700 hover:bg-neutral-900/80">
198
+ <div className="absolute inset-0 bg-gradient-to-br from-cyan-600/5 to-transparent rounded-3xl opacity-0 group-hover:opacity-100 transition-opacity" />
199
+ <div className="relative">
200
+ <div className="flex items-center gap-3 mb-6">
201
+ <div className="p-2.5 bg-neutral-800 rounded-xl">
202
+ <svg className="w-6 h-6 text-cyan-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
203
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
204
+ </svg>
205
+ </div>
206
+ <h2 className="text-xl font-semibold text-white">Get Started</h2>
207
+ </div>
208
+ <div className="space-y-4">
209
+ {[
210
+ { text: 'Edit src/App.tsx', code: true },
211
+ { text: 'Save and see changes', code: false },
212
+ { text: 'Build something amazing! ✨', code: false }
213
+ ].map((step, i) => (
214
+ <div key={i} className="flex items-center gap-4 text-sm text-neutral-400">
215
+ <div className="flex items-center justify-center w-6 h-6 rounded-full border border-neutral-800 bg-neutral-900 text-xs font-mono">
216
+ {i + 1}
217
+ </div>
218
+ {step.code ? (
219
+ <span>Edit <code className="px-1.5 py-0.5 rounded bg-cyan-950/30 border border-cyan-800/30 text-cyan-300 font-mono text-xs">src/App.tsx</code></span>
220
+ ) : (
221
+ <span>{step.text}</span>
222
+ )}
223
+ </div>
224
+ ))}
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </div>
229
+
230
+ {/* Footer */}
231
+ <p className="text-neutral-500 text-sm animate-in fade-in duration-1000 delay-500">
232
+ Made with ❤️ using <span className="text-neutral-300 font-medium">NEXO CLI</span>
233
+ </p>
234
+ </div>
235
+ </div>
236
+ )
237
+ }
238
+
239
+ export default App
240
+ `;
241
+ };
242
+ /**
243
+ * Create App.tsx with plain CSS styling
244
+ */
245
+ const createPlainApp = (projectName, techStack) => {
246
+ const techStackString = techStack.map((t) => `{ name: '${t.name}', icon: '${t.icon}' }`).join(', ');
247
+ return `import './App.css'
248
+
249
+ const techStack = [${techStackString}]
250
+
251
+ function App() {
252
+ return (
253
+ <div className="app-container">
254
+ <div className="background-glow"></div>
255
+
256
+ <div className="content">
257
+ <div className="header">
258
+ <div className="badge">NEXO CLI</div>
259
+ <h1 className="title">${projectName}</h1>
260
+ <p className="subtitle">Your high-performance React application is ready.</p>
261
+ </div>
262
+
263
+ <div className="grid">
264
+ <div className="card tech-card">
265
+ <div className="card-header">
266
+ <span className="icon">🛠️</span>
267
+ <h2>Tech Stack</h2>
268
+ </div>
269
+ <div className="tech-tags">
270
+ {techStack.map((tech, i) => <span key={i} className="tag">{tech.icon} {tech.name}</span>)}
271
+ </div>
272
+ </div>
273
+
274
+ <div className="card steps-card">
275
+ <div className="card-header">
276
+ <span className="icon">🚀</span>
277
+ <h2>Get Started</h2>
278
+ </div>
279
+ <div className="steps">
280
+ <div className="step">
281
+ <span className="number">1</span>
282
+ <span>Edit <code>src/App.tsx</code></span>
283
+ </div>
284
+ <div className="step">
285
+ <span className="number">2</span>
286
+ <span>Save and see changes</span>
287
+ </div>
288
+ <div className="step">
289
+ <span className="number">3</span>
290
+ <span>Build something amazing!</span>
291
+ </div>
292
+ </div>
293
+ </div>
294
+ </div>
295
+
296
+ <p className="footer">Made with ❤️ using NEXO CLI</p>
297
+ </div>
298
+ </div>
299
+ )
300
+ }
301
+
302
+ export default App
303
+ `;
304
+ };
305
+ /**
306
+ * Create welcome page App component
307
+ */
308
+ export const createWelcomePage = (ctx) => {
309
+ const { projectName, styling } = ctx.selections;
310
+ const techStack = buildTechStack(ctx);
311
+ const isTailwind = styling === 'tailwind';
312
+ return isTailwind ? createTailwindApp(projectName, techStack) : createPlainApp(projectName, techStack);
313
+ };
314
+ /**
315
+ * Create App.tsx file
316
+ */
317
+ export const createAppFile = async (ctx, ext) => {
318
+ const srcDir = path.join(ctx.projectPath, 'src');
319
+ const content = createWelcomePage(ctx);
320
+ await writeFile(path.join(srcDir, `App.${ext}`), content);
321
+ };
322
+ //# sourceMappingURL=welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/templates/welcome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export interface PromptOption {
2
+ value: string;
3
+ name: string;
4
+ rank: 'recommended' | 'solid' | 'legacy';
5
+ comment?: string;
6
+ hover_note?: string;
7
+ folder_info?: string[];
8
+ /** Frameworks that support this option. If undefined, all frameworks are supported. */
9
+ supportedFrameworks?: ('react' | 'nextjs')[];
10
+ }
11
+ export interface PromptConfig {
12
+ name: string;
13
+ message: string;
14
+ type: 'list' | 'checkbox' | 'input';
15
+ options: PromptOption[];
16
+ }
17
+ export interface UserSelections {
18
+ projectName: string;
19
+ framework: string;
20
+ variant: string;
21
+ language: string;
22
+ styling: string;
23
+ ui: string;
24
+ forms: string;
25
+ state: string;
26
+ routing: string;
27
+ dataFetching: string;
28
+ icons: string;
29
+ structure: string;
30
+ i18n: string;
31
+ auth: string;
32
+ testing?: string;
33
+ linting?: string;
34
+ api?: string;
35
+ animation?: string;
36
+ docker?: boolean;
37
+ monorepo?: string;
38
+ hasCompiler?: boolean;
39
+ hasSWC?: boolean;
40
+ }
41
+ export interface ConfiguratorContext {
42
+ projectPath: string;
43
+ selections: UserSelections;
44
+ }
45
+ export type Configurator = (ctx: ConfiguratorContext) => Promise<void>;
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,uFAAuF;IACvF,mBAAmB,CAAC,EAAE,CAAC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;IACpC,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * NEXO CLI - Batch Writer
3
+ *
4
+ * Optimizes file I/O by batching writes and executing them in parallel.
5
+ * This significantly improves performance when creating many files.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const writer = createBatchWriter();
10
+ *
11
+ * writer.add('src/file1.ts', content1);
12
+ * writer.add('src/file2.ts', content2);
13
+ * writer.addJson('package.json', packageJson);
14
+ *
15
+ * await writer.flush(); // Writes all files in parallel
16
+ * ```
17
+ */
18
+ export interface WriteOperation {
19
+ path: string;
20
+ content: string | object;
21
+ type: 'file' | 'json';
22
+ }
23
+ export interface BatchWriterOptions {
24
+ /** Maximum concurrent writes (default: 10) */
25
+ maxConcurrency?: number;
26
+ /** Base directory for relative paths */
27
+ baseDir?: string;
28
+ /** Whether to create directories automatically (default: true) */
29
+ createDirs?: boolean;
30
+ /** Callback for each successful write */
31
+ onWrite?: (filePath: string) => void;
32
+ /** Callback for errors */
33
+ onError?: (filePath: string, error: Error) => void;
34
+ }
35
+ export interface BatchWriterResult {
36
+ success: boolean;
37
+ written: string[];
38
+ failed: Array<{
39
+ path: string;
40
+ error: string;
41
+ }>;
42
+ duration: number;
43
+ }
44
+ export interface BatchWriter {
45
+ /** Add a file to the batch */
46
+ add: (filePath: string, content: string) => BatchWriter;
47
+ /** Add a JSON file to the batch */
48
+ addJson: (filePath: string, data: object) => BatchWriter;
49
+ /** Add multiple files at once */
50
+ addMany: (files: Record<string, string>) => BatchWriter;
51
+ /** Get pending operations count */
52
+ pending: () => number;
53
+ /** Clear all pending operations */
54
+ clear: () => void;
55
+ /** Flush all pending writes */
56
+ flush: () => Promise<BatchWriterResult>;
57
+ /** Check if a file is already queued */
58
+ has: (filePath: string) => boolean;
59
+ }
60
+ /**
61
+ * Create a batch writer instance
62
+ */
63
+ export declare const createBatchWriter: (options?: BatchWriterOptions) => BatchWriter;
64
+ /**
65
+ * Write multiple files in parallel (one-shot operation)
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * await writeFilesParallel({
70
+ * 'src/file1.ts': content1,
71
+ * 'src/file2.ts': content2,
72
+ * }, { baseDir: projectPath });
73
+ * ```
74
+ */
75
+ export declare const writeFilesParallel: (files: Record<string, string>, options?: BatchWriterOptions) => Promise<BatchWriterResult>;
76
+ /**
77
+ * Write files and JSON in parallel
78
+ */
79
+ export declare const writeAllParallel: (files: Record<string, string>, jsonFiles: Record<string, object>, options?: BatchWriterOptions) => Promise<BatchWriterResult>;
80
+ /**
81
+ * Get or create the global batch writer
82
+ */
83
+ export declare const getGlobalWriter: (options?: BatchWriterOptions) => BatchWriter;
84
+ /**
85
+ * Reset the global writer
86
+ */
87
+ export declare const resetGlobalWriter: () => void;
88
+ /**
89
+ * Queue a file for batch writing
90
+ */
91
+ export declare const queueFile: (filePath: string, content: string) => void;
92
+ /**
93
+ * Queue a JSON file for batch writing
94
+ */
95
+ export declare const queueJson: (filePath: string, data: object) => void;
96
+ /**
97
+ * Flush the global writer
98
+ */
99
+ export declare const flushGlobalWriter: () => Promise<BatchWriterResult>;
100
+ export default createBatchWriter;
101
+ //# sourceMappingURL=batch-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-writer.d.ts","sourceRoot":"","sources":["../../src/utils/batch-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yCAAyC;IACzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0BAA0B;IAC1B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;IACxD,mCAAmC;IACnC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC;IACzD,iCAAiC;IACjC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,WAAW,CAAC;IACxD,mCAAmC;IACnC,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,mCAAmC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC,wCAAwC;IACxC,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACpC;AAMD;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAS,kBAAuB,KAAG,WAoJpE,CAAC;AAMF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAS,kBAAuB,KAC/B,OAAO,CAAC,iBAAiB,CAI3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,UAAS,kBAAuB,KAC/B,OAAO,CAAC,iBAAiB,CAc3B,CAAC;AAQF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,kBAAkB,KAAG,WAK9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,IAEpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,IAE7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,IAE1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,iBAAiB,CAOnE,CAAC;AAGF,eAAe,iBAAiB,CAAC"}