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.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/api/index.d.ts +196 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +390 -0
- package/dist/api/index.js.map +1 -0
- package/dist/bin/nexo.d.ts +3 -0
- package/dist/bin/nexo.d.ts.map +1 -0
- package/dist/bin/nexo.js +427 -0
- package/dist/bin/nexo.js.map +1 -0
- package/dist/configurators/core/framework.d.ts +3 -0
- package/dist/configurators/core/framework.d.ts.map +1 -0
- package/dist/configurators/core/framework.js +56 -0
- package/dist/configurators/core/framework.js.map +1 -0
- package/dist/configurators/core/index.d.ts +4 -0
- package/dist/configurators/core/index.d.ts.map +1 -0
- package/dist/configurators/core/index.js +4 -0
- package/dist/configurators/core/index.js.map +1 -0
- package/dist/configurators/core/language.d.ts +3 -0
- package/dist/configurators/core/language.d.ts.map +1 -0
- package/dist/configurators/core/language.js +59 -0
- package/dist/configurators/core/language.js.map +1 -0
- package/dist/configurators/core/variant.d.ts +3 -0
- package/dist/configurators/core/variant.d.ts.map +1 -0
- package/dist/configurators/core/variant.js +22 -0
- package/dist/configurators/core/variant.js.map +1 -0
- package/dist/configurators/index.d.ts +5 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +6 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/project/auth.d.ts +3 -0
- package/dist/configurators/project/auth.d.ts.map +1 -0
- package/dist/configurators/project/auth.js +82 -0
- package/dist/configurators/project/auth.js.map +1 -0
- package/dist/configurators/project/cicd.d.ts +30 -0
- package/dist/configurators/project/cicd.d.ts.map +1 -0
- package/dist/configurators/project/cicd.js +289 -0
- package/dist/configurators/project/cicd.js.map +1 -0
- package/dist/configurators/project/i18n.d.ts +3 -0
- package/dist/configurators/project/i18n.d.ts.map +1 -0
- package/dist/configurators/project/i18n.js +67 -0
- package/dist/configurators/project/i18n.js.map +1 -0
- package/dist/configurators/project/index.d.ts +6 -0
- package/dist/configurators/project/index.d.ts.map +1 -0
- package/dist/configurators/project/index.js +6 -0
- package/dist/configurators/project/index.js.map +1 -0
- package/dist/configurators/project/mandatory.d.ts +3 -0
- package/dist/configurators/project/mandatory.d.ts.map +1 -0
- package/dist/configurators/project/mandatory.js +167 -0
- package/dist/configurators/project/mandatory.js.map +1 -0
- package/dist/configurators/project/structure.d.ts +3 -0
- package/dist/configurators/project/structure.d.ts.map +1 -0
- package/dist/configurators/project/structure.js +34 -0
- package/dist/configurators/project/structure.js.map +1 -0
- package/dist/configurators/state/dataFetching.d.ts +3 -0
- package/dist/configurators/state/dataFetching.d.ts.map +1 -0
- package/dist/configurators/state/dataFetching.js +23 -0
- package/dist/configurators/state/dataFetching.js.map +1 -0
- package/dist/configurators/state/forms.d.ts +3 -0
- package/dist/configurators/state/forms.d.ts.map +1 -0
- package/dist/configurators/state/forms.js +35 -0
- package/dist/configurators/state/forms.js.map +1 -0
- package/dist/configurators/state/index.d.ts +5 -0
- package/dist/configurators/state/index.d.ts.map +1 -0
- package/dist/configurators/state/index.js +5 -0
- package/dist/configurators/state/index.js.map +1 -0
- package/dist/configurators/state/routing.d.ts +3 -0
- package/dist/configurators/state/routing.d.ts.map +1 -0
- package/dist/configurators/state/routing.js +23 -0
- package/dist/configurators/state/routing.js.map +1 -0
- package/dist/configurators/state/state.d.ts +3 -0
- package/dist/configurators/state/state.d.ts.map +1 -0
- package/dist/configurators/state/state.js +91 -0
- package/dist/configurators/state/state.js.map +1 -0
- package/dist/configurators/styling/icons.d.ts +3 -0
- package/dist/configurators/styling/icons.d.ts.map +1 -0
- package/dist/configurators/styling/icons.js +27 -0
- package/dist/configurators/styling/icons.js.map +1 -0
- package/dist/configurators/styling/index.d.ts +4 -0
- package/dist/configurators/styling/index.d.ts.map +1 -0
- package/dist/configurators/styling/index.js +4 -0
- package/dist/configurators/styling/index.js.map +1 -0
- package/dist/configurators/styling/styling.d.ts +3 -0
- package/dist/configurators/styling/styling.d.ts.map +1 -0
- package/dist/configurators/styling/styling.js +62 -0
- package/dist/configurators/styling/styling.js.map +1 -0
- package/dist/configurators/styling/ui.d.ts +3 -0
- package/dist/configurators/styling/ui.d.ts.map +1 -0
- package/dist/configurators/styling/ui.js +188 -0
- package/dist/configurators/styling/ui.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lazy-loader.d.ts +57 -0
- package/dist/core/lazy-loader.d.ts.map +1 -0
- package/dist/core/lazy-loader.js +231 -0
- package/dist/core/lazy-loader.js.map +1 -0
- package/dist/core/parallel.d.ts +29 -0
- package/dist/core/parallel.d.ts.map +1 -0
- package/dist/core/parallel.js +127 -0
- package/dist/core/parallel.js.map +1 -0
- package/dist/core/presets.d.ts +10 -0
- package/dist/core/presets.d.ts.map +1 -0
- package/dist/core/presets.js +73 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/prompts/core.d.ts +18 -0
- package/dist/core/prompts/core.d.ts.map +1 -0
- package/dist/core/prompts/core.js +420 -0
- package/dist/core/prompts/core.js.map +1 -0
- package/dist/core/prompts/filter.d.ts +34 -0
- package/dist/core/prompts/filter.d.ts.map +1 -0
- package/dist/core/prompts/filter.js +48 -0
- package/dist/core/prompts/filter.js.map +1 -0
- package/dist/core/prompts/index.d.ts +10 -0
- package/dist/core/prompts/index.d.ts.map +1 -0
- package/dist/core/prompts/index.js +16 -0
- package/dist/core/prompts/index.js.map +1 -0
- package/dist/core/prompts/optional.d.ts +15 -0
- package/dist/core/prompts/optional.d.ts.map +1 -0
- package/dist/core/prompts/optional.js +228 -0
- package/dist/core/prompts/optional.js.map +1 -0
- package/dist/core/prompts/utils.d.ts +37 -0
- package/dist/core/prompts/utils.d.ts.map +1 -0
- package/dist/core/prompts/utils.js +72 -0
- package/dist/core/prompts/utils.js.map +1 -0
- package/dist/core/prompts.d.ts +6 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +6 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/setup.d.ts +28 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +96 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/wizard.d.ts +39 -0
- package/dist/core/wizard.d.ts.map +1 -0
- package/dist/core/wizard.js +259 -0
- package/dist/core/wizard.js.map +1 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +253 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/messages.d.ts +56 -0
- package/dist/errors/messages.d.ts.map +1 -0
- package/dist/errors/messages.js +234 -0
- package/dist/errors/messages.js.map +1 -0
- package/dist/generators/index.d.ts +86 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +441 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.d.ts +48 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +49 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +38 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +229 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +32 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +220 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/types.d.ts +186 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +5 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/security/index.d.ts +59 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +230 -0
- package/dist/security/index.js.map +1 -0
- package/dist/templates/entry.d.ts +9 -0
- package/dist/templates/entry.d.ts.map +1 -0
- package/dist/templates/entry.js +24 -0
- package/dist/templates/entry.js.map +1 -0
- package/dist/templates/index.d.ts +7 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +10 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/main.d.ts +6 -0
- package/dist/templates/main.d.ts.map +1 -0
- package/dist/templates/main.js +72 -0
- package/dist/templates/main.js.map +1 -0
- package/dist/templates/readme.d.ts +3 -0
- package/dist/templates/readme.d.ts.map +1 -0
- package/dist/templates/readme.js +127 -0
- package/dist/templates/readme.js.map +1 -0
- package/dist/templates/styles.d.ts +6 -0
- package/dist/templates/styles.d.ts.map +1 -0
- package/dist/templates/styles.js +212 -0
- package/dist/templates/styles.js.map +1 -0
- package/dist/templates/welcome.d.ts +10 -0
- package/dist/templates/welcome.d.ts.map +1 -0
- package/dist/templates/welcome.js +322 -0
- package/dist/templates/welcome.js.map +1 -0
- package/dist/types/index.d.ts +46 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/batch-writer.d.ts +101 -0
- package/dist/utils/batch-writer.d.ts.map +1 -0
- package/dist/utils/batch-writer.js +232 -0
- package/dist/utils/batch-writer.js.map +1 -0
- package/dist/utils/cache.d.ts +60 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +119 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/fileTree.d.ts +3 -0
- package/dist/utils/fileTree.d.ts.map +1 -0
- package/dist/utils/fileTree.js +71 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/fs.d.ts +22 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +75 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/helpers.d.ts +91 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +192 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/progress.d.ts +85 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +142 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/spinner.d.ts +9 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +56 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/validation/index.d.ts +63 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +262 -0
- package/dist/validation/index.js.map +1 -0
- 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":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,qBAAqB;AACrB,MAAM,UAAU,GAA2B;IACzC,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,GAAG;IACT,UAAU,EAAE,IAAI;IAChB,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAAE,IAAI;IACtB,GAAG,EAAE,IAAI;IACT,cAAc,EAAE,IAAI;IACpB,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,IAAI;IACZ,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,GAAG;IAChB,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,IAAI;IACrB,KAAK,EAAE,IAAI;IACX,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,KAAK;IACxB,gBAAgB,EAAE,IAAI;IACtB,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,IAAI;IACjB,uBAAuB,EAAE,IAAI;IAC7B,uBAAuB,EAAE,IAAI;IAC7B,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,mBAAmB,EAAE,GAAG;IACxB,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;CACrB,CAAC;AAOF;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,GAAwB,EAAc,EAAE;IAC9D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAC9F,GAAG,CAAC,UAAU,CAAC;IAEjB,MAAM,KAAK,GAAe;QACxB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE;QAC1D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE;KAClD,CAAC;IAEF,UAAU;IACV,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvG,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrH,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAE1F,UAAU;IACV,MAAM,YAAY,GAA2B;QAC3C,QAAQ,EAAE,cAAc;QACxB,IAAI,EAAE,WAAW;QACjB,aAAa,EAAE,aAAa;KAC7B,CAAC;IACF,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK;IACL,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,WAAW;KACpB,CAAC;IACF,IAAI,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,QAAQ;IACR,MAAM,UAAU,GAA2B;QACzC,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,OAAO;KACf,CAAC;IACF,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,UAAU;IACV,MAAM,YAAY,GAA2B;QAC3C,cAAc,EAAE,cAAc;QAC9B,iBAAiB,EAAE,iBAAiB;KACrC,CAAC;IACF,IAAI,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAA2B;QACxC,gBAAgB,EAAE,gBAAgB;QAClC,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,WAAW;KACnB,CAAC;IACF,IAAI,YAAY,IAAI,YAAY,KAAK,MAAM,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,QAAQ;IACR,MAAM,SAAS,GAA2B;QACxC,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE,uBAAuB;QAClC,YAAY,EAAE,cAAc;QAC5B,YAAY,EAAE,cAAc;KAC7B,CAAC;IACF,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,UAAU;IACV,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,UAAU;IACV,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,YAAY;IACZ,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,SAAS,KAAK,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAE,SAAqB,EAAU,EAAE;IAC/E,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpG,OAAO,sBAAsB,eAAe;;;;;;;;;;;;;;;;;;;;gBAoB9B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6E1B,CAAC;AACF,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,WAAmB,EAAE,SAAqB,EAAU,EAAE;IAC5E,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpG,OAAO;;qBAEY,eAAe;;;;;;;;;;mCAUD,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4C7C,CAAC;AACF,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAwB,EAAU,EAAE;IACpE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;IAChD,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,OAAO,KAAK,UAAU,CAAC;IAE1C,OAAO,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACzG,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,GAAwB,EAAE,GAAW,EAAiB,EAAE;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|