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.
Files changed (182) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/bin/create-react-starter-kit.js +7 -0
  4. package/dist/cli-args.d.ts +15 -0
  5. package/dist/cli-args.d.ts.map +1 -0
  6. package/dist/cli-args.js +78 -0
  7. package/dist/cli-args.js.map +1 -0
  8. package/dist/generator/dependencies.d.ts +8 -0
  9. package/dist/generator/dependencies.d.ts.map +1 -0
  10. package/dist/generator/dependencies.js +356 -0
  11. package/dist/generator/dependencies.js.map +1 -0
  12. package/dist/generator/index.d.ts +5 -0
  13. package/dist/generator/index.d.ts.map +1 -0
  14. package/dist/generator/index.js +358 -0
  15. package/dist/generator/index.js.map +1 -0
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +38 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/prompts/index.d.ts +3 -0
  21. package/dist/prompts/index.d.ts.map +1 -0
  22. package/dist/prompts/index.js +267 -0
  23. package/dist/prompts/index.js.map +1 -0
  24. package/dist/templates/.env.example.ejs +21 -0
  25. package/dist/templates/.husky/commit-msg +2 -0
  26. package/dist/templates/.husky/pre-commit +2 -0
  27. package/dist/templates/README.md.ejs +169 -0
  28. package/dist/templates/__js__/jsconfig.json +9 -0
  29. package/dist/templates/__ts__/src/vite-env.d.ts +16 -0
  30. package/dist/templates/__ts__/tsconfig.json +24 -0
  31. package/dist/templates/__when_buildTool_esbuild__/scripts/esbuild.build.mjs.ejs +23 -0
  32. package/dist/templates/__when_buildTool_esbuild__/scripts/esbuild.dev.mjs.ejs +48 -0
  33. package/dist/templates/__when_buildTool_parcel__/.parcelrc +9 -0
  34. package/dist/templates/__when_buildTool_rollup__/rollup.config.js.ejs +33 -0
  35. package/dist/templates/__when_buildTool_rspack__/rspack.config.js.ejs +36 -0
  36. package/dist/templates/__when_buildTool_vite__/vite.config.ts.ejs +37 -0
  37. package/dist/templates/__when_buildTool_webpack__/webpack.config.js.ejs +68 -0
  38. package/dist/templates/__when_e2eTesting_cypress__/cypress/e2e/home.cy.ts.ejs +6 -0
  39. package/dist/templates/__when_e2eTesting_cypress__/cypress.config.ts.ejs +8 -0
  40. package/dist/templates/__when_e2eTesting_playwright__/playwright.config.ts.ejs +16 -0
  41. package/dist/templates/__when_e2eTesting_playwright__/tests/e2e/home.spec.ts.ejs +6 -0
  42. package/dist/templates/__when_formatting_prettier__/.prettierrc +7 -0
  43. package/dist/templates/__when_formatting_stylelint__/.stylelintrc.json +3 -0
  44. package/dist/templates/__when_linting_biome__/biome.json +19 -0
  45. package/dist/templates/__when_linting_eslint__/eslint.config.js.ejs +42 -0
  46. package/dist/templates/__when_serverState_rtk-query__/src/store/postsApi.ts.ejs +19 -0
  47. package/dist/templates/__when_stateManagement_context__/src/store/context.tsx.ejs +57 -0
  48. package/dist/templates/__when_styling_tailwind__/postcss.config.js +6 -0
  49. package/dist/templates/__when_styling_tailwind__/tailwind.config.js.ejs +23 -0
  50. package/dist/templates/__when_unitTesting_jest__/jest.config.json.ejs +11 -0
  51. package/dist/templates/__when_unitTesting_jest__/tests/App.test.tsx.ejs +13 -0
  52. package/dist/templates/__when_unitTesting_jest__/tests/setup.ts.ejs +1 -0
  53. package/dist/templates/__when_unitTesting_jest__/tests/styleMock.ts.ejs +1 -0
  54. package/dist/templates/__when_unitTesting_rtl__/tests/App.test.tsx.ejs +13 -0
  55. package/dist/templates/__when_unitTesting_vitest__/tests/App.test.tsx.ejs +16 -0
  56. package/dist/templates/__when_unitTesting_vitest__/tests/setup.ts.ejs +1 -0
  57. package/dist/templates/__when_visualTesting_storybook__/.storybook/main.js.ejs +11 -0
  58. package/dist/templates/__when_visualTesting_storybook__/.storybook/preview.js +8 -0
  59. package/dist/templates/__when_visualTesting_storybook__/src/components/ui/UiButton.stories.tsx.ejs +15 -0
  60. package/dist/templates/commitlint.config.js +3 -0
  61. package/dist/templates/docs/architecture.md.ejs +74 -0
  62. package/dist/templates/docs/best-practices.md.ejs +56 -0
  63. package/dist/templates/docs/examples/README.md.ejs +14 -0
  64. package/dist/templates/docs/examples/api.md.ejs +17 -0
  65. package/dist/templates/docs/examples/data-fetching.md.ejs +18 -0
  66. package/dist/templates/docs/examples/forms.md.ejs +18 -0
  67. package/dist/templates/docs/examples/state.md.ejs +17 -0
  68. package/dist/templates/docs/examples/styling.md.ejs +23 -0
  69. package/dist/templates/docs/examples/testing.md.ejs +27 -0
  70. package/dist/templates/docs/getting-started.md.ejs +55 -0
  71. package/dist/templates/docs/selected-stack.md.ejs +55 -0
  72. package/dist/templates/index.html.ejs +19 -0
  73. package/dist/templates/public/vite.svg +4 -0
  74. package/dist/templates/src/app/App.tsx.ejs +71 -0
  75. package/dist/templates/src/app/providers.tsx.ejs +93 -0
  76. package/dist/templates/src/assets/.gitkeep +0 -0
  77. package/dist/templates/src/components/StackBadge.tsx.ejs +15 -0
  78. package/dist/templates/src/components/layout/AppLayout.tsx.ejs +64 -0
  79. package/dist/templates/src/components/ui/Toast.tsx.ejs +61 -0
  80. package/dist/templates/src/components/ui/UiButton.tsx.ejs +168 -0
  81. package/dist/templates/src/config/env.ts.ejs +18 -0
  82. package/dist/templates/src/features/counter/CounterPanel.tsx.ejs +66 -0
  83. package/dist/templates/src/features/feedback/FeedbackForm.tsx.ejs +373 -0
  84. package/dist/templates/src/features/posts/PostsPanel.tsx.ejs +91 -0
  85. package/dist/templates/src/hooks/useMounted.ts.ejs +15 -0
  86. package/dist/templates/src/lib/cn.ts.ejs +12 -0
  87. package/dist/templates/src/lib/monitoring.ts.ejs +66 -0
  88. package/dist/templates/src/lib/validation.ts.ejs +81 -0
  89. package/dist/templates/src/main.tsx.ejs +22 -0
  90. package/dist/templates/src/routes/AboutPage.tsx.ejs +30 -0
  91. package/dist/templates/src/routes/HomePage.tsx.ejs +47 -0
  92. package/dist/templates/src/services/api.ts.ejs +84 -0
  93. package/dist/templates/src/store/index.ts.ejs +80 -0
  94. package/dist/templates/src/styles/global.css.ejs +457 -0
  95. package/dist/templates/src/types/index.ts.ejs +7 -0
  96. package/dist/templates/src/utils/format.ts.ejs +3 -0
  97. package/dist/types.d.ts +46 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +2 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/utils/logger.d.ts +12 -0
  102. package/dist/utils/logger.d.ts.map +1 -0
  103. package/dist/utils/logger.js +31 -0
  104. package/dist/utils/logger.js.map +1 -0
  105. package/dist/utils/validate.d.ts +3 -0
  106. package/dist/utils/validate.d.ts.map +1 -0
  107. package/dist/utils/validate.js +24 -0
  108. package/dist/utils/validate.js.map +1 -0
  109. package/package.json +62 -0
  110. package/templates/.env.example.ejs +21 -0
  111. package/templates/.husky/commit-msg +2 -0
  112. package/templates/.husky/pre-commit +2 -0
  113. package/templates/README.md.ejs +169 -0
  114. package/templates/__js__/jsconfig.json +9 -0
  115. package/templates/__ts__/src/vite-env.d.ts +16 -0
  116. package/templates/__ts__/tsconfig.json +24 -0
  117. package/templates/__when_buildTool_esbuild__/scripts/esbuild.build.mjs.ejs +23 -0
  118. package/templates/__when_buildTool_esbuild__/scripts/esbuild.dev.mjs.ejs +48 -0
  119. package/templates/__when_buildTool_parcel__/.parcelrc +9 -0
  120. package/templates/__when_buildTool_rollup__/rollup.config.js.ejs +33 -0
  121. package/templates/__when_buildTool_rspack__/rspack.config.js.ejs +36 -0
  122. package/templates/__when_buildTool_vite__/vite.config.ts.ejs +37 -0
  123. package/templates/__when_buildTool_webpack__/webpack.config.js.ejs +68 -0
  124. package/templates/__when_e2eTesting_cypress__/cypress/e2e/home.cy.ts.ejs +6 -0
  125. package/templates/__when_e2eTesting_cypress__/cypress.config.ts.ejs +8 -0
  126. package/templates/__when_e2eTesting_playwright__/playwright.config.ts.ejs +16 -0
  127. package/templates/__when_e2eTesting_playwright__/tests/e2e/home.spec.ts.ejs +6 -0
  128. package/templates/__when_formatting_prettier__/.prettierrc +7 -0
  129. package/templates/__when_formatting_stylelint__/.stylelintrc.json +3 -0
  130. package/templates/__when_linting_biome__/biome.json +19 -0
  131. package/templates/__when_linting_eslint__/eslint.config.js.ejs +42 -0
  132. package/templates/__when_serverState_rtk-query__/src/store/postsApi.ts.ejs +19 -0
  133. package/templates/__when_stateManagement_context__/src/store/context.tsx.ejs +57 -0
  134. package/templates/__when_styling_tailwind__/postcss.config.js +6 -0
  135. package/templates/__when_styling_tailwind__/tailwind.config.js.ejs +23 -0
  136. package/templates/__when_unitTesting_jest__/jest.config.json.ejs +11 -0
  137. package/templates/__when_unitTesting_jest__/tests/App.test.tsx.ejs +13 -0
  138. package/templates/__when_unitTesting_jest__/tests/setup.ts.ejs +1 -0
  139. package/templates/__when_unitTesting_jest__/tests/styleMock.ts.ejs +1 -0
  140. package/templates/__when_unitTesting_rtl__/tests/App.test.tsx.ejs +13 -0
  141. package/templates/__when_unitTesting_vitest__/tests/App.test.tsx.ejs +16 -0
  142. package/templates/__when_unitTesting_vitest__/tests/setup.ts.ejs +1 -0
  143. package/templates/__when_visualTesting_storybook__/.storybook/main.js.ejs +11 -0
  144. package/templates/__when_visualTesting_storybook__/.storybook/preview.js +8 -0
  145. package/templates/__when_visualTesting_storybook__/src/components/ui/UiButton.stories.tsx.ejs +15 -0
  146. package/templates/commitlint.config.js +3 -0
  147. package/templates/docs/architecture.md.ejs +74 -0
  148. package/templates/docs/best-practices.md.ejs +56 -0
  149. package/templates/docs/examples/README.md.ejs +14 -0
  150. package/templates/docs/examples/api.md.ejs +17 -0
  151. package/templates/docs/examples/data-fetching.md.ejs +18 -0
  152. package/templates/docs/examples/forms.md.ejs +18 -0
  153. package/templates/docs/examples/state.md.ejs +17 -0
  154. package/templates/docs/examples/styling.md.ejs +23 -0
  155. package/templates/docs/examples/testing.md.ejs +27 -0
  156. package/templates/docs/getting-started.md.ejs +55 -0
  157. package/templates/docs/selected-stack.md.ejs +55 -0
  158. package/templates/index.html.ejs +19 -0
  159. package/templates/public/vite.svg +4 -0
  160. package/templates/src/app/App.tsx.ejs +71 -0
  161. package/templates/src/app/providers.tsx.ejs +93 -0
  162. package/templates/src/assets/.gitkeep +0 -0
  163. package/templates/src/components/StackBadge.tsx.ejs +15 -0
  164. package/templates/src/components/layout/AppLayout.tsx.ejs +64 -0
  165. package/templates/src/components/ui/Toast.tsx.ejs +61 -0
  166. package/templates/src/components/ui/UiButton.tsx.ejs +168 -0
  167. package/templates/src/config/env.ts.ejs +18 -0
  168. package/templates/src/features/counter/CounterPanel.tsx.ejs +66 -0
  169. package/templates/src/features/feedback/FeedbackForm.tsx.ejs +373 -0
  170. package/templates/src/features/posts/PostsPanel.tsx.ejs +91 -0
  171. package/templates/src/hooks/useMounted.ts.ejs +15 -0
  172. package/templates/src/lib/cn.ts.ejs +12 -0
  173. package/templates/src/lib/monitoring.ts.ejs +66 -0
  174. package/templates/src/lib/validation.ts.ejs +81 -0
  175. package/templates/src/main.tsx.ejs +22 -0
  176. package/templates/src/routes/AboutPage.tsx.ejs +30 -0
  177. package/templates/src/routes/HomePage.tsx.ejs +47 -0
  178. package/templates/src/services/api.ts.ejs +84 -0
  179. package/templates/src/store/index.ts.ejs +80 -0
  180. package/templates/src/styles/global.css.ejs +457 -0
  181. package/templates/src/types/index.ts.ejs +7 -0
  182. 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":"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"}
@@ -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,2 @@
1
+ #!/usr/bin/env sh
2
+ npx --no -- commitlint --edit "$1"
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env sh
2
+ npx lint-staged
@@ -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,9 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": ".",
4
+ "paths": {
5
+ "@/*": ["src/*"]
6
+ }
7
+ },
8
+ "include": ["src", "tests"]
9
+ }
@@ -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,9 @@
1
+ {
2
+ "extends": "parcel-bundler/lib/utils",
3
+ "source": "index.html",
4
+ "targets": {
5
+ "default": {
6
+ "distDir": "./dist"
7
+ }
8
+ }
9
+ }
@@ -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
+ };