@react-spa-scaffold/mcp 0.3.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/README.md +423 -0
- package/dist/features/index.d.ts +5 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +3 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/registry.d.ts +10 -0
- package/dist/features/registry.d.ts.map +1 -0
- package/dist/features/registry.js +508 -0
- package/dist/features/registry.js.map +1 -0
- package/dist/features/types.d.ts +45 -0
- package/dist/features/types.d.ts.map +1 -0
- package/dist/features/types.js +5 -0
- package/dist/features/types.js.map +1 -0
- package/dist/features/versions.d.ts +16 -0
- package/dist/features/versions.d.ts.map +1 -0
- package/dist/features/versions.js +46 -0
- package/dist/features/versions.js.map +1 -0
- package/dist/features/versions.json +5 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/docs.d.ts +29 -0
- package/dist/resources/docs.d.ts.map +1 -0
- package/dist/resources/docs.js +105 -0
- package/dist/resources/docs.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +2 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +115 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/get-example.d.ts +51 -0
- package/dist/tools/get-example.d.ts.map +1 -0
- package/dist/tools/get-example.js +90 -0
- package/dist/tools/get-example.js.map +1 -0
- package/dist/tools/get-features.d.ts +30 -0
- package/dist/tools/get-features.d.ts.map +1 -0
- package/dist/tools/get-features.js +46 -0
- package/dist/tools/get-features.js.map +1 -0
- package/dist/tools/get-scaffold.d.ts +77 -0
- package/dist/tools/get-scaffold.d.ts.map +1 -0
- package/dist/tools/get-scaffold.js +153 -0
- package/dist/tools/get-scaffold.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/utils/docs.d.ts +14 -0
- package/dist/utils/docs.d.ts.map +1 -0
- package/dist/utils/docs.js +64 -0
- package/dist/utils/docs.js.map +1 -0
- package/dist/utils/examples.d.ts +27 -0
- package/dist/utils/examples.d.ts.map +1 -0
- package/dist/utils/examples.js +399 -0
- package/dist/utils/examples.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +28 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +40 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/scaffold.d.ts +50 -0
- package/dist/utils/scaffold.d.ts.map +1 -0
- package/dist/utils/scaffold.js +500 -0
- package/dist/utils/scaffold.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/package.json +63 -0
- package/templates/.bundled +0 -0
- package/templates/CLAUDE.md +145 -0
- package/templates/docs/API_REFERENCE.md +58 -0
- package/templates/docs/ARCHITECTURE.md +185 -0
- package/templates/docs/CODING_STANDARDS.md +53 -0
- package/templates/docs/COMPONENT_GUIDELINES.md +301 -0
- package/templates/docs/E2E_TESTING.md +116 -0
- package/templates/docs/INTERNATIONALIZATION.md +67 -0
- package/templates/docs/TESTING.md +259 -0
- package/templates/docs/WORKFLOW.md +170 -0
- package/templates/src/App.tsx +42 -0
- package/templates/src/components/layout/Header.tsx +19 -0
- package/templates/src/components/layout/index.ts +1 -0
- package/templates/src/components/shared/ErrorBoundary/ErrorBoundary.tsx +104 -0
- package/templates/src/components/shared/ErrorBoundary/index.ts +1 -0
- package/templates/src/components/shared/LanguageSwitcher/LanguageSwitcher.tsx +45 -0
- package/templates/src/components/shared/LanguageSwitcher/index.ts +1 -0
- package/templates/src/components/shared/SEO/SEO.tsx +55 -0
- package/templates/src/components/shared/SEO/index.ts +1 -0
- package/templates/src/components/shared/ThemeToggle/ThemeToggle.tsx +41 -0
- package/templates/src/components/shared/ThemeToggle/index.ts +1 -0
- package/templates/src/components/shared/index.ts +4 -0
- package/templates/src/components/ui/button.tsx +48 -0
- package/templates/src/components/ui/dropdown-menu.tsx +228 -0
- package/templates/src/components/ui/form-error.tsx +95 -0
- package/templates/src/components/ui/loading.tsx +58 -0
- package/templates/src/components/ui/skeleton.tsx +52 -0
- package/templates/src/components/ui/sonner.tsx +34 -0
- package/templates/src/components/ui/spinner.tsx +40 -0
- package/templates/src/components/ui/visually-hidden.tsx +51 -0
- package/templates/src/contexts/mobileContext.tsx +66 -0
- package/templates/src/contexts/queryContext.tsx +28 -0
- package/templates/src/hooks/index.ts +7 -0
- package/templates/src/hooks/useContactForm.ts +33 -0
- package/templates/src/hooks/useExampleQuery.ts +20 -0
- package/templates/src/hooks/useLanguage.ts +23 -0
- package/templates/src/hooks/useMediaQuery.ts +53 -0
- package/templates/src/hooks/useThemeEffect.ts +31 -0
- package/templates/src/hooks/useTouchSizes.ts +16 -0
- package/templates/src/i18n/config.ts +11 -0
- package/templates/src/i18n/detectLanguage.ts +57 -0
- package/templates/src/i18n/index.ts +20 -0
- package/templates/src/i18n/loadCatalog.ts +30 -0
- package/templates/src/index.css +98 -0
- package/templates/src/lib/api.ts +142 -0
- package/templates/src/lib/config.ts +15 -0
- package/templates/src/lib/constants.ts +8 -0
- package/templates/src/lib/env.ts +53 -0
- package/templates/src/lib/format.ts +119 -0
- package/templates/src/lib/index.ts +24 -0
- package/templates/src/lib/routes.ts +11 -0
- package/templates/src/lib/storage.ts +91 -0
- package/templates/src/lib/storageKeys.ts +10 -0
- package/templates/src/lib/utils.ts +6 -0
- package/templates/src/lib/validations.ts +39 -0
- package/templates/src/locales/de.po +65 -0
- package/templates/src/locales/en.po +65 -0
- package/templates/src/locales/es.po +65 -0
- package/templates/src/main.tsx +107 -0
- package/templates/src/mocks/fixtures/index.ts +1 -0
- package/templates/src/mocks/fixtures/todos.ts +40 -0
- package/templates/src/mocks/handlers/index.ts +7 -0
- package/templates/src/mocks/handlers/todos.ts +59 -0
- package/templates/src/mocks/index.ts +3 -0
- package/templates/src/mocks/node.ts +9 -0
- package/templates/src/pages/Home.tsx +27 -0
- package/templates/src/pages/NotFound.tsx +28 -0
- package/templates/src/pages/index.ts +2 -0
- package/templates/src/stores/index.ts +2 -0
- package/templates/src/stores/preferencesStore.ts +85 -0
- package/templates/src/test/index.ts +8 -0
- package/templates/src/test/mocks.ts +17 -0
- package/templates/src/test/providers.tsx +54 -0
- package/templates/src/test-setup.ts +54 -0
- package/templates/src/types/api.ts +31 -0
- package/templates/src/types/index.ts +2 -0
- package/templates/src/types/preferences.ts +5 -0
- package/templates/src/vite-env.d.ts +10 -0
- package/templates/tests/unit/components/ErrorBoundary.test.tsx +193 -0
- package/templates/tests/unit/components/Header.test.tsx +33 -0
- package/templates/tests/unit/components/LanguageSwitcher.test.tsx +40 -0
- package/templates/tests/unit/components/Loading.test.tsx +76 -0
- package/templates/tests/unit/components/SEO.test.tsx +80 -0
- package/templates/tests/unit/components/ThemeToggle.test.tsx +62 -0
- package/templates/tests/unit/contexts/mobileContext.test.tsx +54 -0
- package/templates/tests/unit/hooks/useContactForm.test.ts +60 -0
- package/templates/tests/unit/hooks/useExampleQuery.test.tsx +94 -0
- package/templates/tests/unit/hooks/useLanguage.test.tsx +75 -0
- package/templates/tests/unit/hooks/useMediaQuery.test.ts +57 -0
- package/templates/tests/unit/hooks/useThemeEffect.test.ts +42 -0
- package/templates/tests/unit/i18n/detectLanguage.test.ts +40 -0
- package/templates/tests/unit/i18n/loadCatalog.test.ts +70 -0
- package/templates/tests/unit/lib/api.test.ts +142 -0
- package/templates/tests/unit/lib/format.test.ts +100 -0
- package/templates/tests/unit/lib/storage.test.ts +90 -0
- package/templates/tests/unit/lib/utils.test.ts +19 -0
- package/templates/tests/unit/lib/validations.test.ts +56 -0
- package/templates/tests/unit/stores/preferencesStore.test.ts +75 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Registry - Defines all available features for react-spa-scaffold scaffolding
|
|
3
|
+
*/
|
|
4
|
+
import { CONFIG_VERSIONS } from './versions.js';
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
6
|
+
// CORE FEATURE (Always included)
|
|
7
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
8
|
+
const core = {
|
|
9
|
+
name: 'Core',
|
|
10
|
+
description: 'React 19 + TypeScript + Vite 7 + Tailwind CSS v4',
|
|
11
|
+
required: true,
|
|
12
|
+
includes: [
|
|
13
|
+
'React 19 with TypeScript (~5.9.0)',
|
|
14
|
+
'Vite 7 build system',
|
|
15
|
+
'Tailwind CSS v4 with Vite plugin',
|
|
16
|
+
'Inter variable font (@fontsource-variable/inter)',
|
|
17
|
+
'Environment validation with Zod (src/lib/env.ts)',
|
|
18
|
+
'Format utilities - date, number, currency, bytes (src/lib/format.ts)',
|
|
19
|
+
'cn() class merge utility (clsx + tailwind-merge)',
|
|
20
|
+
'Basic SEO component (React 19 native head hoisting)',
|
|
21
|
+
'App configuration (src/lib/config.ts)',
|
|
22
|
+
'Constants and type definitions',
|
|
23
|
+
'ErrorBoundary component with reset functionality',
|
|
24
|
+
],
|
|
25
|
+
dependencies: {
|
|
26
|
+
'@fontsource-variable/inter': '^5.2.5',
|
|
27
|
+
clsx: '^2.1.1',
|
|
28
|
+
react: '^19.1.0',
|
|
29
|
+
'react-dom': '^19.1.0',
|
|
30
|
+
'tailwind-merge': '^3.3.0',
|
|
31
|
+
zod: '^3.25.64',
|
|
32
|
+
},
|
|
33
|
+
devDependencies: {
|
|
34
|
+
'@tailwindcss/vite': '^4.1.17',
|
|
35
|
+
'@types/node': '^22.15.0',
|
|
36
|
+
'@types/react': '^19.1.8',
|
|
37
|
+
'@types/react-dom': '^19.1.6',
|
|
38
|
+
'@vitejs/plugin-react': '^5.1.2',
|
|
39
|
+
'@react-spa-scaffold/tsconfig': CONFIG_VERSIONS['@react-spa-scaffold/tsconfig'],
|
|
40
|
+
tailwindcss: '^4.1.17',
|
|
41
|
+
typescript: '~5.9.0',
|
|
42
|
+
vite: '^7.0.0',
|
|
43
|
+
},
|
|
44
|
+
files: [
|
|
45
|
+
'src/main.tsx',
|
|
46
|
+
'src/App.tsx',
|
|
47
|
+
'src/index.css',
|
|
48
|
+
'src/vite-env.d.ts',
|
|
49
|
+
'src/lib/config.ts',
|
|
50
|
+
'src/lib/constants.ts',
|
|
51
|
+
'src/lib/env.ts',
|
|
52
|
+
'src/lib/format.ts',
|
|
53
|
+
'src/lib/utils.ts',
|
|
54
|
+
'src/lib/index.ts',
|
|
55
|
+
'src/types/index.ts',
|
|
56
|
+
'src/hooks/index.ts',
|
|
57
|
+
'src/components/shared/SEO/SEO.tsx',
|
|
58
|
+
'src/components/shared/SEO/index.ts',
|
|
59
|
+
'src/components/shared/ErrorBoundary/ErrorBoundary.tsx',
|
|
60
|
+
'src/components/shared/ErrorBoundary/index.ts',
|
|
61
|
+
'src/components/shared/index.ts',
|
|
62
|
+
'index.html',
|
|
63
|
+
'vite.config.ts',
|
|
64
|
+
'tsconfig.json',
|
|
65
|
+
'tsconfig.app.json',
|
|
66
|
+
'tsconfig.node.json',
|
|
67
|
+
'.env.example',
|
|
68
|
+
'public/favicon.svg',
|
|
69
|
+
],
|
|
70
|
+
patterns: ['component-shared', 'hook-effect', 'error-boundary'],
|
|
71
|
+
scripts: {
|
|
72
|
+
dev: 'vite',
|
|
73
|
+
build: 'tsc -b && vite build',
|
|
74
|
+
preview: 'vite preview',
|
|
75
|
+
typecheck: 'tsc --noEmit',
|
|
76
|
+
},
|
|
77
|
+
configFiles: ['vite.config.ts', 'tsconfig.json', 'tsconfig.app.json', 'tsconfig.node.json'],
|
|
78
|
+
};
|
|
79
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
80
|
+
// MOBILE FEATURE
|
|
81
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
82
|
+
const mobile = {
|
|
83
|
+
name: 'Mobile Support',
|
|
84
|
+
description: 'Responsive design utilities with viewport detection, breakpoints, and touch-aware sizing',
|
|
85
|
+
required: false,
|
|
86
|
+
includes: [
|
|
87
|
+
'MobileProvider context for viewport detection',
|
|
88
|
+
'useMobileContext hook (isMobile, isTablet, isDesktop, width)',
|
|
89
|
+
'useMediaQuery hook with BREAKPOINTS constants (sm, md, lg, xl)',
|
|
90
|
+
'useIsMobile and useIsDesktop convenience hooks',
|
|
91
|
+
'useTouchSizes hook for touch-aware component sizing',
|
|
92
|
+
'requestAnimationFrame-debounced resize handling',
|
|
93
|
+
'SSR-safe viewport detection with fallbacks',
|
|
94
|
+
],
|
|
95
|
+
dependencies: {},
|
|
96
|
+
devDependencies: {},
|
|
97
|
+
files: ['src/contexts/mobileContext.tsx', 'src/hooks/useMediaQuery.ts', 'src/hooks/useTouchSizes.ts'],
|
|
98
|
+
patterns: ['mobile-context', 'use-media-query', 'use-touch-sizes'],
|
|
99
|
+
scripts: {},
|
|
100
|
+
};
|
|
101
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
102
|
+
// ROUTING FEATURE
|
|
103
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
104
|
+
const routing = {
|
|
105
|
+
name: 'Routing',
|
|
106
|
+
description: 'React Router 7 with lazy loading and route constants',
|
|
107
|
+
required: false,
|
|
108
|
+
includes: [
|
|
109
|
+
'React Router 7',
|
|
110
|
+
'Lazy-loaded pages with React.lazy()',
|
|
111
|
+
'Route constants with TypeScript types (src/lib/routes.ts)',
|
|
112
|
+
'404 Not Found page',
|
|
113
|
+
'App.tsx with Suspense fallback',
|
|
114
|
+
'PageLoading component for transitions',
|
|
115
|
+
],
|
|
116
|
+
dependencies: {
|
|
117
|
+
'react-router': '^7.11.0',
|
|
118
|
+
},
|
|
119
|
+
devDependencies: {},
|
|
120
|
+
files: [
|
|
121
|
+
'src/lib/routes.ts',
|
|
122
|
+
'src/pages/Home.tsx',
|
|
123
|
+
'src/pages/NotFound.tsx',
|
|
124
|
+
'src/pages/index.ts',
|
|
125
|
+
'src/components/ui/loading.tsx',
|
|
126
|
+
'src/components/ui/visually-hidden.tsx',
|
|
127
|
+
],
|
|
128
|
+
patterns: ['lazy-page', 'route-constants', 'page-component'],
|
|
129
|
+
scripts: {},
|
|
130
|
+
};
|
|
131
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
132
|
+
// UI COMPONENTS FEATURE
|
|
133
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
134
|
+
const ui = {
|
|
135
|
+
name: 'UI Components',
|
|
136
|
+
description: 'Shadcn/UI + icons + animations + toasts + theming',
|
|
137
|
+
required: false,
|
|
138
|
+
includes: [
|
|
139
|
+
'Shadcn/UI component system (radix-nova style)',
|
|
140
|
+
'Radix UI primitives',
|
|
141
|
+
'CVA (class-variance-authority) for variants',
|
|
142
|
+
'Lucide React icons',
|
|
143
|
+
'tw-animate-css for animations',
|
|
144
|
+
'Sonner toast notifications',
|
|
145
|
+
'Button with variants (default, destructive, outline, etc.)',
|
|
146
|
+
'DropdownMenu component',
|
|
147
|
+
'Loading, Skeleton, Spinner components',
|
|
148
|
+
'VisuallyHidden and SkipLink (accessibility)',
|
|
149
|
+
'Theme toggle (light/dark/system)',
|
|
150
|
+
'useThemeEffect hook',
|
|
151
|
+
'components.json for shadcn CLI',
|
|
152
|
+
],
|
|
153
|
+
dependencies: {
|
|
154
|
+
'@radix-ui/react-slot': '^1.2.3',
|
|
155
|
+
'class-variance-authority': '^0.7.1',
|
|
156
|
+
'lucide-react': '^0.562.0',
|
|
157
|
+
'radix-ui': '^1.4.3',
|
|
158
|
+
sonner: '^2.0.7',
|
|
159
|
+
'tw-animate-css': '^1.2.9',
|
|
160
|
+
},
|
|
161
|
+
devDependencies: {
|
|
162
|
+
shadcn: '^3.6.2',
|
|
163
|
+
},
|
|
164
|
+
files: [
|
|
165
|
+
'src/components/ui/button.tsx',
|
|
166
|
+
'src/components/ui/dropdown-menu.tsx',
|
|
167
|
+
'src/components/ui/loading.tsx',
|
|
168
|
+
'src/components/ui/skeleton.tsx',
|
|
169
|
+
'src/components/ui/spinner.tsx',
|
|
170
|
+
'src/components/ui/sonner.tsx',
|
|
171
|
+
'src/components/ui/visually-hidden.tsx',
|
|
172
|
+
'src/components/shared/ThemeToggle/ThemeToggle.tsx',
|
|
173
|
+
'src/components/shared/ThemeToggle/index.ts',
|
|
174
|
+
'src/components/layout/Header.tsx',
|
|
175
|
+
'src/components/layout/index.ts',
|
|
176
|
+
'src/hooks/useThemeEffect.ts',
|
|
177
|
+
'components.json',
|
|
178
|
+
],
|
|
179
|
+
patterns: ['component-ui', 'button-variants', 'forward-ref-component', 'theme-toggle'],
|
|
180
|
+
scripts: {},
|
|
181
|
+
configFiles: ['components.json'],
|
|
182
|
+
};
|
|
183
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
184
|
+
// FORMS FEATURE
|
|
185
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
186
|
+
const forms = {
|
|
187
|
+
name: 'Form Handling',
|
|
188
|
+
description: 'React Hook Form + Zod validation + error components',
|
|
189
|
+
required: false,
|
|
190
|
+
includes: [
|
|
191
|
+
'React Hook Form',
|
|
192
|
+
'Zod schema validation',
|
|
193
|
+
'@hookform/resolvers for Zod integration',
|
|
194
|
+
'Form error components (FieldErrorMessage, FormErrorSummary, RootFormError)',
|
|
195
|
+
'Example useContactForm hook',
|
|
196
|
+
'Example validation schemas (contact, register)',
|
|
197
|
+
'Type-safe form data inference',
|
|
198
|
+
],
|
|
199
|
+
dependencies: {
|
|
200
|
+
'@hookform/resolvers': '^5.0.1',
|
|
201
|
+
'react-hook-form': '^7.58.0',
|
|
202
|
+
// zod already in core
|
|
203
|
+
},
|
|
204
|
+
devDependencies: {},
|
|
205
|
+
files: ['src/lib/validations.ts', 'src/hooks/useContactForm.ts', 'src/components/ui/form-error.tsx'],
|
|
206
|
+
patterns: ['zod-schema', 'use-form-hook', 'form-error-component'],
|
|
207
|
+
scripts: {},
|
|
208
|
+
};
|
|
209
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
210
|
+
// STATE MANAGEMENT FEATURE
|
|
211
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
212
|
+
const state = {
|
|
213
|
+
name: 'State Management',
|
|
214
|
+
description: 'Zustand with persistence, devtools, and multi-tab sync',
|
|
215
|
+
required: false,
|
|
216
|
+
includes: [
|
|
217
|
+
'Zustand store',
|
|
218
|
+
'Persist middleware (localStorage)',
|
|
219
|
+
'Devtools middleware',
|
|
220
|
+
'Multi-tab sync utility (initPreferencesSync)',
|
|
221
|
+
'Storage utilities (get/set/remove/clear)',
|
|
222
|
+
'Prefixed storage keys',
|
|
223
|
+
'Example preferences store (theme)',
|
|
224
|
+
'Type-safe store selectors',
|
|
225
|
+
],
|
|
226
|
+
dependencies: {
|
|
227
|
+
zustand: '^5.0.9',
|
|
228
|
+
},
|
|
229
|
+
devDependencies: {},
|
|
230
|
+
files: [
|
|
231
|
+
'src/stores/preferencesStore.ts',
|
|
232
|
+
'src/stores/index.ts',
|
|
233
|
+
'src/lib/storage.ts',
|
|
234
|
+
'src/lib/storageKeys.ts',
|
|
235
|
+
'src/types/preferences.ts',
|
|
236
|
+
],
|
|
237
|
+
patterns: ['zustand-store', 'store-persistence', 'multi-tab-sync', 'storage-utility'],
|
|
238
|
+
scripts: {},
|
|
239
|
+
};
|
|
240
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
241
|
+
// API FEATURE
|
|
242
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
243
|
+
const api = {
|
|
244
|
+
name: 'API',
|
|
245
|
+
description: 'TanStack Query + typed API client',
|
|
246
|
+
required: false,
|
|
247
|
+
includes: [
|
|
248
|
+
'TanStack Query v5',
|
|
249
|
+
'QueryProvider with optimized defaults (staleTime, gcTime, retry)',
|
|
250
|
+
'Typed API client with methods (get/post/put/patch/delete)',
|
|
251
|
+
'ApiClientError class with status and code',
|
|
252
|
+
'Request timeout handling',
|
|
253
|
+
'Example useExampleQuery hook',
|
|
254
|
+
'API types (Todo, PaginatedResponse, etc.)',
|
|
255
|
+
],
|
|
256
|
+
dependencies: {
|
|
257
|
+
'@tanstack/react-query': '^5.81.5',
|
|
258
|
+
},
|
|
259
|
+
devDependencies: {},
|
|
260
|
+
files: ['src/lib/api.ts', 'src/contexts/queryContext.tsx', 'src/hooks/useExampleQuery.ts', 'src/types/api.ts'],
|
|
261
|
+
patterns: ['query-provider', 'use-query-hook', 'api-client'],
|
|
262
|
+
scripts: {},
|
|
263
|
+
};
|
|
264
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
265
|
+
// INTERNATIONALIZATION FEATURE
|
|
266
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
267
|
+
const i18n = {
|
|
268
|
+
name: 'Internationalization',
|
|
269
|
+
description: 'LinguiJS with dynamic loading and language detection',
|
|
270
|
+
required: false,
|
|
271
|
+
includes: [
|
|
272
|
+
'LinguiJS (core + react + macro)',
|
|
273
|
+
'Trans component for JSX text',
|
|
274
|
+
't() function for programmatic text',
|
|
275
|
+
'Dynamic catalog loading (code splitting per locale)',
|
|
276
|
+
'Browser language detection',
|
|
277
|
+
'Language switcher component',
|
|
278
|
+
'ESLint rule for translator comments (enforced)',
|
|
279
|
+
'Locale files (.po format) for en, es, de',
|
|
280
|
+
'Vite plugin for compilation',
|
|
281
|
+
'useLanguage hook',
|
|
282
|
+
],
|
|
283
|
+
dependencies: {
|
|
284
|
+
'@lingui/core': '^5.7.0',
|
|
285
|
+
'@lingui/react': '^5.7.0',
|
|
286
|
+
},
|
|
287
|
+
devDependencies: {
|
|
288
|
+
'@lingui/babel-plugin-lingui-macro': '^5.7.0',
|
|
289
|
+
'@lingui/cli': '^5.7.0',
|
|
290
|
+
'@lingui/vite-plugin': '^5.7.0',
|
|
291
|
+
'babel-plugin-macros': '^3.1.0',
|
|
292
|
+
'eslint-plugin-lingui': '^0.11.0',
|
|
293
|
+
},
|
|
294
|
+
files: [
|
|
295
|
+
'src/i18n/config.ts',
|
|
296
|
+
'src/i18n/detectLanguage.ts',
|
|
297
|
+
'src/i18n/loadCatalog.ts',
|
|
298
|
+
'src/i18n/index.ts',
|
|
299
|
+
'src/locales/en.po',
|
|
300
|
+
'src/locales/es.po',
|
|
301
|
+
'src/locales/de.po',
|
|
302
|
+
'src/hooks/useLanguage.ts',
|
|
303
|
+
'src/components/shared/LanguageSwitcher/LanguageSwitcher.tsx',
|
|
304
|
+
'src/components/shared/LanguageSwitcher/index.ts',
|
|
305
|
+
'lingui.config.js',
|
|
306
|
+
],
|
|
307
|
+
patterns: ['trans-component', 't-function', 'language-switcher', 'use-language-hook'],
|
|
308
|
+
scripts: {
|
|
309
|
+
'i18n:extract': 'lingui extract',
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
313
|
+
// TESTING FEATURE
|
|
314
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
315
|
+
const testing = {
|
|
316
|
+
name: 'Testing',
|
|
317
|
+
description: 'Vitest + Testing Library + Playwright + MSW',
|
|
318
|
+
required: false,
|
|
319
|
+
includes: [
|
|
320
|
+
'Vitest for unit testing',
|
|
321
|
+
'React Testing Library',
|
|
322
|
+
'@testing-library/user-event for interactions',
|
|
323
|
+
'Playwright for E2E testing (Chromium)',
|
|
324
|
+
'MSW (Mock Service Worker) for API mocking',
|
|
325
|
+
'Test utilities (render, providers, mocks)',
|
|
326
|
+
'80% coverage threshold (lines, functions, statements, branches)',
|
|
327
|
+
'jsdom environment',
|
|
328
|
+
'Example tests for components, hooks, stores, utilities',
|
|
329
|
+
'MSW handlers for API endpoints',
|
|
330
|
+
'Test fixtures for mock data',
|
|
331
|
+
],
|
|
332
|
+
dependencies: {},
|
|
333
|
+
devDependencies: {
|
|
334
|
+
'@playwright/test': '^1.52.0',
|
|
335
|
+
'@testing-library/jest-dom': '^6.6.3',
|
|
336
|
+
'@testing-library/react': '^16.3.0',
|
|
337
|
+
'@testing-library/user-event': '^14.6.1',
|
|
338
|
+
'@vitest/coverage-v8': '^4.0.16',
|
|
339
|
+
jsdom: '^27.3.0',
|
|
340
|
+
msw: '^2.12.4',
|
|
341
|
+
vitest: '^4.0.16',
|
|
342
|
+
},
|
|
343
|
+
files: [
|
|
344
|
+
'src/test-setup.ts',
|
|
345
|
+
'src/test/mocks.ts',
|
|
346
|
+
'src/test/providers.tsx',
|
|
347
|
+
'src/test/index.ts',
|
|
348
|
+
'src/mocks/handlers/todos.ts',
|
|
349
|
+
'src/mocks/handlers/index.ts',
|
|
350
|
+
'src/mocks/fixtures/todos.ts',
|
|
351
|
+
'src/mocks/fixtures/index.ts',
|
|
352
|
+
'src/mocks/node.ts',
|
|
353
|
+
'src/mocks/index.ts',
|
|
354
|
+
'tests/unit/',
|
|
355
|
+
'e2e/tests/',
|
|
356
|
+
'vitest.config.ts',
|
|
357
|
+
'playwright.config.ts',
|
|
358
|
+
],
|
|
359
|
+
patterns: ['test-component', 'test-hook', 'test-store', 'test-utility', 'msw-handler', 'test-fixture'],
|
|
360
|
+
scripts: {
|
|
361
|
+
test: 'vitest run',
|
|
362
|
+
'test:watch': 'vitest',
|
|
363
|
+
'test:coverage': 'vitest run --coverage',
|
|
364
|
+
e2e: 'playwright test',
|
|
365
|
+
'e2e:ui': 'playwright test --ui',
|
|
366
|
+
},
|
|
367
|
+
configFiles: ['vitest.config.ts', 'playwright.config.ts'],
|
|
368
|
+
};
|
|
369
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
370
|
+
// DEVELOPER TOOLING FEATURE
|
|
371
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
372
|
+
const devtools = {
|
|
373
|
+
name: 'Developer Tooling',
|
|
374
|
+
description: 'ESLint + Prettier + Husky + Commitlint (using @react-spa-scaffold shared configs)',
|
|
375
|
+
required: false,
|
|
376
|
+
includes: [
|
|
377
|
+
'@react-spa-scaffold/eslint-config (React + TypeScript + LinguiJS)',
|
|
378
|
+
'@react-spa-scaffold/prettier-config (with Tailwind plugin)',
|
|
379
|
+
'ESLint with TypeScript and React Hooks plugins',
|
|
380
|
+
'eslint-plugin-react-refresh for HMR',
|
|
381
|
+
'Prettier with Tailwind CSS plugin',
|
|
382
|
+
'Husky for git hooks',
|
|
383
|
+
'lint-staged for pre-commit linting',
|
|
384
|
+
'Commitlint for conventional commits',
|
|
385
|
+
'.nvmrc for Node.js version (22)',
|
|
386
|
+
'Pre-commit hook: typecheck + lint-staged',
|
|
387
|
+
'Commit-msg hook: commitlint',
|
|
388
|
+
],
|
|
389
|
+
dependencies: {},
|
|
390
|
+
devDependencies: {
|
|
391
|
+
'@commitlint/config-conventional': '^20.2.0',
|
|
392
|
+
'@eslint/js': '^9.28.0',
|
|
393
|
+
'@react-spa-scaffold/eslint-config': CONFIG_VERSIONS['@react-spa-scaffold/eslint-config'],
|
|
394
|
+
'@react-spa-scaffold/prettier-config': CONFIG_VERSIONS['@react-spa-scaffold/prettier-config'],
|
|
395
|
+
commitlint: '^20.2.0',
|
|
396
|
+
eslint: '^9.28.0',
|
|
397
|
+
'eslint-config-prettier': '^10.1.0',
|
|
398
|
+
'eslint-plugin-lingui': '^0.11.0',
|
|
399
|
+
'eslint-plugin-react-hooks': '^5.2.0',
|
|
400
|
+
'eslint-plugin-react-refresh': '^0.4.20',
|
|
401
|
+
husky: '^9.1.7',
|
|
402
|
+
'lint-staged': '^16.1.0',
|
|
403
|
+
prettier: '^3.5.3',
|
|
404
|
+
'prettier-plugin-tailwindcss': '^0.7.2',
|
|
405
|
+
'typescript-eslint': '^8.33.0',
|
|
406
|
+
},
|
|
407
|
+
files: [
|
|
408
|
+
'eslint.config.js',
|
|
409
|
+
'prettier.config.js',
|
|
410
|
+
'commitlint.config.js',
|
|
411
|
+
'.husky/pre-commit',
|
|
412
|
+
'.husky/commit-msg',
|
|
413
|
+
'.nvmrc',
|
|
414
|
+
],
|
|
415
|
+
patterns: [],
|
|
416
|
+
scripts: {
|
|
417
|
+
lint: 'eslint .',
|
|
418
|
+
'lint:fix': 'eslint . --fix',
|
|
419
|
+
format: 'prettier --write .',
|
|
420
|
+
'format:check': 'prettier --check .',
|
|
421
|
+
prepare: 'husky',
|
|
422
|
+
},
|
|
423
|
+
configFiles: ['eslint.config.js', 'prettier.config.js', 'commitlint.config.js'],
|
|
424
|
+
};
|
|
425
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
426
|
+
// CI/CD FEATURE
|
|
427
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
428
|
+
const ci = {
|
|
429
|
+
name: 'CI/CD',
|
|
430
|
+
description: 'GitHub Actions + Lighthouse + Dependabot',
|
|
431
|
+
required: false,
|
|
432
|
+
includes: [
|
|
433
|
+
'GitHub Actions CI workflow',
|
|
434
|
+
'Parallel jobs: lint, typecheck, security audit, build, unit tests, e2e tests',
|
|
435
|
+
'Lighthouse CI with performance budgets',
|
|
436
|
+
'Dependabot with grouped updates by category',
|
|
437
|
+
'PR template',
|
|
438
|
+
'Artifact uploads (dist, coverage, lighthouse reports)',
|
|
439
|
+
'Dependency caching for faster builds',
|
|
440
|
+
'Custom setup-node-deps action',
|
|
441
|
+
],
|
|
442
|
+
dependencies: {},
|
|
443
|
+
devDependencies: {},
|
|
444
|
+
files: [
|
|
445
|
+
'.github/workflows/ci.yml',
|
|
446
|
+
'.github/actions/setup-node-deps/action.yml',
|
|
447
|
+
'.github/dependabot.yml',
|
|
448
|
+
'.github/PULL_REQUEST_TEMPLATE.md',
|
|
449
|
+
'lighthouserc.json',
|
|
450
|
+
'lighthouse-budget.json',
|
|
451
|
+
],
|
|
452
|
+
patterns: [],
|
|
453
|
+
scripts: {},
|
|
454
|
+
configFiles: ['lighthouserc.json', 'lighthouse-budget.json'],
|
|
455
|
+
};
|
|
456
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
457
|
+
// OBSERVABILITY FEATURE
|
|
458
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
459
|
+
const observability = {
|
|
460
|
+
name: 'Observability',
|
|
461
|
+
description: 'Sentry error tracking with source maps (opt-out via VITE_SENTRY_ENABLED=false)',
|
|
462
|
+
required: false,
|
|
463
|
+
includes: [
|
|
464
|
+
'Sentry React SDK (@sentry/react)',
|
|
465
|
+
'Lazy-loaded Sentry initialization (non-blocking)',
|
|
466
|
+
'Browser tracing integration',
|
|
467
|
+
'Global error handlers (window.onerror, unhandledrejection)',
|
|
468
|
+
'ErrorBoundary integration with Sentry reporting',
|
|
469
|
+
'Source map upload via Vite plugin (CI/CD)',
|
|
470
|
+
'VITE_SENTRY_ENABLED flag for opt-out',
|
|
471
|
+
'SENTRY_CONFIG in lib/config.ts',
|
|
472
|
+
],
|
|
473
|
+
dependencies: {
|
|
474
|
+
'@sentry/react': '^10.32.1',
|
|
475
|
+
},
|
|
476
|
+
devDependencies: {
|
|
477
|
+
'@sentry/vite-plugin': '^4.6.1',
|
|
478
|
+
},
|
|
479
|
+
files: [],
|
|
480
|
+
patterns: ['sentry-init', 'error-tracking'],
|
|
481
|
+
scripts: {},
|
|
482
|
+
options: {
|
|
483
|
+
enabled: {
|
|
484
|
+
description: 'Enable/disable Sentry at runtime via VITE_SENTRY_ENABLED env var',
|
|
485
|
+
default: true,
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
};
|
|
489
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
490
|
+
// FEATURE REGISTRY EXPORT
|
|
491
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
492
|
+
export const FEATURES = {
|
|
493
|
+
core,
|
|
494
|
+
mobile,
|
|
495
|
+
routing,
|
|
496
|
+
ui,
|
|
497
|
+
forms,
|
|
498
|
+
state,
|
|
499
|
+
api,
|
|
500
|
+
i18n,
|
|
501
|
+
testing,
|
|
502
|
+
devtools,
|
|
503
|
+
ci,
|
|
504
|
+
observability,
|
|
505
|
+
};
|
|
506
|
+
/** All valid feature IDs */
|
|
507
|
+
export const FEATURE_IDS = Object.keys(FEATURES);
|
|
508
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/features/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for feature modules
|
|
3
|
+
*/
|
|
4
|
+
export interface FeatureOption {
|
|
5
|
+
description: string;
|
|
6
|
+
default: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface Feature {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
required: boolean;
|
|
12
|
+
includes: string[];
|
|
13
|
+
dependencies?: Record<string, string>;
|
|
14
|
+
devDependencies?: Record<string, string>;
|
|
15
|
+
files: string[];
|
|
16
|
+
patterns: string[];
|
|
17
|
+
options?: Record<string, FeatureOption>;
|
|
18
|
+
scripts?: Record<string, string>;
|
|
19
|
+
configFiles?: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface FeatureRegistry {
|
|
22
|
+
[key: string]: Feature;
|
|
23
|
+
}
|
|
24
|
+
export interface ScaffoldOptions {
|
|
25
|
+
features: string[];
|
|
26
|
+
options?: Record<string, boolean>;
|
|
27
|
+
projectName?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ScaffoldResult {
|
|
30
|
+
packageJson: {
|
|
31
|
+
name: string;
|
|
32
|
+
dependencies: Record<string, string>;
|
|
33
|
+
devDependencies: Record<string, string>;
|
|
34
|
+
scripts: Record<string, string>;
|
|
35
|
+
engines: Record<string, string>;
|
|
36
|
+
};
|
|
37
|
+
structure: string[];
|
|
38
|
+
configFiles: Record<string, string>;
|
|
39
|
+
setupCommands: string[];
|
|
40
|
+
claudeMd: string;
|
|
41
|
+
viteEnvDts: string;
|
|
42
|
+
envTs: string;
|
|
43
|
+
docs: Record<string, string>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,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,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config package versions - auto-generated during build
|
|
3
|
+
*
|
|
4
|
+
* In development, reads live from package.json files.
|
|
5
|
+
* In published mode, uses the generated versions.json.
|
|
6
|
+
*
|
|
7
|
+
* Run `npm run sync-versions` to update versions.json
|
|
8
|
+
*/
|
|
9
|
+
interface ConfigVersions {
|
|
10
|
+
'@react-spa-scaffold/eslint-config': string;
|
|
11
|
+
'@react-spa-scaffold/prettier-config': string;
|
|
12
|
+
'@react-spa-scaffold/tsconfig': string;
|
|
13
|
+
}
|
|
14
|
+
export declare const CONFIG_VERSIONS: ConfigVersions;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/features/versions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,UAAU,cAAc;IACtB,mCAAmC,EAAE,MAAM,CAAC;IAC5C,qCAAqC,EAAE,MAAM,CAAC;IAC9C,8BAA8B,EAAE,MAAM,CAAC;CACxC;AA8BD,eAAO,MAAM,eAAe,gBAAiB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config package versions - auto-generated during build
|
|
3
|
+
*
|
|
4
|
+
* In development, reads live from package.json files.
|
|
5
|
+
* In published mode, uses the generated versions.json.
|
|
6
|
+
*
|
|
7
|
+
* Run `npm run sync-versions` to update versions.json
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from 'fs';
|
|
10
|
+
import { dirname, join } from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
// Path to generated versions file (created during bundle)
|
|
14
|
+
// In compiled output, __dirname is dist/features, so versions.json is in same folder
|
|
15
|
+
const VERSIONS_JSON = join(__dirname, 'versions.json');
|
|
16
|
+
// Paths to config packages in monorepo (for development)
|
|
17
|
+
const PACKAGES_DIR = join(__dirname, '..', '..', '..', '..');
|
|
18
|
+
function readPackageVersion(packageName) {
|
|
19
|
+
const packagePath = join(PACKAGES_DIR, packageName, 'package.json');
|
|
20
|
+
try {
|
|
21
|
+
const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
22
|
+
return `^${pkg.version}`;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return '^1.0.0'; // Fallback
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function loadVersions() {
|
|
29
|
+
// In published mode, use pre-generated versions.json
|
|
30
|
+
if (existsSync(VERSIONS_JSON)) {
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(readFileSync(VERSIONS_JSON, 'utf-8'));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Fall through to dynamic loading
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// In development, read from actual package.json files
|
|
39
|
+
return {
|
|
40
|
+
'@react-spa-scaffold/eslint-config': readPackageVersion('eslint-config'),
|
|
41
|
+
'@react-spa-scaffold/prettier-config': readPackageVersion('prettier-config'),
|
|
42
|
+
'@react-spa-scaffold/tsconfig': readPackageVersion('tsconfig'),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export const CONFIG_VERSIONS = loadVersions();
|
|
46
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/features/versions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,0DAA0D;AAC1D,qFAAqF;AACrF,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAEvD,yDAAyD;AACzD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAQ7D,SAAS,kBAAkB,CAAC,WAAmB;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC,CAAC,WAAW;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,qDAAqD;IACrD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,OAAO;QACL,mCAAmC,EAAE,kBAAkB,CAAC,eAAe,CAAC;QACxE,qCAAqC,EAAE,kBAAkB,CAAC,iBAAiB,CAAC;QAC5E,8BAA8B,EAAE,kBAAkB,CAAC,UAAU,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,EAAE,CAAC"}
|