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,267 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { resolveTargetDirectory, validateProjectName } from '../utils/validate.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
export async function collectAnswers() {
|
|
7
|
+
logger.title('🚀 create-react-starter-kit');
|
|
8
|
+
logger.dim('Answer each question. Press Enter to accept the default.\n');
|
|
9
|
+
const { projectName } = await inquirer.prompt([
|
|
10
|
+
{
|
|
11
|
+
type: 'input',
|
|
12
|
+
name: 'projectName',
|
|
13
|
+
message: 'What is your project name?',
|
|
14
|
+
default: 'my-react-app',
|
|
15
|
+
validate: validateProjectName,
|
|
16
|
+
},
|
|
17
|
+
]);
|
|
18
|
+
const { targetPath } = await inquirer.prompt([
|
|
19
|
+
{
|
|
20
|
+
type: 'input',
|
|
21
|
+
name: 'targetPath',
|
|
22
|
+
message: 'Where should we create the project?',
|
|
23
|
+
default: `./${projectName}`,
|
|
24
|
+
},
|
|
25
|
+
]);
|
|
26
|
+
const targetDir = resolveTargetDirectory(process.cwd(), projectName, targetPath);
|
|
27
|
+
if (await fs.pathExists(targetDir)) {
|
|
28
|
+
const entries = await fs.readdir(targetDir);
|
|
29
|
+
if (entries.length > 0) {
|
|
30
|
+
const { overwrite } = await inquirer.prompt([
|
|
31
|
+
{
|
|
32
|
+
type: 'confirm',
|
|
33
|
+
name: 'overwrite',
|
|
34
|
+
message: `Directory ${path.relative(process.cwd(), targetDir) || '.'} is not empty. Overwrite?`,
|
|
35
|
+
default: false,
|
|
36
|
+
},
|
|
37
|
+
]);
|
|
38
|
+
if (!overwrite) {
|
|
39
|
+
throw new Error('Aborted: target directory already exists and was not overwritten.');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const stack = await inquirer.prompt([
|
|
44
|
+
{
|
|
45
|
+
type: 'list',
|
|
46
|
+
name: 'buildTool',
|
|
47
|
+
message: 'What build tool do you want to use?',
|
|
48
|
+
choices: [
|
|
49
|
+
{ name: 'Vite', value: 'vite' },
|
|
50
|
+
{ name: 'Webpack', value: 'webpack' },
|
|
51
|
+
{ name: 'Rspack', value: 'rspack' },
|
|
52
|
+
{ name: 'Parcel', value: 'parcel' },
|
|
53
|
+
{ name: 'esbuild', value: 'esbuild' },
|
|
54
|
+
{ name: 'Rollup', value: 'rollup' },
|
|
55
|
+
],
|
|
56
|
+
default: 'vite',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
type: 'list',
|
|
60
|
+
name: 'language',
|
|
61
|
+
message: 'What language do you want to choose?',
|
|
62
|
+
choices: [
|
|
63
|
+
{ name: 'JavaScript', value: 'javascript' },
|
|
64
|
+
{ name: 'TypeScript', value: 'typescript' },
|
|
65
|
+
],
|
|
66
|
+
default: 'typescript',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
type: 'list',
|
|
70
|
+
name: 'router',
|
|
71
|
+
message: 'What routing library do you want to use?',
|
|
72
|
+
choices: [
|
|
73
|
+
{ name: 'React Router (react-router-dom)', value: 'react-router' },
|
|
74
|
+
{ name: 'TanStack Router', value: 'tanstack-router' },
|
|
75
|
+
],
|
|
76
|
+
default: 'react-router',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: 'list',
|
|
80
|
+
name: 'stateManagement',
|
|
81
|
+
message: 'What state management library do you want to use?',
|
|
82
|
+
choices: [
|
|
83
|
+
{ name: 'Redux Toolkit (RTK)', value: 'redux' },
|
|
84
|
+
{ name: 'Zustand', value: 'zustand' },
|
|
85
|
+
{ name: 'Jotai', value: 'jotai' },
|
|
86
|
+
{ name: 'Context API + useReducer', value: 'context' },
|
|
87
|
+
{ name: 'None', value: 'none' },
|
|
88
|
+
],
|
|
89
|
+
default: 'redux',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
type: 'list',
|
|
93
|
+
name: 'serverState',
|
|
94
|
+
message: 'Server State / Data Fetching?',
|
|
95
|
+
choices: (answers) => {
|
|
96
|
+
const choices = [
|
|
97
|
+
{ name: 'TanStack Query', value: 'tanstack-query' },
|
|
98
|
+
{ name: 'SWR', value: 'swr' },
|
|
99
|
+
{ name: 'None', value: 'none' },
|
|
100
|
+
];
|
|
101
|
+
if (answers.stateManagement === 'redux') {
|
|
102
|
+
choices.splice(2, 0, { name: 'RTK Query', value: 'rtk-query' });
|
|
103
|
+
}
|
|
104
|
+
return choices;
|
|
105
|
+
},
|
|
106
|
+
default: (answers) => answers.stateManagement === 'redux' ? 'rtk-query' : 'tanstack-query',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'list',
|
|
110
|
+
name: 'forms',
|
|
111
|
+
message: 'Forms?',
|
|
112
|
+
choices: [
|
|
113
|
+
{ name: 'React Hook Form', value: 'react-hook-form' },
|
|
114
|
+
{ name: 'Formik', value: 'formik' },
|
|
115
|
+
{ name: 'TanStack Form', value: 'tanstack-form' },
|
|
116
|
+
{ name: 'None', value: 'none' },
|
|
117
|
+
],
|
|
118
|
+
default: 'react-hook-form',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'list',
|
|
122
|
+
name: 'validation',
|
|
123
|
+
message: 'Schema Validation?',
|
|
124
|
+
choices: [
|
|
125
|
+
{ name: 'Zod', value: 'zod' },
|
|
126
|
+
{ name: 'Yup', value: 'yup' },
|
|
127
|
+
{ name: 'Valibot', value: 'valibot' },
|
|
128
|
+
{ name: 'Joi', value: 'joi' },
|
|
129
|
+
{ name: 'None', value: 'none' },
|
|
130
|
+
],
|
|
131
|
+
default: 'zod',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'list',
|
|
135
|
+
name: 'styling',
|
|
136
|
+
message: 'Styling?',
|
|
137
|
+
choices: [
|
|
138
|
+
{ name: 'Tailwind CSS', value: 'tailwind' },
|
|
139
|
+
{ name: 'CSS Modules', value: 'css-modules' },
|
|
140
|
+
{ name: 'Styled Components', value: 'styled-components' },
|
|
141
|
+
{ name: 'Sass/SCSS', value: 'sass' },
|
|
142
|
+
],
|
|
143
|
+
default: 'tailwind',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'list',
|
|
147
|
+
name: 'uiLibrary',
|
|
148
|
+
message: 'UI Component Libraries?',
|
|
149
|
+
choices: [
|
|
150
|
+
{ name: 'MUI (Material UI)', value: 'mui' },
|
|
151
|
+
{ name: 'Ant Design', value: 'antd' },
|
|
152
|
+
{ name: 'Chakra UI', value: 'chakra' },
|
|
153
|
+
{ name: 'shadcn/ui', value: 'shadcn' },
|
|
154
|
+
{ name: 'Headless UI', value: 'headless-ui' },
|
|
155
|
+
{ name: 'None', value: 'none' },
|
|
156
|
+
],
|
|
157
|
+
default: 'shadcn',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'list',
|
|
161
|
+
name: 'unitTesting',
|
|
162
|
+
message: 'Unit Testing?',
|
|
163
|
+
choices: [
|
|
164
|
+
{ name: 'Vitest', value: 'vitest' },
|
|
165
|
+
{ name: 'Jest', value: 'jest' },
|
|
166
|
+
{ name: 'React Testing Library (RTL) only', value: 'rtl' },
|
|
167
|
+
{ name: 'None', value: 'none' },
|
|
168
|
+
],
|
|
169
|
+
default: 'vitest',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
type: 'list',
|
|
173
|
+
name: 'e2eTesting',
|
|
174
|
+
message: 'E2E Testing?',
|
|
175
|
+
choices: [
|
|
176
|
+
{ name: 'Playwright', value: 'playwright' },
|
|
177
|
+
{ name: 'Cypress', value: 'cypress' },
|
|
178
|
+
{ name: 'None', value: 'none' },
|
|
179
|
+
],
|
|
180
|
+
default: 'playwright',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: 'list',
|
|
184
|
+
name: 'visualTesting',
|
|
185
|
+
message: 'Component Dev / Visual Testing?',
|
|
186
|
+
choices: [
|
|
187
|
+
{ name: 'Storybook', value: 'storybook' },
|
|
188
|
+
{ name: 'Chromatic', value: 'chromatic' },
|
|
189
|
+
{ name: 'None', value: 'none' },
|
|
190
|
+
],
|
|
191
|
+
default: 'storybook',
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
type: 'list',
|
|
195
|
+
name: 'linting',
|
|
196
|
+
message: 'Linting / Formatting?',
|
|
197
|
+
choices: [
|
|
198
|
+
{ name: 'ESLint', value: 'eslint' },
|
|
199
|
+
{ name: 'Biome', value: 'biome' },
|
|
200
|
+
],
|
|
201
|
+
default: 'eslint',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
type: 'list',
|
|
205
|
+
name: 'formatting',
|
|
206
|
+
message: 'Formatting?',
|
|
207
|
+
choices: [
|
|
208
|
+
{ name: 'Prettier', value: 'prettier' },
|
|
209
|
+
{ name: 'Stylelint', value: 'stylelint' },
|
|
210
|
+
],
|
|
211
|
+
default: 'prettier',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: 'list',
|
|
215
|
+
name: 'apiLayer',
|
|
216
|
+
message: 'API Layer?',
|
|
217
|
+
choices: [
|
|
218
|
+
{ name: 'REST via Axios', value: 'axios' },
|
|
219
|
+
{ name: 'REST via Fetch', value: 'fetch' },
|
|
220
|
+
],
|
|
221
|
+
default: 'axios',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
type: 'list',
|
|
225
|
+
name: 'packageManager',
|
|
226
|
+
message: 'Package Manager?',
|
|
227
|
+
choices: [
|
|
228
|
+
{ name: 'pnpm', value: 'pnpm' },
|
|
229
|
+
{ name: 'yarn', value: 'yarn' },
|
|
230
|
+
{ name: 'npm workspaces', value: 'npm' },
|
|
231
|
+
],
|
|
232
|
+
default: 'pnpm',
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
type: 'list',
|
|
236
|
+
name: 'errorTracking',
|
|
237
|
+
message: 'Error Tracking / Monitoring?',
|
|
238
|
+
choices: [
|
|
239
|
+
{ name: 'Sentry', value: 'sentry' },
|
|
240
|
+
{ name: 'Bugsnag', value: 'bugsnag' },
|
|
241
|
+
{ name: 'LogRocket', value: 'logrocket' },
|
|
242
|
+
{ name: 'Datadog RUM', value: 'datadog' },
|
|
243
|
+
{ name: 'None', value: 'none' },
|
|
244
|
+
],
|
|
245
|
+
default: 'sentry',
|
|
246
|
+
},
|
|
247
|
+
]);
|
|
248
|
+
// Safety: RTK Query requires Redux Toolkit
|
|
249
|
+
if (stack.serverState === 'rtk-query' && stack.stateManagement !== 'redux') {
|
|
250
|
+
stack.serverState = 'tanstack-query';
|
|
251
|
+
}
|
|
252
|
+
const { installDependencies } = await inquirer.prompt([
|
|
253
|
+
{
|
|
254
|
+
type: 'confirm',
|
|
255
|
+
name: 'installDependencies',
|
|
256
|
+
message: 'Install dependencies now?',
|
|
257
|
+
default: true,
|
|
258
|
+
},
|
|
259
|
+
]);
|
|
260
|
+
return {
|
|
261
|
+
projectName,
|
|
262
|
+
targetDir,
|
|
263
|
+
...stack,
|
|
264
|
+
installDependencies,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAEzE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA0B;QACrE;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,mBAAmB;SAC9B;KACF,CAAC,CAAC;IAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;QACnE;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,qCAAqC;YAC9C,OAAO,EAAE,KAAK,WAAW,EAAE;SAC5B;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAEjF,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;gBAClE;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,aAAa,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,IAAI,GAAG,2BAA2B;oBAC/F,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAEjC;QACA;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,qCAAqC;YAC9C,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;aACpC;YACD,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,sCAAsC;YAC/C,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;gBAC3C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;aAC5C;YACD,OAAO,EAAE,YAAY;SACtB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,0CAA0C;YACnD,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,cAAc,EAAE;gBAClE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE;aACtD;YACD,OAAO,EAAE,cAAc;SACxB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,mDAAmD;YAC5D,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC/C,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;gBACjC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,SAAS,EAAE;gBACtD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,OAAO;SACjB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,CAAC,OAAqC,EAAE,EAAE;gBACjD,MAAM,OAAO,GAAG;oBACd,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE;oBACnD,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;oBAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;iBAChC,CAAC;gBACF,IAAI,OAAO,CAAC,eAAe,KAAK,OAAO,EAAE,CAAC;oBACxC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;gBAClE,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,EAAE,CAAC,OAAqC,EAAE,EAAE,CACjD,OAAO,CAAC,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB;SACvE;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE;gBACrD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;gBACjD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,iBAAiB;SAC3B;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,KAAK;SACf;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE;gBAC3C,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;gBAC7C,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,EAAE;gBACzD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;aACrC;YACD,OAAO,EAAE,UAAU;SACpB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,yBAAyB;YAClC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC3C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE;gBACrC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACtC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACtC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;gBAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,QAAQ;SAClB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC1D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,QAAQ;SAClB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;gBAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,YAAY;SACtB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,iCAAiC;YAC1C,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;gBACzC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,WAAW;SACrB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,uBAAuB;YAChC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;aAClC;YACD,OAAO,EAAE,QAAQ;SAClB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;gBACvC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;aAC1C;YACD,OAAO,EAAE,UAAU;SACpB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC1C,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE;aAC3C;YACD,OAAO,EAAE,OAAO;SACjB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE;aACzC;YACD,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;gBACzC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,QAAQ;SAClB;KACF,CAAC,CAAC;IAEH,2CAA2C;IAC3C,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,OAAO,EAAE,CAAC;QAC3E,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;IACvC,CAAC;IAED,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAElD;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,2BAA2B;YACpC,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,SAAS;QACT,GAAG,KAAK;QACR,mBAAmB;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# API
|
|
2
|
+
VITE_API_BASE_URL=https://jsonplaceholder.typicode.com
|
|
3
|
+
|
|
4
|
+
<% if (errorTracking === 'sentry') { -%>
|
|
5
|
+
# Sentry
|
|
6
|
+
VITE_SENTRY_DSN=
|
|
7
|
+
<% } -%>
|
|
8
|
+
<% if (errorTracking === 'bugsnag') { -%>
|
|
9
|
+
# Bugsnag
|
|
10
|
+
VITE_BUGSNAG_API_KEY=
|
|
11
|
+
<% } -%>
|
|
12
|
+
<% if (errorTracking === 'logrocket') { -%>
|
|
13
|
+
# LogRocket
|
|
14
|
+
VITE_LOGROCKET_APP_ID=
|
|
15
|
+
<% } -%>
|
|
16
|
+
<% if (errorTracking === 'datadog') { -%>
|
|
17
|
+
# Datadog RUM
|
|
18
|
+
VITE_DATADOG_APPLICATION_ID=
|
|
19
|
+
VITE_DATADOG_CLIENT_TOKEN=
|
|
20
|
+
VITE_DATADOG_SITE=datadoghq.com
|
|
21
|
+
<% } -%>
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# <%= projectName %>
|
|
2
|
+
|
|
3
|
+
Production-ready React starter generated by **create-react-starter-kit**.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This app ships with a curated stack chosen during scaffolding, a working demo page, and documentation so you can extend the project without re-wiring libraries by hand.
|
|
8
|
+
|
|
9
|
+
## Selected stack
|
|
10
|
+
|
|
11
|
+
| Area | Choice |
|
|
12
|
+
|------|--------|
|
|
13
|
+
| Build tool | <%= stackLabels.buildTool %> |
|
|
14
|
+
| Language | <%= stackLabels.language %> |
|
|
15
|
+
| Routing | <%= stackLabels.router %> |
|
|
16
|
+
| State | <%= stackLabels.stateManagement %> |
|
|
17
|
+
| Server state | <%= stackLabels.serverState %> |
|
|
18
|
+
| Forms | <%= stackLabels.forms %> |
|
|
19
|
+
| Validation | <%= stackLabels.validation %> |
|
|
20
|
+
| Styling | <%= stackLabels.styling %> |
|
|
21
|
+
| UI library | <%= stackLabels.uiLibrary %> |
|
|
22
|
+
| Unit tests | <%= stackLabels.unitTesting %> |
|
|
23
|
+
| E2E tests | <%= stackLabels.e2eTesting %> |
|
|
24
|
+
| Visual | <%= stackLabels.visualTesting %> |
|
|
25
|
+
| Linting | <%= stackLabels.linting %> |
|
|
26
|
+
| Formatting | <%= stackLabels.formatting %> |
|
|
27
|
+
| API layer | <%= stackLabels.apiLayer %> |
|
|
28
|
+
| Package manager | <%= stackLabels.packageManager %> |
|
|
29
|
+
| Error tracking | <%= stackLabels.errorTracking %> |
|
|
30
|
+
| Git hooks | Husky + lint-staged + commitlint |
|
|
31
|
+
| Structure | Feature-based (domain-driven) + `@/` aliases |
|
|
32
|
+
|
|
33
|
+
## Quick start
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
<% if (packageManager === 'pnpm') { -%>
|
|
37
|
+
pnpm install
|
|
38
|
+
pnpm dev
|
|
39
|
+
<% } else if (packageManager === 'yarn') { -%>
|
|
40
|
+
yarn
|
|
41
|
+
yarn dev
|
|
42
|
+
<% } else { -%>
|
|
43
|
+
npm install
|
|
44
|
+
npm run dev
|
|
45
|
+
<% } -%>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Open the URL printed in the terminal (typically `http://localhost:5173`).
|
|
49
|
+
|
|
50
|
+
## Environment setup
|
|
51
|
+
|
|
52
|
+
1. Copy `.env.example` to `.env`.
|
|
53
|
+
2. Fill in API and monitoring keys as needed.
|
|
54
|
+
3. Never commit secrets — `.env` is gitignored.
|
|
55
|
+
|
|
56
|
+
| Variable | Purpose |
|
|
57
|
+
|----------|---------|
|
|
58
|
+
| `VITE_API_BASE_URL` | REST API base URL |
|
|
59
|
+
<% if (errorTracking === 'sentry') { -%>
|
|
60
|
+
| `VITE_SENTRY_DSN` | Sentry DSN |
|
|
61
|
+
<% } -%>
|
|
62
|
+
<% if (errorTracking === 'bugsnag') { -%>
|
|
63
|
+
| `VITE_BUGSNAG_API_KEY` | Bugsnag API key |
|
|
64
|
+
<% } -%>
|
|
65
|
+
<% if (errorTracking === 'logrocket') { -%>
|
|
66
|
+
| `VITE_LOGROCKET_APP_ID` | LogRocket app id |
|
|
67
|
+
<% } -%>
|
|
68
|
+
<% if (errorTracking === 'datadog') { -%>
|
|
69
|
+
| `VITE_DATADOG_APPLICATION_ID` | Datadog application id |
|
|
70
|
+
| `VITE_DATADOG_CLIENT_TOKEN` | Datadog client token |
|
|
71
|
+
<% } -%>
|
|
72
|
+
|
|
73
|
+
## Folder structure
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
src/
|
|
77
|
+
app/ # App shell, providers, bootstrap
|
|
78
|
+
assets/ # Images / media imported from code
|
|
79
|
+
components/ # Shared UI (layout/, ui/)
|
|
80
|
+
config/ # Env helpers / app config
|
|
81
|
+
features/ # Domain modules (scalable default)
|
|
82
|
+
hooks/ # Shared hooks
|
|
83
|
+
lib/ # Third-party wrappers / helpers
|
|
84
|
+
routes/ # Route-level pages
|
|
85
|
+
store/ # Client state
|
|
86
|
+
services/ # API clients
|
|
87
|
+
styles/ # Global styles
|
|
88
|
+
types/ # Shared types
|
|
89
|
+
utils/ # Pure helpers
|
|
90
|
+
docs/ # Architecture & usage docs
|
|
91
|
+
tests/ # Extra test helpers / e2e
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Organization: **feature-based / domain-driven** with `@/` path aliases. See `docs/architecture.md`.
|
|
95
|
+
|
|
96
|
+
## Scripts
|
|
97
|
+
|
|
98
|
+
| Script | Description |
|
|
99
|
+
|--------|-------------|
|
|
100
|
+
| `dev` | Start development server |
|
|
101
|
+
| `build` | Production build |
|
|
102
|
+
<% if (unitTesting !== 'none') { -%>
|
|
103
|
+
| `test` | Unit tests |
|
|
104
|
+
<% } -%>
|
|
105
|
+
<% if (e2eTesting !== 'none') { -%>
|
|
106
|
+
| `test:e2e` | End-to-end tests |
|
|
107
|
+
<% } -%>
|
|
108
|
+
| `lint` | Lint the codebase |
|
|
109
|
+
| `format` | Format sources |
|
|
110
|
+
<% if (visualTesting === 'storybook') { -%>
|
|
111
|
+
| `storybook` | Component workshop |
|
|
112
|
+
<% } -%>
|
|
113
|
+
|
|
114
|
+
## Technology explanations
|
|
115
|
+
|
|
116
|
+
Each selected library includes:
|
|
117
|
+
|
|
118
|
+
- a live example on the home/demo page
|
|
119
|
+
- a short doc under `docs/examples/`
|
|
120
|
+
- when-to-use guidance and a best-practice note
|
|
121
|
+
|
|
122
|
+
Start with `docs/selected-stack.md` and `docs/getting-started.md`.
|
|
123
|
+
|
|
124
|
+
## Example usage
|
|
125
|
+
|
|
126
|
+
The demo page (`/`) shows:
|
|
127
|
+
|
|
128
|
+
- navigation + layout
|
|
129
|
+
<% if (stateManagement !== 'none') { -%>
|
|
130
|
+
- client state (<%= stackLabels.stateManagement %>)
|
|
131
|
+
<% } -%>
|
|
132
|
+
<% if (serverState !== 'none') { -%>
|
|
133
|
+
- data fetching (<%= stackLabels.serverState %>)
|
|
134
|
+
<% } -%>
|
|
135
|
+
<% if (forms !== 'none') { -%>
|
|
136
|
+
- forms (<%= stackLabels.forms %>)
|
|
137
|
+
<% } -%>
|
|
138
|
+
<% if (validation !== 'none') { -%>
|
|
139
|
+
- validation (<%= stackLabels.validation %>)
|
|
140
|
+
<% } -%>
|
|
141
|
+
- styling (<%= stackLabels.styling %>)
|
|
142
|
+
<% if (uiLibrary !== 'none') { -%>
|
|
143
|
+
- UI primitives (<%= stackLabels.uiLibrary %>)
|
|
144
|
+
<% } -%>
|
|
145
|
+
- API integration (<%= stackLabels.apiLayer %>)
|
|
146
|
+
|
|
147
|
+
## Production best practices
|
|
148
|
+
|
|
149
|
+
- Keep secrets out of the client bundle; only expose `VITE_*` (or equivalent) public vars.
|
|
150
|
+
- Prefer feature folders for domain logic; keep `components/` shared and dumb.
|
|
151
|
+
- Gate monitoring behind environment checks.
|
|
152
|
+
- Run lint + unit + e2e in CI before merge.
|
|
153
|
+
- See `docs/best-practices.md` for deeper guidance.
|
|
154
|
+
|
|
155
|
+
## Troubleshooting
|
|
156
|
+
|
|
157
|
+
| Issue | Fix |
|
|
158
|
+
|-------|-----|
|
|
159
|
+
| Port in use | Change the port in your build tool config or kill the process |
|
|
160
|
+
| Module not found | Re-run install with <%= packageManager %> |
|
|
161
|
+
| Env vars undefined | Restart the dev server after editing `.env` |
|
|
162
|
+
| Tailwind classes missing | Confirm `content` paths in `tailwind.config` |
|
|
163
|
+
| Type errors | Run `<%= packageManager === 'npm' ? 'npx' : packageManager %> tsc --noEmit` |
|
|
164
|
+
|
|
165
|
+
More help: `docs/getting-started.md`.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
Generated with [create-react-starter-kit](https://www.npmjs.com/package/create-react-starter-kit) · <%= year %>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
|
2
|
+
|
|
3
|
+
interface ImportMetaEnv {
|
|
4
|
+
readonly VITE_API_BASE_URL?: string;
|
|
5
|
+
readonly VITE_SENTRY_DSN?: string;
|
|
6
|
+
readonly VITE_BUGSNAG_API_KEY?: string;
|
|
7
|
+
readonly VITE_LOGROCKET_APP_ID?: string;
|
|
8
|
+
readonly VITE_DATADOG_APPLICATION_ID?: string;
|
|
9
|
+
readonly VITE_DATADOG_CLIENT_TOKEN?: string;
|
|
10
|
+
readonly VITE_DATADOG_SITE?: string;
|
|
11
|
+
readonly MODE?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface ImportMeta {
|
|
15
|
+
readonly env: ImportMetaEnv;
|
|
16
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"moduleResolution": "bundler",
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"isolatedModules": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"jsx": "react-jsx",
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"baseUrl": ".",
|
|
19
|
+
"paths": {
|
|
20
|
+
"@/*": ["src/*"]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"include": ["src", "tests"]
|
|
24
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import * as esbuild from 'esbuild';
|
|
3
|
+
|
|
4
|
+
await esbuild.build({
|
|
5
|
+
entryPoints: ['src/main.<%= jsxExt %>'],
|
|
6
|
+
bundle: true,
|
|
7
|
+
outfile: 'dist/main.js',
|
|
8
|
+
format: 'esm',
|
|
9
|
+
minify: true,
|
|
10
|
+
sourcemap: true,
|
|
11
|
+
alias: {
|
|
12
|
+
'@': path.resolve('src'),
|
|
13
|
+
},
|
|
14
|
+
loader: {
|
|
15
|
+
'.<%= jsxExt %>': '<%= isTypeScript ? 'tsx' : 'jsx' %>',
|
|
16
|
+
'.css': 'css',
|
|
17
|
+
},
|
|
18
|
+
define: {
|
|
19
|
+
'process.env.NODE_ENV': '"production"',
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
console.log('Built dist/main.js');
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as esbuild from 'esbuild';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
|
|
6
|
+
const ctx = await esbuild.context({
|
|
7
|
+
entryPoints: ['src/main.<%= jsxExt %>'],
|
|
8
|
+
bundle: true,
|
|
9
|
+
outfile: 'dist/main.js',
|
|
10
|
+
format: 'esm',
|
|
11
|
+
sourcemap: true,
|
|
12
|
+
alias: {
|
|
13
|
+
'@': path.resolve('src'),
|
|
14
|
+
},
|
|
15
|
+
loader: {
|
|
16
|
+
'.<%= jsxExt %>': '<%= isTypeScript ? 'tsx' : 'jsx' %>',
|
|
17
|
+
'.css': 'css',
|
|
18
|
+
},
|
|
19
|
+
define: {
|
|
20
|
+
'process.env.NODE_ENV': '"development"',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
await ctx.watch();
|
|
25
|
+
|
|
26
|
+
const server = createServer((req, res) => {
|
|
27
|
+
const url = req.url === '/' ? '/index.html' : req.url;
|
|
28
|
+
const filePath = path.join(process.cwd(), url.startsWith('/dist') ? '.' : '', url === '/index.html' ? 'index.html' : url.slice(1));
|
|
29
|
+
const resolved = url === '/index.html' ? path.join(process.cwd(), 'index.html') : path.join(process.cwd(), url.slice(1));
|
|
30
|
+
if (!existsSync(resolved)) {
|
|
31
|
+
res.writeHead(404);
|
|
32
|
+
res.end('Not found');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const content = readFileSync(resolved);
|
|
36
|
+
const type = resolved.endsWith('.js')
|
|
37
|
+
? 'text/javascript'
|
|
38
|
+
: resolved.endsWith('.css')
|
|
39
|
+
? 'text/css'
|
|
40
|
+
: 'text/html';
|
|
41
|
+
res.writeHead(200, { 'Content-Type': type });
|
|
42
|
+
res.end(content);
|
|
43
|
+
void filePath;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
server.listen(5173, () => {
|
|
47
|
+
console.log('esbuild app at http://localhost:5173');
|
|
48
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import alias from '@rollup/plugin-alias';
|
|
3
|
+
import resolve from '@rollup/plugin-node-resolve';
|
|
4
|
+
import commonjs from '@rollup/plugin-commonjs';
|
|
5
|
+
import replace from '@rollup/plugin-replace';
|
|
6
|
+
<% if (isTypeScript) { -%>
|
|
7
|
+
import typescript from '@rollup/plugin-typescript';
|
|
8
|
+
<% } -%>
|
|
9
|
+
import postcss from 'rollup-plugin-postcss';
|
|
10
|
+
|
|
11
|
+
export default {
|
|
12
|
+
input: 'src/main.<%= jsxExt %>',
|
|
13
|
+
output: {
|
|
14
|
+
file: 'dist/main.js',
|
|
15
|
+
format: 'esm',
|
|
16
|
+
sourcemap: true,
|
|
17
|
+
},
|
|
18
|
+
plugins: [
|
|
19
|
+
alias({
|
|
20
|
+
entries: [{ find: '@', replacement: path.resolve('src') }],
|
|
21
|
+
}),
|
|
22
|
+
replace({
|
|
23
|
+
preventAssignment: true,
|
|
24
|
+
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
|
|
25
|
+
}),
|
|
26
|
+
resolve({ browser: true, extensions: ['.<%= jsxExt %>', '.<%= ext %>', '.js', '.jsx'] }),
|
|
27
|
+
commonjs(),
|
|
28
|
+
<% if (isTypeScript) { -%>
|
|
29
|
+
typescript({ tsconfig: './tsconfig.json' }),
|
|
30
|
+
<% } -%>
|
|
31
|
+
postcss({ extract: true }),
|
|
32
|
+
],
|
|
33
|
+
};
|