@react-spa-scaffold/mcp 1.1.1 → 1.1.3
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/README.md +2 -1
- package/dist/features/index.d.ts +0 -1
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +0 -1
- package/dist/features/index.js.map +1 -1
- package/dist/features/registry.d.ts +4 -0
- package/dist/features/registry.d.ts.map +1 -1
- package/dist/features/registry.js +144 -113
- package/dist/features/registry.js.map +1 -1
- package/dist/features/types.d.ts +12 -2
- package/dist/features/types.d.ts.map +1 -1
- package/dist/tools/get-example.d.ts.map +1 -1
- package/dist/tools/get-example.js +3 -2
- package/dist/tools/get-example.js.map +1 -1
- package/dist/tools/get-features.d.ts.map +1 -1
- package/dist/tools/get-features.js +2 -1
- package/dist/tools/get-features.js.map +1 -1
- package/dist/tools/get-scaffold.d.ts.map +1 -1
- package/dist/tools/get-scaffold.js +12 -64
- package/dist/tools/get-scaffold.js.map +1 -1
- package/dist/utils/examples.d.ts.map +1 -1
- package/dist/utils/examples.js +40 -4
- package/dist/utils/examples.js.map +1 -1
- package/dist/utils/scaffold.d.ts +9 -5
- package/dist/utils/scaffold.d.ts.map +1 -1
- package/dist/utils/scaffold.js +81 -17
- package/dist/utils/scaffold.js.map +1 -1
- package/package.json +1 -1
- package/templates/.github/actions/setup-node-deps/action.yml +1 -0
- package/templates/.github/workflows/ci.yml +35 -63
- package/templates/.github/workflows/release.yml +37 -0
- package/templates/CLAUDE.md +5 -3
- package/templates/docs/ARCHITECTURE.md +0 -1
- package/templates/docs/COMPONENT_GUIDELINES.md +1 -1
- package/templates/docs/E2E_TESTING.md +22 -7
- package/templates/docs/TESTING.md +2 -14
- package/templates/docs/WORKFLOW.md +5 -5
- package/templates/e2e/performance/home.spec.ts +94 -0
- package/templates/e2e/performance/setup.ts +9 -0
- package/templates/e2e/tests/home.spec.ts +2 -2
- package/templates/gitignore +1 -1
- package/templates/package.json +18 -7
- package/templates/playwright.config.ts +15 -3
- package/templates/src/contexts/performanceContext.test.tsx +51 -0
- package/templates/src/contexts/performanceContext.tsx +64 -0
- package/templates/src/main.tsx +5 -2
- package/templates/src/pages/Home.tsx +38 -33
- package/templates/src/test/providers.tsx +5 -1
- package/templates/vitest.config.ts +1 -1
- package/templates/lighthouse-budget.json +0 -17
- package/templates/lighthouserc.json +0 -23
- /package/templates/{tests/unit/components → src/components/layout}/Header.test.tsx +0 -0
- /package/templates/{tests/unit/components → src/components/shared/ErrorBoundary}/ErrorBoundary.test.tsx +0 -0
- /package/templates/{tests/unit/components → src/components/shared/LanguageSwitcher}/LanguageSwitcher.test.tsx +0 -0
- /package/templates/{tests/unit/components → src/components/shared/RegisterForm}/RegisterForm.test.tsx +0 -0
- /package/templates/{tests/unit/components → src/components/shared/SEO}/SEO.test.tsx +0 -0
- /package/templates/{tests/unit/components → src/components/shared/ThemeToggle}/ThemeToggle.test.tsx +0 -0
- /package/templates/{tests/unit/components/Loading.test.tsx → src/components/ui/loading.test.tsx} +0 -0
- /package/templates/{tests/unit → src}/contexts/mobileContext.test.tsx +0 -0
- /package/templates/{tests/unit → src}/hooks/useExampleQuery.test.tsx +0 -0
- /package/templates/{tests/unit → src}/hooks/useLanguage.test.tsx +0 -0
- /package/templates/{tests/unit → src}/hooks/useMediaQuery.test.ts +0 -0
- /package/templates/{tests/unit → src}/hooks/useRegisterForm.test.tsx +0 -0
- /package/templates/{tests/unit → src}/hooks/useThemeEffect.test.ts +0 -0
- /package/templates/{tests/unit → src}/i18n/detectLanguage.test.ts +0 -0
- /package/templates/{tests/unit → src}/i18n/loadCatalog.test.ts +0 -0
- /package/templates/{tests/unit → src}/lib/api.test.ts +0 -0
- /package/templates/{tests/unit → src}/lib/storage.test.ts +0 -0
- /package/templates/{tests/unit → src}/lib/utils.test.ts +0 -0
- /package/templates/{tests/unit → src}/lib/validations.test.ts +0 -0
- /package/templates/{tests/unit → src}/stores/preferencesStore.test.ts +0 -0
package/README.md
CHANGED
|
@@ -117,8 +117,9 @@ Or point directly to the built file:
|
|
|
117
117
|
| `api` | TanStack Query + API client | Optional |
|
|
118
118
|
| `i18n` | LinguiJS internationalization | Optional |
|
|
119
119
|
| `testing` | Vitest + Playwright + MSW | Optional |
|
|
120
|
+
| `performance` | React Profiler + Lighthouse + Web Vitals | Optional |
|
|
120
121
|
| `devtools` | ESLint + Prettier + Husky | Optional |
|
|
121
|
-
| `ci` | GitHub Actions +
|
|
122
|
+
| `ci` | GitHub Actions + Dependabot | Optional |
|
|
122
123
|
| `observability` | Sentry error tracking | Optional |
|
|
123
124
|
|
|
124
125
|
## Tools
|
package/dist/features/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { FEATURES, FEATURE_IDS } from './registry.js';
|
|
2
2
|
export type { FeatureId } from './registry.js';
|
|
3
|
-
export { CONFIG_VERSIONS } from './versions.js';
|
|
4
3
|
export type { Feature, FeatureRegistry, FeatureOption, ScaffoldOptions, ScaffoldResult } from './types.js';
|
|
5
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/features/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Feature Registry - Defines all available features for react-spa-scaffold scaffolding
|
|
3
|
+
*
|
|
4
|
+
* Dependencies are specified as names only. Versions are resolved from the
|
|
5
|
+
* webapp-base package.json at runtime to ensure scaffolded projects always
|
|
6
|
+
* get up-to-date dependency versions.
|
|
3
7
|
*/
|
|
4
8
|
import type { FeatureRegistry } from './types.js';
|
|
5
9
|
export declare const FEATURES: FeatureRegistry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/features/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/features/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAW,eAAe,EAAE,MAAM,YAAY,CAAC;AAkkB3D,eAAO,MAAM,QAAQ,EAAE,eAetB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,WAAW,EAA4B,CAAC,MAAM,OAAO,QAAQ,CAAC,EAAE,CAAC;AAE9E,mDAAmD;AACnD,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Feature Registry - Defines all available features for react-spa-scaffold scaffolding
|
|
3
|
+
*
|
|
4
|
+
* Dependencies are specified as names only. Versions are resolved from the
|
|
5
|
+
* webapp-base package.json at runtime to ensure scaffolded projects always
|
|
6
|
+
* get up-to-date dependency versions.
|
|
3
7
|
*/
|
|
4
|
-
import { CONFIG_VERSIONS } from './versions.js';
|
|
5
8
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
6
9
|
// CORE FEATURE (Always included)
|
|
7
10
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -21,25 +24,18 @@ const core = {
|
|
|
21
24
|
'Type definitions',
|
|
22
25
|
'ErrorBoundary component with reset functionality',
|
|
23
26
|
],
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
'react
|
|
29
|
-
'
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
|
|
36
|
-
'@types/react-dom': '^19.1.6',
|
|
37
|
-
'@vitejs/plugin-react': '^5.1.2',
|
|
38
|
-
'@react-spa-scaffold/tsconfig': CONFIG_VERSIONS['@react-spa-scaffold/tsconfig'],
|
|
39
|
-
tailwindcss: '^4.1.17',
|
|
40
|
-
typescript: '~5.9.0',
|
|
41
|
-
vite: '^7.0.0',
|
|
42
|
-
},
|
|
27
|
+
dependencyNames: ['@fontsource-variable/inter', 'clsx', 'react', 'react-dom', 'tailwind-merge', 'zod'],
|
|
28
|
+
devDependencyNames: [
|
|
29
|
+
'@tailwindcss/vite',
|
|
30
|
+
'@types/node',
|
|
31
|
+
'@types/react',
|
|
32
|
+
'@types/react-dom',
|
|
33
|
+
'@vitejs/plugin-react',
|
|
34
|
+
'@react-spa-scaffold/tsconfig',
|
|
35
|
+
'tailwindcss',
|
|
36
|
+
'typescript',
|
|
37
|
+
'vite',
|
|
38
|
+
],
|
|
43
39
|
files: [
|
|
44
40
|
'src/main.tsx',
|
|
45
41
|
'src/App.tsx',
|
|
@@ -65,6 +61,12 @@ const core = {
|
|
|
65
61
|
'.gitignore',
|
|
66
62
|
'public/favicon.svg',
|
|
67
63
|
],
|
|
64
|
+
testFiles: [
|
|
65
|
+
'src/lib/utils.test.ts',
|
|
66
|
+
'src/components/shared/SEO/SEO.test.tsx',
|
|
67
|
+
'src/components/shared/ErrorBoundary/ErrorBoundary.test.tsx',
|
|
68
|
+
'e2e/tests/home.spec.ts',
|
|
69
|
+
],
|
|
68
70
|
patterns: ['component-shared', 'hook-effect', 'error-boundary', 'seo-component'],
|
|
69
71
|
scripts: {
|
|
70
72
|
dev: 'vite',
|
|
@@ -97,9 +99,9 @@ const mobile = {
|
|
|
97
99
|
'requestAnimationFrame-debounced resize handling',
|
|
98
100
|
'SSR-safe viewport detection with fallbacks',
|
|
99
101
|
],
|
|
100
|
-
dependencies
|
|
101
|
-
devDependencies: {},
|
|
102
|
+
// No additional dependencies - pure React implementation
|
|
102
103
|
files: ['src/contexts/mobileContext.tsx', 'src/hooks/useMediaQuery.ts', 'src/hooks/useTouchSizes.ts'],
|
|
104
|
+
testFiles: ['src/contexts/mobileContext.test.tsx', 'src/hooks/useMediaQuery.test.ts'],
|
|
103
105
|
patterns: ['mobile-context', 'use-media-query', 'use-touch-sizes'],
|
|
104
106
|
scripts: {},
|
|
105
107
|
};
|
|
@@ -118,10 +120,7 @@ const routing = {
|
|
|
118
120
|
'App.tsx with Suspense fallback',
|
|
119
121
|
'PageLoading component for transitions',
|
|
120
122
|
],
|
|
121
|
-
|
|
122
|
-
'react-router': '^7.11.0',
|
|
123
|
-
},
|
|
124
|
-
devDependencies: {},
|
|
123
|
+
dependencyNames: ['react-router'],
|
|
125
124
|
files: [
|
|
126
125
|
// routes.ts is generated dynamically (see routesTs in scaffold output)
|
|
127
126
|
'src/pages/Home.tsx',
|
|
@@ -130,6 +129,7 @@ const routing = {
|
|
|
130
129
|
'src/components/ui/loading.tsx',
|
|
131
130
|
'src/components/ui/visually-hidden.tsx',
|
|
132
131
|
],
|
|
132
|
+
testFiles: ['e2e/tests/navigation.spec.ts'],
|
|
133
133
|
patterns: ['lazy-page', 'route-constants', 'page-component'],
|
|
134
134
|
scripts: {},
|
|
135
135
|
};
|
|
@@ -153,17 +153,15 @@ const ui = {
|
|
|
153
153
|
'VisuallyHidden and SkipLink (accessibility)',
|
|
154
154
|
'components.json for shadcn CLI',
|
|
155
155
|
],
|
|
156
|
-
|
|
157
|
-
'@radix-ui/react-slot'
|
|
158
|
-
'class-variance-authority'
|
|
159
|
-
'lucide-react'
|
|
160
|
-
'radix-ui'
|
|
161
|
-
sonner
|
|
162
|
-
'tw-animate-css'
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
shadcn: '^3.6.2',
|
|
166
|
-
},
|
|
156
|
+
dependencyNames: [
|
|
157
|
+
'@radix-ui/react-slot',
|
|
158
|
+
'class-variance-authority',
|
|
159
|
+
'lucide-react',
|
|
160
|
+
'radix-ui',
|
|
161
|
+
'sonner',
|
|
162
|
+
'tw-animate-css',
|
|
163
|
+
],
|
|
164
|
+
devDependencyNames: ['shadcn'],
|
|
167
165
|
files: [
|
|
168
166
|
'src/components/ui/button.tsx',
|
|
169
167
|
'src/components/ui/dropdown-menu.tsx',
|
|
@@ -176,6 +174,7 @@ const ui = {
|
|
|
176
174
|
'src/components/layout/index.ts',
|
|
177
175
|
'components.json',
|
|
178
176
|
],
|
|
177
|
+
testFiles: ['src/components/ui/loading.test.tsx', 'src/components/layout/Header.test.tsx'],
|
|
179
178
|
patterns: ['component-ui', 'button-variants', 'forward-ref-component'],
|
|
180
179
|
scripts: {},
|
|
181
180
|
configFiles: ['components.json'],
|
|
@@ -195,12 +194,11 @@ const forms = {
|
|
|
195
194
|
'useRegisterForm custom hook pattern',
|
|
196
195
|
'Zod schema with refine() for cross-field validation',
|
|
197
196
|
],
|
|
198
|
-
|
|
199
|
-
'@hookform/resolvers'
|
|
200
|
-
'react-hook-form'
|
|
197
|
+
dependencyNames: [
|
|
198
|
+
'@hookform/resolvers',
|
|
199
|
+
'react-hook-form',
|
|
201
200
|
// zod already in core
|
|
202
|
-
|
|
203
|
-
devDependencies: {},
|
|
201
|
+
],
|
|
204
202
|
files: [
|
|
205
203
|
'src/lib/validations.ts',
|
|
206
204
|
'src/hooks/useRegisterForm.ts',
|
|
@@ -211,6 +209,11 @@ const forms = {
|
|
|
211
209
|
'src/components/shared/RegisterForm/RegisterForm.tsx',
|
|
212
210
|
'src/components/shared/RegisterForm/index.ts',
|
|
213
211
|
],
|
|
212
|
+
testFiles: [
|
|
213
|
+
'src/lib/validations.test.ts',
|
|
214
|
+
'src/hooks/useRegisterForm.test.tsx',
|
|
215
|
+
'src/components/shared/RegisterForm/RegisterForm.test.tsx',
|
|
216
|
+
],
|
|
214
217
|
patterns: ['zod-schema', 'hook-form', 'form-error-component', 'register-form'],
|
|
215
218
|
scripts: {},
|
|
216
219
|
};
|
|
@@ -231,10 +234,7 @@ const state = {
|
|
|
231
234
|
'Example preferences store (theme)',
|
|
232
235
|
'Type-safe store selectors',
|
|
233
236
|
],
|
|
234
|
-
|
|
235
|
-
zustand: '^5.0.9',
|
|
236
|
-
},
|
|
237
|
-
devDependencies: {},
|
|
237
|
+
dependencyNames: ['zustand'],
|
|
238
238
|
files: [
|
|
239
239
|
'src/stores/preferencesStore.ts',
|
|
240
240
|
'src/stores/index.ts',
|
|
@@ -242,6 +242,7 @@ const state = {
|
|
|
242
242
|
'src/lib/storageKeys.ts',
|
|
243
243
|
'src/types/preferences.ts',
|
|
244
244
|
],
|
|
245
|
+
testFiles: ['src/lib/storage.test.ts', 'src/stores/preferencesStore.test.ts'],
|
|
245
246
|
patterns: ['zustand-store', 'store-persistence', 'multi-tab-sync', 'storage-utility'],
|
|
246
247
|
scripts: {},
|
|
247
248
|
};
|
|
@@ -261,11 +262,9 @@ const api = {
|
|
|
261
262
|
'Example useExampleQuery hook',
|
|
262
263
|
'API types (Todo, PaginatedResponse, etc.)',
|
|
263
264
|
],
|
|
264
|
-
|
|
265
|
-
'@tanstack/react-query': '^5.81.5',
|
|
266
|
-
},
|
|
267
|
-
devDependencies: {},
|
|
265
|
+
dependencyNames: ['@tanstack/react-query'],
|
|
268
266
|
files: ['src/lib/api.ts', 'src/contexts/queryContext.tsx', 'src/hooks/useExampleQuery.ts', 'src/types/api.ts'],
|
|
267
|
+
testFiles: ['src/lib/api.test.ts', 'src/hooks/useExampleQuery.test.tsx'],
|
|
269
268
|
patterns: ['query-provider', 'use-query-hook', 'api-client'],
|
|
270
269
|
scripts: {},
|
|
271
270
|
};
|
|
@@ -288,17 +287,14 @@ const i18n = {
|
|
|
288
287
|
'Vite plugin for compilation',
|
|
289
288
|
'useLanguage hook',
|
|
290
289
|
],
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
'@lingui/
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
'
|
|
297
|
-
'
|
|
298
|
-
|
|
299
|
-
'babel-plugin-macros': '^3.1.0',
|
|
300
|
-
'eslint-plugin-lingui': '^0.11.0',
|
|
301
|
-
},
|
|
290
|
+
dependencyNames: ['@lingui/core', '@lingui/react'],
|
|
291
|
+
devDependencyNames: [
|
|
292
|
+
'@lingui/babel-plugin-lingui-macro',
|
|
293
|
+
'@lingui/cli',
|
|
294
|
+
'@lingui/vite-plugin',
|
|
295
|
+
'babel-plugin-macros',
|
|
296
|
+
'eslint-plugin-lingui',
|
|
297
|
+
],
|
|
302
298
|
files: [
|
|
303
299
|
'src/i18n/config.ts',
|
|
304
300
|
'src/i18n/detectLanguage.ts',
|
|
@@ -312,7 +308,14 @@ const i18n = {
|
|
|
312
308
|
'src/components/shared/LanguageSwitcher/index.ts',
|
|
313
309
|
'lingui.config.js',
|
|
314
310
|
],
|
|
315
|
-
|
|
311
|
+
testFiles: [
|
|
312
|
+
'src/i18n/detectLanguage.test.ts',
|
|
313
|
+
'src/i18n/loadCatalog.test.ts',
|
|
314
|
+
'src/hooks/useLanguage.test.tsx',
|
|
315
|
+
'src/components/shared/LanguageSwitcher/LanguageSwitcher.test.tsx',
|
|
316
|
+
'e2e/tests/language.spec.ts',
|
|
317
|
+
],
|
|
318
|
+
patterns: ['i18n-index', 'trans-component', 't-function', 'language-switcher', 'use-language-hook'],
|
|
316
319
|
scripts: {
|
|
317
320
|
'i18n:extract': 'lingui extract',
|
|
318
321
|
},
|
|
@@ -337,17 +340,16 @@ const testing = {
|
|
|
337
340
|
'MSW handlers for API endpoints',
|
|
338
341
|
'Test fixtures for mock data',
|
|
339
342
|
],
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
'@
|
|
343
|
-
'@testing-library/
|
|
344
|
-
'@testing-library/
|
|
345
|
-
'@
|
|
346
|
-
'
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
},
|
|
343
|
+
devDependencyNames: [
|
|
344
|
+
'@playwright/test',
|
|
345
|
+
'@testing-library/jest-dom',
|
|
346
|
+
'@testing-library/react',
|
|
347
|
+
'@testing-library/user-event',
|
|
348
|
+
'@vitest/coverage-v8',
|
|
349
|
+
'jsdom',
|
|
350
|
+
'msw',
|
|
351
|
+
'vitest',
|
|
352
|
+
],
|
|
351
353
|
files: [
|
|
352
354
|
'src/test-setup.ts',
|
|
353
355
|
'src/test/mocks.ts',
|
|
@@ -359,22 +361,54 @@ const testing = {
|
|
|
359
361
|
'src/mocks/fixtures/index.ts',
|
|
360
362
|
'src/mocks/node.ts',
|
|
361
363
|
'src/mocks/index.ts',
|
|
362
|
-
'
|
|
364
|
+
'e2e/fixtures/',
|
|
363
365
|
'e2e/tests/',
|
|
364
366
|
'vitest.config.ts',
|
|
365
367
|
'playwright.config.ts',
|
|
368
|
+
'docs/TESTING.md',
|
|
369
|
+
'docs/E2E_TESTING.md',
|
|
366
370
|
],
|
|
367
371
|
patterns: ['test-component', 'test-hook', 'test-store', 'test-utility', 'msw-handler', 'test-fixture'],
|
|
368
372
|
scripts: {
|
|
369
373
|
test: 'vitest run',
|
|
370
374
|
'test:watch': 'vitest',
|
|
371
375
|
'test:coverage': 'vitest run --coverage',
|
|
372
|
-
e2e: 'playwright test',
|
|
373
|
-
'e2e:ui': 'playwright test --ui',
|
|
376
|
+
e2e: 'playwright test --project=functional',
|
|
377
|
+
'e2e:ui': 'playwright test --project=functional --ui',
|
|
374
378
|
},
|
|
375
379
|
configFiles: ['vitest.config.ts', 'playwright.config.ts', 'src/test-setup.ts'],
|
|
376
380
|
};
|
|
377
381
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
382
|
+
// PERFORMANCE TESTING FEATURE
|
|
383
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
384
|
+
const performance = {
|
|
385
|
+
name: 'Performance Testing',
|
|
386
|
+
description: 'React Profiler + Lighthouse + Web Vitals via react-performance-tracking',
|
|
387
|
+
required: false,
|
|
388
|
+
includes: [
|
|
389
|
+
'react-performance-tracking for unified performance testing',
|
|
390
|
+
'React Profiler metrics (render duration, re-renders)',
|
|
391
|
+
'Lighthouse audits (performance, accessibility, best practices)',
|
|
392
|
+
'Core Web Vitals (LCP, INP, CLS)',
|
|
393
|
+
'FPS monitoring (Chromium only)',
|
|
394
|
+
'PerformanceProviderWrapper with lazy loading (zero prod overhead)',
|
|
395
|
+
'Safe usePerformance hook (never throws)',
|
|
396
|
+
'Separate Playwright project for performance tests',
|
|
397
|
+
'CI-optimized Chrome flags (--no-sandbox)',
|
|
398
|
+
],
|
|
399
|
+
dependencyNames: ['react-performance-tracking'],
|
|
400
|
+
devDependencyNames: ['chrome-launcher', 'lighthouse'],
|
|
401
|
+
files: ['src/contexts/performanceContext.tsx', 'e2e/performance/setup.ts'],
|
|
402
|
+
testFiles: ['e2e/performance/home.spec.ts', 'src/contexts/performanceContext.test.tsx'],
|
|
403
|
+
patterns: ['performance-context', 'performance-e2e', 'profiler-wrapper'],
|
|
404
|
+
scripts: {
|
|
405
|
+
'e2e:perf': 'PERF_TEST=true playwright test --project=performance',
|
|
406
|
+
'e2e:perf:ui': 'PERF_TEST=true playwright test --project=performance --ui',
|
|
407
|
+
'e2e:all': 'PERF_TEST=true playwright test',
|
|
408
|
+
},
|
|
409
|
+
configFiles: [],
|
|
410
|
+
};
|
|
411
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
378
412
|
// DEVELOPER TOOLING FEATURE
|
|
379
413
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
380
414
|
const devtools = {
|
|
@@ -394,24 +428,23 @@ const devtools = {
|
|
|
394
428
|
'Pre-commit hook: typecheck + lint-staged',
|
|
395
429
|
'Commit-msg hook: commitlint',
|
|
396
430
|
],
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
'@
|
|
400
|
-
'@eslint
|
|
401
|
-
'@react-spa-scaffold/
|
|
402
|
-
'
|
|
403
|
-
|
|
404
|
-
eslint
|
|
405
|
-
'eslint-
|
|
406
|
-
'eslint-plugin-
|
|
407
|
-
'eslint-plugin-react-
|
|
408
|
-
'
|
|
409
|
-
|
|
410
|
-
'
|
|
411
|
-
prettier
|
|
412
|
-
'
|
|
413
|
-
|
|
414
|
-
},
|
|
431
|
+
devDependencyNames: [
|
|
432
|
+
'@commitlint/config-conventional',
|
|
433
|
+
'@eslint/js',
|
|
434
|
+
'@react-spa-scaffold/eslint-config',
|
|
435
|
+
'@react-spa-scaffold/prettier-config',
|
|
436
|
+
'commitlint',
|
|
437
|
+
'eslint',
|
|
438
|
+
'eslint-config-prettier',
|
|
439
|
+
'eslint-plugin-lingui',
|
|
440
|
+
'eslint-plugin-react-hooks',
|
|
441
|
+
'eslint-plugin-react-refresh',
|
|
442
|
+
'husky',
|
|
443
|
+
'lint-staged',
|
|
444
|
+
'prettier',
|
|
445
|
+
'prettier-plugin-tailwindcss',
|
|
446
|
+
'typescript-eslint',
|
|
447
|
+
],
|
|
415
448
|
files: [
|
|
416
449
|
'eslint.config.js',
|
|
417
450
|
'prettier.config.js',
|
|
@@ -435,31 +468,28 @@ const devtools = {
|
|
|
435
468
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
436
469
|
const ci = {
|
|
437
470
|
name: 'CI/CD',
|
|
438
|
-
description: 'GitHub Actions +
|
|
471
|
+
description: 'GitHub Actions + Performance Testing + Dependabot',
|
|
439
472
|
required: false,
|
|
440
473
|
includes: [
|
|
441
474
|
'GitHub Actions CI workflow',
|
|
442
|
-
'Parallel jobs: lint, typecheck, security audit, build, unit tests, e2e tests',
|
|
443
|
-
'
|
|
475
|
+
'Parallel jobs: lint, typecheck, security audit, build, unit tests, e2e tests, performance tests',
|
|
476
|
+
'Performance testing with react-performance-tracking (React Profiler, Lighthouse, Web Vitals)',
|
|
444
477
|
'Dependabot with grouped updates by category',
|
|
445
478
|
'PR template',
|
|
446
|
-
'Artifact uploads (dist, coverage,
|
|
479
|
+
'Artifact uploads (dist, coverage, performance reports)',
|
|
447
480
|
'Dependency caching for faster builds',
|
|
448
481
|
'Custom setup-node-deps action',
|
|
449
482
|
],
|
|
450
|
-
dependencies
|
|
451
|
-
devDependencies: {},
|
|
483
|
+
// No additional dependencies - CI configuration only
|
|
452
484
|
files: [
|
|
453
485
|
'.github/workflows/ci.yml',
|
|
454
486
|
'.github/actions/setup-node-deps/action.yml',
|
|
455
487
|
'.github/dependabot.yml',
|
|
456
488
|
'.github/PULL_REQUEST_TEMPLATE.md',
|
|
457
|
-
'lighthouserc.json',
|
|
458
|
-
'lighthouse-budget.json',
|
|
459
489
|
],
|
|
460
490
|
patterns: [],
|
|
461
491
|
scripts: {},
|
|
462
|
-
configFiles: [
|
|
492
|
+
configFiles: [],
|
|
463
493
|
};
|
|
464
494
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
465
495
|
// OBSERVABILITY FEATURE
|
|
@@ -478,14 +508,10 @@ const observability = {
|
|
|
478
508
|
'VITE_SENTRY_ENABLED flag for opt-out',
|
|
479
509
|
'SENTRY_CONFIG in lib/config.ts',
|
|
480
510
|
],
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
'@sentry/vite-plugin': '^4.6.1',
|
|
486
|
-
},
|
|
487
|
-
files: [],
|
|
488
|
-
patterns: ['sentry-init', 'error-tracking'],
|
|
511
|
+
dependencyNames: ['@sentry/react'],
|
|
512
|
+
devDependencyNames: ['@sentry/vite-plugin'],
|
|
513
|
+
files: ['src/lib/config.ts'],
|
|
514
|
+
patterns: ['main-entry', 'lib-config'],
|
|
489
515
|
scripts: {},
|
|
490
516
|
options: {
|
|
491
517
|
enabled: {
|
|
@@ -509,13 +535,17 @@ const theming = {
|
|
|
509
535
|
'Zustand persistence via preferencesStore',
|
|
510
536
|
'Multi-tab sync via storage events',
|
|
511
537
|
],
|
|
512
|
-
dependencies
|
|
513
|
-
devDependencies: {},
|
|
538
|
+
// No additional dependencies - uses state feature's Zustand
|
|
514
539
|
files: [
|
|
515
540
|
'src/hooks/useThemeEffect.ts',
|
|
516
541
|
'src/components/shared/ThemeToggle/ThemeToggle.tsx',
|
|
517
542
|
'src/components/shared/ThemeToggle/index.ts',
|
|
518
543
|
],
|
|
544
|
+
testFiles: [
|
|
545
|
+
'src/hooks/useThemeEffect.test.ts',
|
|
546
|
+
'src/components/shared/ThemeToggle/ThemeToggle.test.tsx',
|
|
547
|
+
'e2e/tests/theme.spec.ts',
|
|
548
|
+
],
|
|
519
549
|
patterns: ['theme-toggle', 'hook-effect'],
|
|
520
550
|
scripts: {},
|
|
521
551
|
};
|
|
@@ -532,6 +562,7 @@ export const FEATURES = {
|
|
|
532
562
|
api,
|
|
533
563
|
i18n,
|
|
534
564
|
testing,
|
|
565
|
+
performance,
|
|
535
566
|
devtools,
|
|
536
567
|
ci,
|
|
537
568
|
observability,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/features/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/features/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/features/types.d.ts
CHANGED
|
@@ -10,9 +10,19 @@ export interface Feature {
|
|
|
10
10
|
description: string;
|
|
11
11
|
required: boolean;
|
|
12
12
|
includes: string[];
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Dependency package names - versions resolved from webapp-base package.json at runtime.
|
|
15
|
+
* This ensures scaffolded projects always get up-to-date dependency versions.
|
|
16
|
+
*/
|
|
17
|
+
dependencyNames?: string[];
|
|
18
|
+
devDependencyNames?: string[];
|
|
15
19
|
files: string[];
|
|
20
|
+
/**
|
|
21
|
+
* Test files associated with this feature.
|
|
22
|
+
* Only included in scaffold when the 'testing' feature is also selected.
|
|
23
|
+
* This keeps feature source files separate from test infrastructure concerns.
|
|
24
|
+
*/
|
|
25
|
+
testFiles?: string[];
|
|
16
26
|
patterns: string[];
|
|
17
27
|
options?: Record<string, FeatureOption>;
|
|
18
28
|
scripts?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-example.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB;;;;iBAI3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;;;;;GAoBtD;
|
|
1
|
+
{"version":3,"file":"get-example.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB;;;;iBAI3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;;;;;GAoBtD;AAwBD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;CAoCpC,CAAC"}
|
|
@@ -43,8 +43,9 @@ function generateUsageHint(pattern) {
|
|
|
43
43
|
'zustand-store': 'Place in src/stores/ with xxxStore.ts naming',
|
|
44
44
|
'page-component': 'Place in src/pages/ with XxxPage named export',
|
|
45
45
|
'context-provider': 'Place in src/contexts/ - export both Provider and hook',
|
|
46
|
-
'test-component': '
|
|
47
|
-
'test-hook': '
|
|
46
|
+
'test-component': 'Co-locate with component: ComponentName.test.tsx next to ComponentName.tsx',
|
|
47
|
+
'test-hook': 'Co-locate with hook: useXxx.test.ts next to useXxx.ts',
|
|
48
|
+
'test-store': 'Co-locate with store: xxxStore.test.ts next to xxxStore.ts',
|
|
48
49
|
'msw-handler': 'Place in src/mocks/handlers/',
|
|
49
50
|
'zod-schema': 'Add to src/lib/validations.ts',
|
|
50
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-example.js","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,kBAAkB,GAAG,oBAAoB,EAA2B,CAAC;AAE3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,KAAK,EAAE,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtE,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,uCAAuC,OAAO,EAAE;YACvD,IAAI,EAAE,gEAAgE;SACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAA2B;QACpC,cAAc,EAAE,sDAAsD;QACtE,kBAAkB,EAAE,oEAAoE;QACxF,kBAAkB,EAAE,iCAAiC;QACrD,YAAY,EAAE,2CAA2C;QACzD,YAAY,EAAE,mDAAmD;QACjE,WAAW,EAAE,0DAA0D;QACvE,aAAa,EAAE,uCAAuC;QACtD,eAAe,EAAE,8CAA8C;QAC/D,gBAAgB,EAAE,+CAA+C;QACjE,kBAAkB,EAAE,wDAAwD;QAC5E,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"get-example.js","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,kBAAkB,GAAG,oBAAoB,EAA2B,CAAC;AAE3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,KAAK,EAAE,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtE,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,uCAAuC,OAAO,EAAE;YACvD,IAAI,EAAE,gEAAgE;SACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAA2B;QACpC,cAAc,EAAE,sDAAsD;QACtE,kBAAkB,EAAE,oEAAoE;QACxF,kBAAkB,EAAE,iCAAiC;QACrD,YAAY,EAAE,2CAA2C;QACzD,YAAY,EAAE,mDAAmD;QACjE,WAAW,EAAE,0DAA0D;QACvE,aAAa,EAAE,uCAAuC;QACtD,eAAe,EAAE,8CAA8C;QAC/D,gBAAgB,EAAE,+CAA+C;QACjE,kBAAkB,EAAE,wDAAwD;QAC5E,gBAAgB,EAAE,4EAA4E;QAC9F,WAAW,EAAE,uDAAuD;QACpE,YAAY,EAAE,4DAA4D;QAC1E,aAAa,EAAE,8BAA8B;QAC7C,YAAY,EAAE,+BAA+B;KAC9C,CAAC;IAEF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,2CAA2C,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;sCAsBuB;IACpC,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAiB;gBACvB,WAAW,EAAE,iCAAiC;gBAC9C,IAAI,EAAE,kBAAkB;aACzB;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-features.d.ts","sourceRoot":"","sources":["../../src/tools/get-features.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAa9C;AAED,eAAO,MAAM,yBAAyB;;;;;;
|
|
1
|
+
{"version":3,"file":"get-features.d.ts","sourceRoot":"","sources":["../../src/tools/get-features.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAa9C;AAED,eAAO,MAAM,yBAAyB;;;;;;kBAqBlB,MAAM,EAAE;;CAE3B,CAAC"}
|
|
@@ -33,8 +33,9 @@ Returns a list of features that can be selected when creating a new project:
|
|
|
33
33
|
- api: TanStack Query + API client
|
|
34
34
|
- i18n: LinguiJS internationalization
|
|
35
35
|
- testing: Vitest + Playwright + MSW
|
|
36
|
+
- performance: React Profiler + Lighthouse + Web Vitals
|
|
36
37
|
- devtools: ESLint + Prettier + Husky
|
|
37
|
-
- ci: GitHub Actions +
|
|
38
|
+
- ci: GitHub Actions + Dependabot
|
|
38
39
|
|
|
39
40
|
Use this to understand available options before scaffolding a project.`,
|
|
40
41
|
inputSchema: {
|