create-react-starter-kit 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 +119 -0
- package/bin/create-react-starter-kit.js +7 -0
- package/dist/cli-args.d.ts +15 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +78 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/generator/dependencies.d.ts +8 -0
- package/dist/generator/dependencies.d.ts.map +1 -0
- package/dist/generator/dependencies.js +356 -0
- package/dist/generator/dependencies.js.map +1 -0
- package/dist/generator/index.d.ts +5 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +358 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +267 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/templates/.env.example.ejs +21 -0
- package/dist/templates/.husky/commit-msg +2 -0
- package/dist/templates/.husky/pre-commit +2 -0
- package/dist/templates/README.md.ejs +169 -0
- package/dist/templates/__js__/jsconfig.json +9 -0
- package/dist/templates/__ts__/src/vite-env.d.ts +16 -0
- package/dist/templates/__ts__/tsconfig.json +24 -0
- package/dist/templates/__when_buildTool_esbuild__/scripts/esbuild.build.mjs.ejs +23 -0
- package/dist/templates/__when_buildTool_esbuild__/scripts/esbuild.dev.mjs.ejs +48 -0
- package/dist/templates/__when_buildTool_parcel__/.parcelrc +9 -0
- package/dist/templates/__when_buildTool_rollup__/rollup.config.js.ejs +33 -0
- package/dist/templates/__when_buildTool_rspack__/rspack.config.js.ejs +36 -0
- package/dist/templates/__when_buildTool_vite__/vite.config.ts.ejs +37 -0
- package/dist/templates/__when_buildTool_webpack__/webpack.config.js.ejs +68 -0
- package/dist/templates/__when_e2eTesting_cypress__/cypress/e2e/home.cy.ts.ejs +6 -0
- package/dist/templates/__when_e2eTesting_cypress__/cypress.config.ts.ejs +8 -0
- package/dist/templates/__when_e2eTesting_playwright__/playwright.config.ts.ejs +16 -0
- package/dist/templates/__when_e2eTesting_playwright__/tests/e2e/home.spec.ts.ejs +6 -0
- package/dist/templates/__when_formatting_prettier__/.prettierrc +7 -0
- package/dist/templates/__when_formatting_stylelint__/.stylelintrc.json +3 -0
- package/dist/templates/__when_linting_biome__/biome.json +19 -0
- package/dist/templates/__when_linting_eslint__/eslint.config.js.ejs +42 -0
- package/dist/templates/__when_serverState_rtk-query__/src/store/postsApi.ts.ejs +19 -0
- package/dist/templates/__when_stateManagement_context__/src/store/context.tsx.ejs +57 -0
- package/dist/templates/__when_styling_tailwind__/postcss.config.js +6 -0
- package/dist/templates/__when_styling_tailwind__/tailwind.config.js.ejs +23 -0
- package/dist/templates/__when_unitTesting_jest__/jest.config.json.ejs +11 -0
- package/dist/templates/__when_unitTesting_jest__/tests/App.test.tsx.ejs +13 -0
- package/dist/templates/__when_unitTesting_jest__/tests/setup.ts.ejs +1 -0
- package/dist/templates/__when_unitTesting_jest__/tests/styleMock.ts.ejs +1 -0
- package/dist/templates/__when_unitTesting_rtl__/tests/App.test.tsx.ejs +13 -0
- package/dist/templates/__when_unitTesting_vitest__/tests/App.test.tsx.ejs +16 -0
- package/dist/templates/__when_unitTesting_vitest__/tests/setup.ts.ejs +1 -0
- package/dist/templates/__when_visualTesting_storybook__/.storybook/main.js.ejs +11 -0
- package/dist/templates/__when_visualTesting_storybook__/.storybook/preview.js +8 -0
- package/dist/templates/__when_visualTesting_storybook__/src/components/ui/UiButton.stories.tsx.ejs +15 -0
- package/dist/templates/commitlint.config.js +3 -0
- package/dist/templates/docs/architecture.md.ejs +74 -0
- package/dist/templates/docs/best-practices.md.ejs +56 -0
- package/dist/templates/docs/examples/README.md.ejs +14 -0
- package/dist/templates/docs/examples/api.md.ejs +17 -0
- package/dist/templates/docs/examples/data-fetching.md.ejs +18 -0
- package/dist/templates/docs/examples/forms.md.ejs +18 -0
- package/dist/templates/docs/examples/state.md.ejs +17 -0
- package/dist/templates/docs/examples/styling.md.ejs +23 -0
- package/dist/templates/docs/examples/testing.md.ejs +27 -0
- package/dist/templates/docs/getting-started.md.ejs +55 -0
- package/dist/templates/docs/selected-stack.md.ejs +55 -0
- package/dist/templates/index.html.ejs +19 -0
- package/dist/templates/public/vite.svg +4 -0
- package/dist/templates/src/app/App.tsx.ejs +71 -0
- package/dist/templates/src/app/providers.tsx.ejs +93 -0
- package/dist/templates/src/assets/.gitkeep +0 -0
- package/dist/templates/src/components/StackBadge.tsx.ejs +15 -0
- package/dist/templates/src/components/layout/AppLayout.tsx.ejs +64 -0
- package/dist/templates/src/components/ui/Toast.tsx.ejs +61 -0
- package/dist/templates/src/components/ui/UiButton.tsx.ejs +168 -0
- package/dist/templates/src/config/env.ts.ejs +18 -0
- package/dist/templates/src/features/counter/CounterPanel.tsx.ejs +66 -0
- package/dist/templates/src/features/feedback/FeedbackForm.tsx.ejs +373 -0
- package/dist/templates/src/features/posts/PostsPanel.tsx.ejs +91 -0
- package/dist/templates/src/hooks/useMounted.ts.ejs +15 -0
- package/dist/templates/src/lib/cn.ts.ejs +12 -0
- package/dist/templates/src/lib/monitoring.ts.ejs +66 -0
- package/dist/templates/src/lib/validation.ts.ejs +81 -0
- package/dist/templates/src/main.tsx.ejs +22 -0
- package/dist/templates/src/routes/AboutPage.tsx.ejs +30 -0
- package/dist/templates/src/routes/HomePage.tsx.ejs +47 -0
- package/dist/templates/src/services/api.ts.ejs +84 -0
- package/dist/templates/src/store/index.ts.ejs +80 -0
- package/dist/templates/src/styles/global.css.ejs +457 -0
- package/dist/templates/src/types/index.ts.ejs +7 -0
- package/dist/templates/src/utils/format.ts.ejs +3 -0
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validate.d.ts +3 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +24 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +62 -0
- package/templates/.env.example.ejs +21 -0
- package/templates/.husky/commit-msg +2 -0
- package/templates/.husky/pre-commit +2 -0
- package/templates/README.md.ejs +169 -0
- package/templates/__js__/jsconfig.json +9 -0
- package/templates/__ts__/src/vite-env.d.ts +16 -0
- package/templates/__ts__/tsconfig.json +24 -0
- package/templates/__when_buildTool_esbuild__/scripts/esbuild.build.mjs.ejs +23 -0
- package/templates/__when_buildTool_esbuild__/scripts/esbuild.dev.mjs.ejs +48 -0
- package/templates/__when_buildTool_parcel__/.parcelrc +9 -0
- package/templates/__when_buildTool_rollup__/rollup.config.js.ejs +33 -0
- package/templates/__when_buildTool_rspack__/rspack.config.js.ejs +36 -0
- package/templates/__when_buildTool_vite__/vite.config.ts.ejs +37 -0
- package/templates/__when_buildTool_webpack__/webpack.config.js.ejs +68 -0
- package/templates/__when_e2eTesting_cypress__/cypress/e2e/home.cy.ts.ejs +6 -0
- package/templates/__when_e2eTesting_cypress__/cypress.config.ts.ejs +8 -0
- package/templates/__when_e2eTesting_playwright__/playwright.config.ts.ejs +16 -0
- package/templates/__when_e2eTesting_playwright__/tests/e2e/home.spec.ts.ejs +6 -0
- package/templates/__when_formatting_prettier__/.prettierrc +7 -0
- package/templates/__when_formatting_stylelint__/.stylelintrc.json +3 -0
- package/templates/__when_linting_biome__/biome.json +19 -0
- package/templates/__when_linting_eslint__/eslint.config.js.ejs +42 -0
- package/templates/__when_serverState_rtk-query__/src/store/postsApi.ts.ejs +19 -0
- package/templates/__when_stateManagement_context__/src/store/context.tsx.ejs +57 -0
- package/templates/__when_styling_tailwind__/postcss.config.js +6 -0
- package/templates/__when_styling_tailwind__/tailwind.config.js.ejs +23 -0
- package/templates/__when_unitTesting_jest__/jest.config.json.ejs +11 -0
- package/templates/__when_unitTesting_jest__/tests/App.test.tsx.ejs +13 -0
- package/templates/__when_unitTesting_jest__/tests/setup.ts.ejs +1 -0
- package/templates/__when_unitTesting_jest__/tests/styleMock.ts.ejs +1 -0
- package/templates/__when_unitTesting_rtl__/tests/App.test.tsx.ejs +13 -0
- package/templates/__when_unitTesting_vitest__/tests/App.test.tsx.ejs +16 -0
- package/templates/__when_unitTesting_vitest__/tests/setup.ts.ejs +1 -0
- package/templates/__when_visualTesting_storybook__/.storybook/main.js.ejs +11 -0
- package/templates/__when_visualTesting_storybook__/.storybook/preview.js +8 -0
- package/templates/__when_visualTesting_storybook__/src/components/ui/UiButton.stories.tsx.ejs +15 -0
- package/templates/commitlint.config.js +3 -0
- package/templates/docs/architecture.md.ejs +74 -0
- package/templates/docs/best-practices.md.ejs +56 -0
- package/templates/docs/examples/README.md.ejs +14 -0
- package/templates/docs/examples/api.md.ejs +17 -0
- package/templates/docs/examples/data-fetching.md.ejs +18 -0
- package/templates/docs/examples/forms.md.ejs +18 -0
- package/templates/docs/examples/state.md.ejs +17 -0
- package/templates/docs/examples/styling.md.ejs +23 -0
- package/templates/docs/examples/testing.md.ejs +27 -0
- package/templates/docs/getting-started.md.ejs +55 -0
- package/templates/docs/selected-stack.md.ejs +55 -0
- package/templates/index.html.ejs +19 -0
- package/templates/public/vite.svg +4 -0
- package/templates/src/app/App.tsx.ejs +71 -0
- package/templates/src/app/providers.tsx.ejs +93 -0
- package/templates/src/assets/.gitkeep +0 -0
- package/templates/src/components/StackBadge.tsx.ejs +15 -0
- package/templates/src/components/layout/AppLayout.tsx.ejs +64 -0
- package/templates/src/components/ui/Toast.tsx.ejs +61 -0
- package/templates/src/components/ui/UiButton.tsx.ejs +168 -0
- package/templates/src/config/env.ts.ejs +18 -0
- package/templates/src/features/counter/CounterPanel.tsx.ejs +66 -0
- package/templates/src/features/feedback/FeedbackForm.tsx.ejs +373 -0
- package/templates/src/features/posts/PostsPanel.tsx.ejs +91 -0
- package/templates/src/hooks/useMounted.ts.ejs +15 -0
- package/templates/src/lib/cn.ts.ejs +12 -0
- package/templates/src/lib/monitoring.ts.ejs +66 -0
- package/templates/src/lib/validation.ts.ejs +81 -0
- package/templates/src/main.tsx.ejs +22 -0
- package/templates/src/routes/AboutPage.tsx.ejs +30 -0
- package/templates/src/routes/HomePage.tsx.ejs +47 -0
- package/templates/src/services/api.ts.ejs +84 -0
- package/templates/src/store/index.ts.ejs +80 -0
- package/templates/src/styles/global.css.ejs +457 -0
- package/templates/src/types/index.ts.ejs +7 -0
- package/templates/src/utils/format.ts.ejs +3 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import ejs from 'ejs';
|
|
5
|
+
import { execa } from 'execa';
|
|
6
|
+
import { resolveDependencies, buildScripts } from './dependencies.js';
|
|
7
|
+
import { createSpinner, logger } from '../utils/logger.js';
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
function getTemplatesRoot() {
|
|
10
|
+
// dist/generator -> ../../templates or ../templates depending on layout
|
|
11
|
+
const candidates = [
|
|
12
|
+
path.resolve(__dirname, '../../templates'),
|
|
13
|
+
path.resolve(__dirname, '../templates'),
|
|
14
|
+
];
|
|
15
|
+
for (const candidate of candidates) {
|
|
16
|
+
if (fs.existsSync(candidate)) {
|
|
17
|
+
return candidate;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return candidates[0];
|
|
21
|
+
}
|
|
22
|
+
function createContext(answers) {
|
|
23
|
+
const isTypeScript = answers.language === 'typescript';
|
|
24
|
+
return {
|
|
25
|
+
...answers,
|
|
26
|
+
isTypeScript,
|
|
27
|
+
ext: isTypeScript ? 'ts' : 'js',
|
|
28
|
+
jsxExt: isTypeScript ? 'tsx' : 'jsx',
|
|
29
|
+
year: new Date().getFullYear(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function labelMap() {
|
|
33
|
+
return {
|
|
34
|
+
buildTool: {
|
|
35
|
+
vite: 'Vite',
|
|
36
|
+
webpack: 'Webpack',
|
|
37
|
+
rspack: 'Rspack',
|
|
38
|
+
parcel: 'Parcel',
|
|
39
|
+
esbuild: 'esbuild',
|
|
40
|
+
rollup: 'Rollup',
|
|
41
|
+
},
|
|
42
|
+
language: {
|
|
43
|
+
javascript: 'JavaScript',
|
|
44
|
+
typescript: 'TypeScript',
|
|
45
|
+
},
|
|
46
|
+
router: {
|
|
47
|
+
'react-router': 'React Router',
|
|
48
|
+
'tanstack-router': 'TanStack Router',
|
|
49
|
+
},
|
|
50
|
+
stateManagement: {
|
|
51
|
+
redux: 'Redux Toolkit',
|
|
52
|
+
zustand: 'Zustand',
|
|
53
|
+
jotai: 'Jotai',
|
|
54
|
+
context: 'Context API + useReducer',
|
|
55
|
+
none: 'None',
|
|
56
|
+
},
|
|
57
|
+
serverState: {
|
|
58
|
+
'tanstack-query': 'TanStack Query',
|
|
59
|
+
swr: 'SWR',
|
|
60
|
+
'rtk-query': 'RTK Query',
|
|
61
|
+
none: 'None',
|
|
62
|
+
},
|
|
63
|
+
forms: {
|
|
64
|
+
'react-hook-form': 'React Hook Form',
|
|
65
|
+
formik: 'Formik',
|
|
66
|
+
'tanstack-form': 'TanStack Form',
|
|
67
|
+
none: 'None',
|
|
68
|
+
},
|
|
69
|
+
validation: {
|
|
70
|
+
zod: 'Zod',
|
|
71
|
+
yup: 'Yup',
|
|
72
|
+
valibot: 'Valibot',
|
|
73
|
+
joi: 'Joi',
|
|
74
|
+
none: 'None',
|
|
75
|
+
},
|
|
76
|
+
styling: {
|
|
77
|
+
tailwind: 'Tailwind CSS',
|
|
78
|
+
'css-modules': 'CSS Modules',
|
|
79
|
+
'styled-components': 'Styled Components',
|
|
80
|
+
sass: 'Sass/SCSS',
|
|
81
|
+
},
|
|
82
|
+
uiLibrary: {
|
|
83
|
+
mui: 'MUI',
|
|
84
|
+
antd: 'Ant Design',
|
|
85
|
+
chakra: 'Chakra UI',
|
|
86
|
+
shadcn: 'shadcn/ui',
|
|
87
|
+
'headless-ui': 'Headless UI',
|
|
88
|
+
none: 'None',
|
|
89
|
+
},
|
|
90
|
+
unitTesting: {
|
|
91
|
+
vitest: 'Vitest',
|
|
92
|
+
jest: 'Jest',
|
|
93
|
+
rtl: 'React Testing Library',
|
|
94
|
+
none: 'None',
|
|
95
|
+
},
|
|
96
|
+
e2eTesting: {
|
|
97
|
+
playwright: 'Playwright',
|
|
98
|
+
cypress: 'Cypress',
|
|
99
|
+
none: 'None',
|
|
100
|
+
},
|
|
101
|
+
visualTesting: {
|
|
102
|
+
storybook: 'Storybook',
|
|
103
|
+
chromatic: 'Chromatic',
|
|
104
|
+
none: 'None',
|
|
105
|
+
},
|
|
106
|
+
linting: {
|
|
107
|
+
eslint: 'ESLint',
|
|
108
|
+
biome: 'Biome',
|
|
109
|
+
},
|
|
110
|
+
formatting: {
|
|
111
|
+
prettier: 'Prettier',
|
|
112
|
+
stylelint: 'Stylelint',
|
|
113
|
+
},
|
|
114
|
+
apiLayer: {
|
|
115
|
+
axios: 'REST via Axios',
|
|
116
|
+
fetch: 'REST via Fetch',
|
|
117
|
+
},
|
|
118
|
+
packageManager: {
|
|
119
|
+
pnpm: 'pnpm',
|
|
120
|
+
yarn: 'yarn',
|
|
121
|
+
npm: 'npm',
|
|
122
|
+
},
|
|
123
|
+
errorTracking: {
|
|
124
|
+
sentry: 'Sentry',
|
|
125
|
+
bugsnag: 'Bugsnag',
|
|
126
|
+
logrocket: 'LogRocket',
|
|
127
|
+
datadog: 'Datadog RUM',
|
|
128
|
+
none: 'None',
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export function getStackLabels(answers) {
|
|
133
|
+
const map = labelMap();
|
|
134
|
+
return {
|
|
135
|
+
buildTool: map.buildTool[answers.buildTool],
|
|
136
|
+
language: map.language[answers.language],
|
|
137
|
+
router: map.router[answers.router],
|
|
138
|
+
stateManagement: map.stateManagement[answers.stateManagement],
|
|
139
|
+
serverState: map.serverState[answers.serverState],
|
|
140
|
+
forms: map.forms[answers.forms],
|
|
141
|
+
validation: map.validation[answers.validation],
|
|
142
|
+
styling: map.styling[answers.styling],
|
|
143
|
+
uiLibrary: map.uiLibrary[answers.uiLibrary],
|
|
144
|
+
unitTesting: map.unitTesting[answers.unitTesting],
|
|
145
|
+
e2eTesting: map.e2eTesting[answers.e2eTesting],
|
|
146
|
+
visualTesting: map.visualTesting[answers.visualTesting],
|
|
147
|
+
linting: map.linting[answers.linting],
|
|
148
|
+
formatting: map.formatting[answers.formatting],
|
|
149
|
+
apiLayer: map.apiLayer[answers.apiLayer],
|
|
150
|
+
packageManager: map.packageManager[answers.packageManager],
|
|
151
|
+
errorTracking: map.errorTracking[answers.errorTracking],
|
|
152
|
+
gitHooks: 'Husky + lint-staged + commitlint',
|
|
153
|
+
folderPattern: 'Feature-based (domain-driven)',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async function renderTemplate(templatePath, context) {
|
|
157
|
+
const content = await fs.readFile(templatePath, 'utf8');
|
|
158
|
+
return ejs.render(content, context, { async: false });
|
|
159
|
+
}
|
|
160
|
+
async function walkTemplates(dir, baseDir) {
|
|
161
|
+
const results = [];
|
|
162
|
+
if (!(await fs.pathExists(dir))) {
|
|
163
|
+
return results;
|
|
164
|
+
}
|
|
165
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
166
|
+
for (const entry of entries) {
|
|
167
|
+
const absolute = path.join(dir, entry.name);
|
|
168
|
+
if (entry.isDirectory()) {
|
|
169
|
+
results.push(...(await walkTemplates(absolute, baseDir)));
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
results.push({
|
|
173
|
+
absolute,
|
|
174
|
+
relative: path.relative(baseDir, absolute),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return results;
|
|
179
|
+
}
|
|
180
|
+
function shouldIncludeTemplate(relativePath, answers) {
|
|
181
|
+
const normalized = relativePath.replace(/\\/g, '/');
|
|
182
|
+
// Conditional template folders by convention: __when_<key>_<value>__
|
|
183
|
+
const whenMatch = normalized.match(/__when_([a-zA-Z0-9]+)_([a-zA-Z0-9-]+)__/);
|
|
184
|
+
if (whenMatch) {
|
|
185
|
+
const [, key, value] = whenMatch;
|
|
186
|
+
const answerValue = answers[key];
|
|
187
|
+
// shadcn/ui depends on Tailwind utilities even if another styling option was picked
|
|
188
|
+
if (key === 'styling' &&
|
|
189
|
+
value === 'tailwind' &&
|
|
190
|
+
answers.uiLibrary === 'shadcn' &&
|
|
191
|
+
answerValue !== 'tailwind') {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
if (answerValue !== value) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Language-specific templates
|
|
199
|
+
if (normalized.includes('__ts__/') && answers.language !== 'typescript') {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
if (normalized.includes('__js__/') && answers.language !== 'javascript') {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
function resolveOutputPath(relativePath, answers) {
|
|
208
|
+
let out = relativePath.replace(/\\/g, '/');
|
|
209
|
+
// Strip conditional markers from path
|
|
210
|
+
out = out.replace(/__when_[a-zA-Z0-9]+_[a-zA-Z0-9-]+__\//g, '');
|
|
211
|
+
out = out.replace(/__ts__\//g, '');
|
|
212
|
+
out = out.replace(/__js__\//g, '');
|
|
213
|
+
// Extension placeholders
|
|
214
|
+
out = out.replace(/\.tsx\.ejs$/, answers.language === 'typescript' ? '.tsx' : '.jsx');
|
|
215
|
+
out = out.replace(/\.ts\.ejs$/, answers.language === 'typescript' ? '.ts' : '.js');
|
|
216
|
+
out = out.replace(/\.jsx\.ejs$/, '.jsx');
|
|
217
|
+
out = out.replace(/\.js\.ejs$/, '.js');
|
|
218
|
+
out = out.replace(/\.ejs$/, '');
|
|
219
|
+
// Rename config files based on selections
|
|
220
|
+
if (out === 'vite.config.ts' && answers.buildTool !== 'vite') {
|
|
221
|
+
return '';
|
|
222
|
+
}
|
|
223
|
+
if (out === 'src/styles/global.css' &&
|
|
224
|
+
answers.styling === 'sass' &&
|
|
225
|
+
answers.uiLibrary !== 'shadcn') {
|
|
226
|
+
out = 'src/styles/global.scss';
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
export async function generateProject(answers) {
|
|
231
|
+
const spinner = createSpinner('Preparing project...');
|
|
232
|
+
spinner.start();
|
|
233
|
+
const context = createContext(answers);
|
|
234
|
+
const stackLabels = getStackLabels(answers);
|
|
235
|
+
const fullContext = { ...context, stackLabels };
|
|
236
|
+
await fs.emptyDir(answers.targetDir);
|
|
237
|
+
const templatesRoot = getTemplatesRoot();
|
|
238
|
+
const files = await walkTemplates(templatesRoot, templatesRoot);
|
|
239
|
+
spinner.text = 'Rendering templates...';
|
|
240
|
+
for (const file of files) {
|
|
241
|
+
if (!shouldIncludeTemplate(file.relative, answers)) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
const outputRelative = resolveOutputPath(file.relative, answers);
|
|
245
|
+
if (!outputRelative) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
// Skip build-tool specific configs that don't match
|
|
249
|
+
if (outputRelative.startsWith('configs/') ||
|
|
250
|
+
file.relative.includes(`__when_buildTool_`) === false) {
|
|
251
|
+
// handled by when markers
|
|
252
|
+
}
|
|
253
|
+
const isEjs = file.relative.endsWith('.ejs');
|
|
254
|
+
const dest = path.join(answers.targetDir, outputRelative);
|
|
255
|
+
await fs.ensureDir(path.dirname(dest));
|
|
256
|
+
if (isEjs) {
|
|
257
|
+
const rendered = await renderTemplate(file.absolute, fullContext);
|
|
258
|
+
await fs.writeFile(dest, rendered, 'utf8');
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
await fs.copy(file.absolute, dest);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Generate package.json programmatically
|
|
265
|
+
spinner.text = 'Writing package.json...';
|
|
266
|
+
const { dependencies, devDependencies } = resolveDependencies(answers);
|
|
267
|
+
const scripts = buildScripts(answers);
|
|
268
|
+
const pkg = {
|
|
269
|
+
name: answers.projectName,
|
|
270
|
+
private: true,
|
|
271
|
+
version: '0.1.0',
|
|
272
|
+
type: 'module',
|
|
273
|
+
scripts,
|
|
274
|
+
dependencies,
|
|
275
|
+
devDependencies,
|
|
276
|
+
};
|
|
277
|
+
if (answers.packageManager === 'npm') {
|
|
278
|
+
pkg.workspaces = ['packages/*'];
|
|
279
|
+
}
|
|
280
|
+
if (answers.buildTool === 'parcel') {
|
|
281
|
+
pkg.alias = {
|
|
282
|
+
'@': './src',
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
pkg['lint-staged'] = {
|
|
286
|
+
[`*.{${answers.language === 'typescript' ? 'ts,tsx' : 'js,jsx'},css,md,json}`]: answers.formatting === 'prettier'
|
|
287
|
+
? ['prettier --write']
|
|
288
|
+
: answers.linting === 'biome'
|
|
289
|
+
? ['biome check --write']
|
|
290
|
+
: ['eslint --fix'],
|
|
291
|
+
};
|
|
292
|
+
await fs.writeJson(path.join(answers.targetDir, 'package.json'), pkg, {
|
|
293
|
+
spaces: 2,
|
|
294
|
+
});
|
|
295
|
+
// Scalable feature-based layout used across large production React apps
|
|
296
|
+
const dirs = [
|
|
297
|
+
'src/app',
|
|
298
|
+
'src/assets',
|
|
299
|
+
'src/components/layout',
|
|
300
|
+
'src/components/ui',
|
|
301
|
+
'src/config',
|
|
302
|
+
'src/features',
|
|
303
|
+
'src/hooks',
|
|
304
|
+
'src/lib',
|
|
305
|
+
'src/routes',
|
|
306
|
+
'src/services',
|
|
307
|
+
'src/store',
|
|
308
|
+
'src/styles',
|
|
309
|
+
'src/types',
|
|
310
|
+
'src/utils',
|
|
311
|
+
'docs/examples',
|
|
312
|
+
'tests',
|
|
313
|
+
'public',
|
|
314
|
+
];
|
|
315
|
+
for (const dir of dirs) {
|
|
316
|
+
await fs.ensureDir(path.join(answers.targetDir, dir));
|
|
317
|
+
}
|
|
318
|
+
spinner.succeed('Project files generated');
|
|
319
|
+
if (answers.installDependencies) {
|
|
320
|
+
const installSpinner = createSpinner(`Installing dependencies with ${answers.packageManager}...`);
|
|
321
|
+
installSpinner.start();
|
|
322
|
+
try {
|
|
323
|
+
const command = answers.packageManager === 'npm'
|
|
324
|
+
? 'npm'
|
|
325
|
+
: answers.packageManager === 'yarn'
|
|
326
|
+
? 'yarn'
|
|
327
|
+
: 'pnpm';
|
|
328
|
+
const args = answers.packageManager === 'yarn' ? [] : ['install'];
|
|
329
|
+
await execa(command, args.length ? args : ['install'], {
|
|
330
|
+
cwd: answers.targetDir,
|
|
331
|
+
stdio: 'pipe',
|
|
332
|
+
});
|
|
333
|
+
installSpinner.succeed('Dependencies installed');
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
installSpinner.warn(`Could not install with ${answers.packageManager}. Run install manually.`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
export function printSuccess(answers) {
|
|
341
|
+
const relative = path.relative(process.cwd(), answers.targetDir) || '.';
|
|
342
|
+
const pm = answers.packageManager;
|
|
343
|
+
const devCmd = pm === 'npm' ? 'npm run dev' : pm === 'yarn' ? 'yarn dev' : 'pnpm dev';
|
|
344
|
+
const installCmd = pm === 'npm' ? 'npm install' : pm === 'yarn' ? 'yarn' : 'pnpm install';
|
|
345
|
+
logger.blank();
|
|
346
|
+
logger.success(`Created ${answers.projectName} at ${relative}`);
|
|
347
|
+
logger.blank();
|
|
348
|
+
logger.info('Next steps:');
|
|
349
|
+
console.log(` cd ${relative}`);
|
|
350
|
+
if (!answers.installDependencies) {
|
|
351
|
+
console.log(` ${installCmd}`);
|
|
352
|
+
}
|
|
353
|
+
console.log(` ${devCmd}`);
|
|
354
|
+
logger.blank();
|
|
355
|
+
logger.dim('Documentation: docs/getting-started.md');
|
|
356
|
+
logger.blank();
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,wBAAsB,GAAG,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC5D;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { collectAnswers } from './prompts/index.js';
|
|
2
|
+
import { generateProject, printSuccess } from './generator/index.js';
|
|
3
|
+
import { logger } from './utils/logger.js';
|
|
4
|
+
import { buildDefaultAnswers, parseArgs, printHelp } from './cli-args.js';
|
|
5
|
+
export async function run(argv = process.argv) {
|
|
6
|
+
const options = parseArgs(argv);
|
|
7
|
+
if (options.help) {
|
|
8
|
+
printHelp();
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const answers = options.defaults
|
|
13
|
+
? buildDefaultAnswers({
|
|
14
|
+
name: options.name,
|
|
15
|
+
dir: options.dir,
|
|
16
|
+
skipInstall: options.skipInstall,
|
|
17
|
+
})
|
|
18
|
+
: await collectAnswers();
|
|
19
|
+
if (options.defaults && options.skipInstall) {
|
|
20
|
+
answers.installDependencies = false;
|
|
21
|
+
}
|
|
22
|
+
if (options.defaults) {
|
|
23
|
+
logger.title('🚀 create-react-starter-kit');
|
|
24
|
+
logger.dim(`Using defaults for "${answers.projectName}" → ${answers.targetDir}\n`);
|
|
25
|
+
}
|
|
26
|
+
await generateProject(answers);
|
|
27
|
+
printSuccess(answers);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof Error && error.message.startsWith('Aborted:')) {
|
|
31
|
+
logger.warn(error.message);
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ;YAC9B,CAAC,CAAC,mBAAmB,CAAC;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC;YACJ,CAAC,CAAC,MAAM,cAAc,EAAE,CAAC;QAE3B,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACtC,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC7C,MAAM,CAAC,GAAG,CACR,uBAAuB,OAAO,CAAC,WAAW,OAAO,OAAO,CAAC,SAAS,IAAI,CACvE,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/B,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,wBAAsB,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,CAkR9D"}
|