@react-spa-scaffold/mcp 1.1.3 → 1.2.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 +19 -15
- package/dist/features/definitions/api.d.ts +3 -0
- package/dist/features/definitions/api.d.ts.map +1 -0
- package/dist/features/definitions/api.js +20 -0
- package/dist/features/definitions/api.js.map +1 -0
- package/dist/features/definitions/ci.d.ts +3 -0
- package/dist/features/definitions/ci.d.ts.map +1 -0
- package/dist/features/definitions/ci.js +25 -0
- package/dist/features/definitions/ci.js.map +1 -0
- package/dist/features/definitions/core.d.ts +3 -0
- package/dist/features/definitions/core.d.ts.map +1 -0
- package/dist/features/definitions/core.js +76 -0
- package/dist/features/definitions/core.js.map +1 -0
- package/dist/features/definitions/devtools.d.ts +3 -0
- package/dist/features/definitions/devtools.d.ts.map +1 -0
- package/dist/features/definitions/devtools.js +53 -0
- package/dist/features/definitions/devtools.js.map +1 -0
- package/dist/features/definitions/forms.d.ts +3 -0
- package/dist/features/definitions/forms.d.ts.map +1 -0
- package/dist/features/definitions/forms.js +32 -0
- package/dist/features/definitions/forms.js.map +1 -0
- package/dist/features/definitions/i18n.d.ts +3 -0
- package/dist/features/definitions/i18n.d.ts.map +1 -0
- package/dist/features/definitions/i18n.js +50 -0
- package/dist/features/definitions/i18n.js.map +1 -0
- package/dist/features/definitions/index.d.ts +15 -0
- package/dist/features/definitions/index.d.ts.map +1 -0
- package/dist/features/definitions/index.js +15 -0
- package/dist/features/definitions/index.js.map +1 -0
- package/dist/features/definitions/mobile.d.ts +3 -0
- package/dist/features/definitions/mobile.d.ts.map +1 -0
- package/dist/features/definitions/mobile.js +19 -0
- package/dist/features/definitions/mobile.js.map +1 -0
- package/dist/features/definitions/observability.d.ts +3 -0
- package/dist/features/definitions/observability.d.ts.map +1 -0
- package/dist/features/definitions/observability.js +21 -0
- package/dist/features/definitions/observability.js.map +1 -0
- package/dist/features/definitions/performance.d.ts +3 -0
- package/dist/features/definitions/performance.d.ts.map +1 -0
- package/dist/features/definitions/performance.js +28 -0
- package/dist/features/definitions/performance.js.map +1 -0
- package/dist/features/definitions/routing.d.ts +3 -0
- package/dist/features/definitions/routing.d.ts.map +1 -0
- package/dist/features/definitions/routing.js +25 -0
- package/dist/features/definitions/routing.js.map +1 -0
- package/dist/features/definitions/state.d.ts +3 -0
- package/dist/features/definitions/state.d.ts.map +1 -0
- package/dist/features/definitions/state.js +27 -0
- package/dist/features/definitions/state.js.map +1 -0
- package/dist/features/definitions/testing.d.ts +3 -0
- package/dist/features/definitions/testing.d.ts.map +1 -0
- package/dist/features/definitions/testing.js +56 -0
- package/dist/features/definitions/testing.js.map +1 -0
- package/dist/features/definitions/theming.d.ts +3 -0
- package/dist/features/definitions/theming.d.ts.map +1 -0
- package/dist/features/definitions/theming.js +26 -0
- package/dist/features/definitions/theming.js.map +1 -0
- package/dist/features/definitions/ui.d.ts +3 -0
- package/dist/features/definitions/ui.d.ts.map +1 -0
- package/dist/features/definitions/ui.js +44 -0
- package/dist/features/definitions/ui.js.map +1 -0
- package/dist/features/index.d.ts +3 -2
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +2 -1
- package/dist/features/index.js.map +1 -1
- package/dist/features/registry.d.ts +3 -9
- package/dist/features/registry.d.ts.map +1 -1
- package/dist/features/registry.js +3 -554
- package/dist/features/registry.js.map +1 -1
- package/dist/features/types.d.ts +11 -9
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/types.js +24 -1
- package/dist/features/types.js.map +1 -1
- package/dist/server.d.ts +2 -7
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +22 -56
- package/dist/server.js.map +1 -1
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +14 -0
- package/dist/server.test.js.map +1 -0
- package/dist/tools/get-example.test.d.ts +5 -0
- package/dist/tools/get-example.test.d.ts.map +1 -0
- package/dist/tools/get-example.test.js +63 -0
- package/dist/tools/get-example.test.js.map +1 -0
- package/dist/tools/get-features.d.ts +0 -5
- package/dist/tools/get-features.d.ts.map +1 -1
- package/dist/tools/get-features.js +0 -2
- package/dist/tools/get-features.js.map +1 -1
- package/dist/tools/get-features.test.d.ts +5 -0
- package/dist/tools/get-features.test.d.ts.map +1 -0
- package/dist/tools/get-features.test.js +45 -0
- package/dist/tools/get-features.test.js.map +1 -0
- package/dist/tools/get-scaffold.d.ts +2 -2
- package/dist/tools/get-scaffold.test.d.ts +5 -0
- package/dist/tools/get-scaffold.test.d.ts.map +1 -0
- package/dist/tools/get-scaffold.test.js +194 -0
- package/dist/tools/get-scaffold.test.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +9 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +29 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +23 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/cache.d.ts +21 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +45 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/docs.test.d.ts +5 -0
- package/dist/utils/docs.test.d.ts.map +1 -0
- package/dist/utils/docs.test.js +37 -0
- package/dist/utils/docs.test.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +19 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/examples/api-patterns.d.ts +3 -0
- package/dist/utils/examples/api-patterns.d.ts.map +1 -0
- package/dist/utils/examples/api-patterns.js +19 -0
- package/dist/utils/examples/api-patterns.js.map +1 -0
- package/dist/utils/examples/component-patterns.d.ts +3 -0
- package/dist/utils/examples/component-patterns.d.ts.map +1 -0
- package/dist/utils/examples/component-patterns.js +71 -0
- package/dist/utils/examples/component-patterns.js.map +1 -0
- package/dist/utils/examples/context-patterns.d.ts +3 -0
- package/dist/utils/examples/context-patterns.d.ts.map +1 -0
- package/dist/utils/examples/context-patterns.js +32 -0
- package/dist/utils/examples/context-patterns.js.map +1 -0
- package/dist/utils/examples/hook-patterns.d.ts +3 -0
- package/dist/utils/examples/hook-patterns.d.ts.map +1 -0
- package/dist/utils/examples/hook-patterns.js +55 -0
- package/dist/utils/examples/hook-patterns.js.map +1 -0
- package/dist/utils/examples/i18n-patterns.d.ts +3 -0
- package/dist/utils/examples/i18n-patterns.d.ts.map +1 -0
- package/dist/utils/examples/i18n-patterns.js +43 -0
- package/dist/utils/examples/i18n-patterns.js.map +1 -0
- package/dist/utils/examples/index.d.ts +12 -0
- package/dist/utils/examples/index.d.ts.map +1 -0
- package/dist/utils/examples/index.js +69 -0
- package/dist/utils/examples/index.js.map +1 -0
- package/dist/utils/examples/mobile-patterns.d.ts +3 -0
- package/dist/utils/examples/mobile-patterns.d.ts.map +1 -0
- package/dist/utils/examples/mobile-patterns.js +38 -0
- package/dist/utils/examples/mobile-patterns.js.map +1 -0
- package/dist/utils/examples/page-patterns.d.ts +3 -0
- package/dist/utils/examples/page-patterns.d.ts.map +1 -0
- package/dist/utils/examples/page-patterns.js +34 -0
- package/dist/utils/examples/page-patterns.js.map +1 -0
- package/dist/utils/examples/store-patterns.d.ts +3 -0
- package/dist/utils/examples/store-patterns.d.ts.map +1 -0
- package/dist/utils/examples/store-patterns.js +40 -0
- package/dist/utils/examples/store-patterns.js.map +1 -0
- package/dist/utils/examples/test-patterns.d.ts +3 -0
- package/dist/utils/examples/test-patterns.d.ts.map +1 -0
- package/dist/utils/examples/test-patterns.js +58 -0
- package/dist/utils/examples/test-patterns.js.map +1 -0
- package/dist/utils/examples/types.d.ts +17 -0
- package/dist/utils/examples/types.d.ts.map +1 -0
- package/dist/utils/examples/types.js +2 -0
- package/dist/utils/examples/types.js.map +1 -0
- package/dist/utils/examples/utility-patterns.d.ts +3 -0
- package/dist/utils/examples/utility-patterns.d.ts.map +1 -0
- package/dist/utils/examples/utility-patterns.js +77 -0
- package/dist/utils/examples/utility-patterns.js.map +1 -0
- package/dist/utils/index.d.ts +5 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/paths.d.ts +6 -25
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +11 -40
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/paths.test.d.ts +2 -0
- package/dist/utils/paths.test.d.ts.map +1 -0
- package/dist/utils/paths.test.js +17 -0
- package/dist/utils/paths.test.js.map +1 -0
- package/dist/utils/scaffold/commands.d.ts +11 -0
- package/dist/utils/scaffold/commands.d.ts.map +1 -0
- package/dist/utils/scaffold/commands.js +22 -0
- package/dist/utils/scaffold/commands.js.map +1 -0
- package/dist/utils/scaffold/compute.d.ts +18 -0
- package/dist/utils/scaffold/compute.d.ts.map +1 -0
- package/dist/utils/scaffold/compute.js +78 -0
- package/dist/utils/scaffold/compute.js.map +1 -0
- package/dist/utils/scaffold/dependencies.d.ts +32 -0
- package/dist/utils/scaffold/dependencies.d.ts.map +1 -0
- package/dist/utils/scaffold/dependencies.js +107 -0
- package/dist/utils/scaffold/dependencies.js.map +1 -0
- package/dist/utils/scaffold/file-structure.d.ts +23 -0
- package/dist/utils/scaffold/file-structure.d.ts.map +1 -0
- package/dist/utils/scaffold/file-structure.js +62 -0
- package/dist/utils/scaffold/file-structure.js.map +1 -0
- package/dist/utils/scaffold/generators.d.ts +17 -0
- package/dist/utils/scaffold/generators.d.ts.map +1 -0
- package/dist/utils/{scaffold.js → scaffold/generators.js} +6 -254
- package/dist/utils/scaffold/generators.js.map +1 -0
- package/dist/utils/scaffold/index.d.ts +11 -0
- package/dist/utils/scaffold/index.d.ts.map +1 -0
- package/dist/utils/scaffold/index.js +11 -0
- package/dist/utils/scaffold/index.js.map +1 -0
- package/package.json +1 -1
- package/templates/.github/workflows/release.yml +1 -1
- package/templates/e2e/tests/home.spec.ts +2 -2
- package/templates/e2e/tests/language.spec.ts +7 -3
- package/dist/utils/examples.d.ts +0 -27
- package/dist/utils/examples.d.ts.map +0 -1
- package/dist/utils/examples.js +0 -438
- package/dist/utils/examples.js.map +0 -1
- package/dist/utils/scaffold.d.ts +0 -59
- package/dist/utils/scaffold.d.ts.map +0 -1
- package/dist/utils/scaffold.js.map +0 -1
|
@@ -1,557 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Feature Registry -
|
|
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.
|
|
2
|
+
* Feature Registry - Aggregates all feature definitions.
|
|
7
3
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
11
|
-
const core = {
|
|
12
|
-
name: 'Core',
|
|
13
|
-
description: 'React 19 + TypeScript + Vite 7 + Tailwind CSS v4',
|
|
14
|
-
required: true,
|
|
15
|
-
includes: [
|
|
16
|
-
'React 19 with TypeScript (~5.9.0)',
|
|
17
|
-
'Vite 7 build system',
|
|
18
|
-
'Tailwind CSS v4 with Vite plugin',
|
|
19
|
-
'Inter variable font (@fontsource-variable/inter)',
|
|
20
|
-
'Environment validation with Zod (src/lib/env.ts)',
|
|
21
|
-
'cn() class merge utility (clsx + tailwind-merge)',
|
|
22
|
-
'Basic SEO component (React 19 native head hoisting)',
|
|
23
|
-
'App configuration (src/lib/config.ts)',
|
|
24
|
-
'Type definitions',
|
|
25
|
-
'ErrorBoundary component with reset functionality',
|
|
26
|
-
],
|
|
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
|
-
],
|
|
39
|
-
files: [
|
|
40
|
-
'src/main.tsx',
|
|
41
|
-
'src/App.tsx',
|
|
42
|
-
'src/index.css',
|
|
43
|
-
'src/vite-env.d.ts',
|
|
44
|
-
'src/lib/config.ts',
|
|
45
|
-
'src/lib/env.ts',
|
|
46
|
-
'src/lib/utils.ts',
|
|
47
|
-
'src/lib/index.ts',
|
|
48
|
-
'src/types/index.ts',
|
|
49
|
-
'src/hooks/index.ts',
|
|
50
|
-
'src/components/shared/SEO/SEO.tsx',
|
|
51
|
-
'src/components/shared/SEO/index.ts',
|
|
52
|
-
'src/components/shared/ErrorBoundary/ErrorBoundary.tsx',
|
|
53
|
-
'src/components/shared/ErrorBoundary/index.ts',
|
|
54
|
-
'src/components/shared/index.ts',
|
|
55
|
-
'index.html',
|
|
56
|
-
'vite.config.ts',
|
|
57
|
-
'tsconfig.json',
|
|
58
|
-
'tsconfig.app.json',
|
|
59
|
-
'tsconfig.node.json',
|
|
60
|
-
'.env.example',
|
|
61
|
-
'.gitignore',
|
|
62
|
-
'public/favicon.svg',
|
|
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
|
-
],
|
|
70
|
-
patterns: ['component-shared', 'hook-effect', 'error-boundary', 'seo-component'],
|
|
71
|
-
scripts: {
|
|
72
|
-
dev: 'vite',
|
|
73
|
-
build: 'tsc -b && vite build',
|
|
74
|
-
preview: 'vite preview',
|
|
75
|
-
typecheck: 'tsc --noEmit',
|
|
76
|
-
},
|
|
77
|
-
configFiles: [
|
|
78
|
-
'vite.config.ts',
|
|
79
|
-
'tsconfig.json',
|
|
80
|
-
'tsconfig.app.json',
|
|
81
|
-
'tsconfig.node.json',
|
|
82
|
-
'.gitignore',
|
|
83
|
-
'src/index.css',
|
|
84
|
-
],
|
|
85
|
-
};
|
|
86
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
87
|
-
// MOBILE FEATURE
|
|
88
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
89
|
-
const mobile = {
|
|
90
|
-
name: 'Mobile Support',
|
|
91
|
-
description: 'Responsive design utilities with viewport detection, breakpoints, and touch-aware sizing',
|
|
92
|
-
required: false,
|
|
93
|
-
includes: [
|
|
94
|
-
'MobileProvider context for viewport detection',
|
|
95
|
-
'useMobileContext hook (isMobile, isTablet, isDesktop, width)',
|
|
96
|
-
'useMediaQuery hook with BREAKPOINTS constants (sm, md, lg, xl)',
|
|
97
|
-
'useIsMobile and useIsDesktop convenience hooks',
|
|
98
|
-
'useTouchSizes hook for touch-aware component sizing',
|
|
99
|
-
'requestAnimationFrame-debounced resize handling',
|
|
100
|
-
'SSR-safe viewport detection with fallbacks',
|
|
101
|
-
],
|
|
102
|
-
// No additional dependencies - pure React implementation
|
|
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'],
|
|
105
|
-
patterns: ['mobile-context', 'use-media-query', 'use-touch-sizes'],
|
|
106
|
-
scripts: {},
|
|
107
|
-
};
|
|
108
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
109
|
-
// ROUTING FEATURE
|
|
110
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
111
|
-
const routing = {
|
|
112
|
-
name: 'Routing',
|
|
113
|
-
description: 'React Router 7 with lazy loading and route constants',
|
|
114
|
-
required: false,
|
|
115
|
-
includes: [
|
|
116
|
-
'React Router 7',
|
|
117
|
-
'Lazy-loaded pages with React.lazy()',
|
|
118
|
-
'Route constants with TypeScript types (generated based on features)',
|
|
119
|
-
'404 Not Found page',
|
|
120
|
-
'App.tsx with Suspense fallback',
|
|
121
|
-
'PageLoading component for transitions',
|
|
122
|
-
],
|
|
123
|
-
dependencyNames: ['react-router'],
|
|
124
|
-
files: [
|
|
125
|
-
// routes.ts is generated dynamically (see routesTs in scaffold output)
|
|
126
|
-
'src/pages/Home.tsx',
|
|
127
|
-
'src/pages/NotFound.tsx',
|
|
128
|
-
'src/pages/index.ts',
|
|
129
|
-
'src/components/ui/loading.tsx',
|
|
130
|
-
'src/components/ui/visually-hidden.tsx',
|
|
131
|
-
],
|
|
132
|
-
testFiles: ['e2e/tests/navigation.spec.ts'],
|
|
133
|
-
patterns: ['lazy-page', 'route-constants', 'page-component'],
|
|
134
|
-
scripts: {},
|
|
135
|
-
};
|
|
136
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
137
|
-
// UI COMPONENTS FEATURE
|
|
138
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
139
|
-
const ui = {
|
|
140
|
-
name: 'UI Components',
|
|
141
|
-
description: 'Shadcn/UI + icons + animations + toasts',
|
|
142
|
-
required: false,
|
|
143
|
-
includes: [
|
|
144
|
-
'Shadcn/UI component system (radix-nova style)',
|
|
145
|
-
'Radix UI primitives',
|
|
146
|
-
'CVA (class-variance-authority) for variants',
|
|
147
|
-
'Lucide React icons',
|
|
148
|
-
'tw-animate-css for animations',
|
|
149
|
-
'Sonner toast notifications',
|
|
150
|
-
'Button with variants (default, destructive, outline, etc.)',
|
|
151
|
-
'DropdownMenu component',
|
|
152
|
-
'Loading, Skeleton, Spinner components',
|
|
153
|
-
'VisuallyHidden and SkipLink (accessibility)',
|
|
154
|
-
'components.json for shadcn CLI',
|
|
155
|
-
],
|
|
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'],
|
|
165
|
-
files: [
|
|
166
|
-
'src/components/ui/button.tsx',
|
|
167
|
-
'src/components/ui/dropdown-menu.tsx',
|
|
168
|
-
'src/components/ui/loading.tsx',
|
|
169
|
-
'src/components/ui/skeleton.tsx',
|
|
170
|
-
'src/components/ui/spinner.tsx',
|
|
171
|
-
'src/components/ui/sonner.tsx',
|
|
172
|
-
'src/components/ui/visually-hidden.tsx',
|
|
173
|
-
'src/components/layout/Header.tsx',
|
|
174
|
-
'src/components/layout/index.ts',
|
|
175
|
-
'components.json',
|
|
176
|
-
],
|
|
177
|
-
testFiles: ['src/components/ui/loading.test.tsx', 'src/components/layout/Header.test.tsx'],
|
|
178
|
-
patterns: ['component-ui', 'button-variants', 'forward-ref-component'],
|
|
179
|
-
scripts: {},
|
|
180
|
-
configFiles: ['components.json'],
|
|
181
|
-
};
|
|
182
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
183
|
-
// FORMS FEATURE
|
|
184
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
185
|
-
const forms = {
|
|
186
|
-
name: 'Form Handling',
|
|
187
|
-
description: 'React Hook Form + Zod validation + working demo form',
|
|
188
|
-
required: false,
|
|
189
|
-
includes: [
|
|
190
|
-
'React Hook Form with Zod validation',
|
|
191
|
-
'@hookform/resolvers for schema integration',
|
|
192
|
-
'RegisterForm component with validation demo (displayed on HomePage)',
|
|
193
|
-
'Form error components (FieldErrorMessage, FormErrorSummary, RootFormError)',
|
|
194
|
-
'useRegisterForm custom hook pattern',
|
|
195
|
-
'Zod schema with refine() for cross-field validation',
|
|
196
|
-
],
|
|
197
|
-
dependencyNames: [
|
|
198
|
-
'@hookform/resolvers',
|
|
199
|
-
'react-hook-form',
|
|
200
|
-
// zod already in core
|
|
201
|
-
],
|
|
202
|
-
files: [
|
|
203
|
-
'src/lib/validations.ts',
|
|
204
|
-
'src/hooks/useRegisterForm.ts',
|
|
205
|
-
'src/components/ui/form-error.tsx',
|
|
206
|
-
'src/components/ui/input.tsx',
|
|
207
|
-
'src/components/ui/label.tsx',
|
|
208
|
-
'src/components/ui/card.tsx',
|
|
209
|
-
'src/components/shared/RegisterForm/RegisterForm.tsx',
|
|
210
|
-
'src/components/shared/RegisterForm/index.ts',
|
|
211
|
-
],
|
|
212
|
-
testFiles: [
|
|
213
|
-
'src/lib/validations.test.ts',
|
|
214
|
-
'src/hooks/useRegisterForm.test.tsx',
|
|
215
|
-
'src/components/shared/RegisterForm/RegisterForm.test.tsx',
|
|
216
|
-
],
|
|
217
|
-
patterns: ['zod-schema', 'hook-form', 'form-error-component', 'register-form'],
|
|
218
|
-
scripts: {},
|
|
219
|
-
};
|
|
220
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
221
|
-
// STATE MANAGEMENT FEATURE
|
|
222
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
223
|
-
const state = {
|
|
224
|
-
name: 'State Management',
|
|
225
|
-
description: 'Zustand with persistence, devtools, and multi-tab sync',
|
|
226
|
-
required: false,
|
|
227
|
-
includes: [
|
|
228
|
-
'Zustand store',
|
|
229
|
-
'Persist middleware (localStorage)',
|
|
230
|
-
'Devtools middleware',
|
|
231
|
-
'Multi-tab sync utility (initPreferencesSync)',
|
|
232
|
-
'Storage utilities (get/set/remove/clear)',
|
|
233
|
-
'Prefixed storage keys',
|
|
234
|
-
'Example preferences store (theme)',
|
|
235
|
-
'Type-safe store selectors',
|
|
236
|
-
],
|
|
237
|
-
dependencyNames: ['zustand'],
|
|
238
|
-
files: [
|
|
239
|
-
'src/stores/preferencesStore.ts',
|
|
240
|
-
'src/stores/index.ts',
|
|
241
|
-
'src/lib/storage.ts',
|
|
242
|
-
'src/lib/storageKeys.ts',
|
|
243
|
-
'src/types/preferences.ts',
|
|
244
|
-
],
|
|
245
|
-
testFiles: ['src/lib/storage.test.ts', 'src/stores/preferencesStore.test.ts'],
|
|
246
|
-
patterns: ['zustand-store', 'store-persistence', 'multi-tab-sync', 'storage-utility'],
|
|
247
|
-
scripts: {},
|
|
248
|
-
};
|
|
249
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
250
|
-
// API FEATURE
|
|
251
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
252
|
-
const api = {
|
|
253
|
-
name: 'API',
|
|
254
|
-
description: 'TanStack Query + typed API client',
|
|
255
|
-
required: false,
|
|
256
|
-
includes: [
|
|
257
|
-
'TanStack Query v5',
|
|
258
|
-
'QueryProvider with optimized defaults (staleTime, gcTime, retry)',
|
|
259
|
-
'Typed API client with methods (get/post/put/patch/delete)',
|
|
260
|
-
'ApiClientError class with status and code',
|
|
261
|
-
'Request timeout handling',
|
|
262
|
-
'Example useExampleQuery hook',
|
|
263
|
-
'API types (Todo, PaginatedResponse, etc.)',
|
|
264
|
-
],
|
|
265
|
-
dependencyNames: ['@tanstack/react-query'],
|
|
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'],
|
|
268
|
-
patterns: ['query-provider', 'use-query-hook', 'api-client'],
|
|
269
|
-
scripts: {},
|
|
270
|
-
};
|
|
271
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
272
|
-
// INTERNATIONALIZATION FEATURE
|
|
273
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
274
|
-
const i18n = {
|
|
275
|
-
name: 'Internationalization',
|
|
276
|
-
description: 'LinguiJS with dynamic loading and language detection',
|
|
277
|
-
required: false,
|
|
278
|
-
includes: [
|
|
279
|
-
'LinguiJS (core + react + macro)',
|
|
280
|
-
'Trans component for JSX text',
|
|
281
|
-
't() function for programmatic text',
|
|
282
|
-
'Dynamic catalog loading (code splitting per locale)',
|
|
283
|
-
'Browser language detection',
|
|
284
|
-
'Language switcher component',
|
|
285
|
-
'ESLint rule for translator comments (enforced)',
|
|
286
|
-
'Locale files (.po format) for en, es, de',
|
|
287
|
-
'Vite plugin for compilation',
|
|
288
|
-
'useLanguage hook',
|
|
289
|
-
],
|
|
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
|
-
],
|
|
298
|
-
files: [
|
|
299
|
-
'src/i18n/config.ts',
|
|
300
|
-
'src/i18n/detectLanguage.ts',
|
|
301
|
-
'src/i18n/loadCatalog.ts',
|
|
302
|
-
'src/i18n/index.ts',
|
|
303
|
-
'src/locales/en.po',
|
|
304
|
-
'src/locales/es.po',
|
|
305
|
-
'src/locales/de.po',
|
|
306
|
-
'src/hooks/useLanguage.ts',
|
|
307
|
-
'src/components/shared/LanguageSwitcher/LanguageSwitcher.tsx',
|
|
308
|
-
'src/components/shared/LanguageSwitcher/index.ts',
|
|
309
|
-
'lingui.config.js',
|
|
310
|
-
],
|
|
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'],
|
|
319
|
-
scripts: {
|
|
320
|
-
'i18n:extract': 'lingui extract',
|
|
321
|
-
},
|
|
322
|
-
};
|
|
323
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
324
|
-
// TESTING FEATURE
|
|
325
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
326
|
-
const testing = {
|
|
327
|
-
name: 'Testing',
|
|
328
|
-
description: 'Vitest + Testing Library + Playwright + MSW',
|
|
329
|
-
required: false,
|
|
330
|
-
includes: [
|
|
331
|
-
'Vitest for unit testing',
|
|
332
|
-
'React Testing Library',
|
|
333
|
-
'@testing-library/user-event for interactions',
|
|
334
|
-
'Playwright for E2E testing (Chromium)',
|
|
335
|
-
'MSW (Mock Service Worker) for API mocking',
|
|
336
|
-
'Test utilities (render, providers, mocks)',
|
|
337
|
-
'80% coverage threshold (lines, functions, statements, branches)',
|
|
338
|
-
'jsdom environment',
|
|
339
|
-
'Example tests for components, hooks, stores, utilities',
|
|
340
|
-
'MSW handlers for API endpoints',
|
|
341
|
-
'Test fixtures for mock data',
|
|
342
|
-
],
|
|
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
|
-
],
|
|
353
|
-
files: [
|
|
354
|
-
'src/test-setup.ts',
|
|
355
|
-
'src/test/mocks.ts',
|
|
356
|
-
'src/test/providers.tsx',
|
|
357
|
-
'src/test/index.ts',
|
|
358
|
-
'src/mocks/handlers/todos.ts',
|
|
359
|
-
'src/mocks/handlers/index.ts',
|
|
360
|
-
'src/mocks/fixtures/todos.ts',
|
|
361
|
-
'src/mocks/fixtures/index.ts',
|
|
362
|
-
'src/mocks/node.ts',
|
|
363
|
-
'src/mocks/index.ts',
|
|
364
|
-
'e2e/fixtures/',
|
|
365
|
-
'e2e/tests/',
|
|
366
|
-
'vitest.config.ts',
|
|
367
|
-
'playwright.config.ts',
|
|
368
|
-
'docs/TESTING.md',
|
|
369
|
-
'docs/E2E_TESTING.md',
|
|
370
|
-
],
|
|
371
|
-
patterns: ['test-component', 'test-hook', 'test-store', 'test-utility', 'msw-handler', 'test-fixture'],
|
|
372
|
-
scripts: {
|
|
373
|
-
test: 'vitest run',
|
|
374
|
-
'test:watch': 'vitest',
|
|
375
|
-
'test:coverage': 'vitest run --coverage',
|
|
376
|
-
e2e: 'playwright test --project=functional',
|
|
377
|
-
'e2e:ui': 'playwright test --project=functional --ui',
|
|
378
|
-
},
|
|
379
|
-
configFiles: ['vitest.config.ts', 'playwright.config.ts', 'src/test-setup.ts'],
|
|
380
|
-
};
|
|
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
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
412
|
-
// DEVELOPER TOOLING FEATURE
|
|
413
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
414
|
-
const devtools = {
|
|
415
|
-
name: 'Developer Tooling',
|
|
416
|
-
description: 'ESLint + Prettier + Husky + Commitlint (using @react-spa-scaffold shared configs)',
|
|
417
|
-
required: false,
|
|
418
|
-
includes: [
|
|
419
|
-
'@react-spa-scaffold/eslint-config (React + TypeScript + LinguiJS)',
|
|
420
|
-
'@react-spa-scaffold/prettier-config (with Tailwind plugin)',
|
|
421
|
-
'ESLint with TypeScript and React Hooks plugins',
|
|
422
|
-
'eslint-plugin-react-refresh for HMR',
|
|
423
|
-
'Prettier with Tailwind CSS plugin',
|
|
424
|
-
'Husky for git hooks',
|
|
425
|
-
'lint-staged for pre-commit linting',
|
|
426
|
-
'Commitlint for conventional commits',
|
|
427
|
-
'.nvmrc for Node.js version (22)',
|
|
428
|
-
'Pre-commit hook: typecheck + lint-staged',
|
|
429
|
-
'Commit-msg hook: commitlint',
|
|
430
|
-
],
|
|
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
|
-
],
|
|
448
|
-
files: [
|
|
449
|
-
'eslint.config.js',
|
|
450
|
-
'prettier.config.js',
|
|
451
|
-
'commitlint.config.js',
|
|
452
|
-
'.husky/pre-commit',
|
|
453
|
-
'.husky/commit-msg',
|
|
454
|
-
'.nvmrc',
|
|
455
|
-
],
|
|
456
|
-
patterns: [],
|
|
457
|
-
scripts: {
|
|
458
|
-
lint: 'eslint .',
|
|
459
|
-
'lint:fix': 'eslint . --fix',
|
|
460
|
-
format: 'prettier --write .',
|
|
461
|
-
'format:check': 'prettier --check .',
|
|
462
|
-
prepare: 'husky',
|
|
463
|
-
},
|
|
464
|
-
configFiles: ['eslint.config.js', 'prettier.config.js', 'commitlint.config.js'],
|
|
465
|
-
};
|
|
466
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
467
|
-
// CI/CD FEATURE
|
|
468
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
469
|
-
const ci = {
|
|
470
|
-
name: 'CI/CD',
|
|
471
|
-
description: 'GitHub Actions + Performance Testing + Dependabot',
|
|
472
|
-
required: false,
|
|
473
|
-
includes: [
|
|
474
|
-
'GitHub Actions CI workflow',
|
|
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)',
|
|
477
|
-
'Dependabot with grouped updates by category',
|
|
478
|
-
'PR template',
|
|
479
|
-
'Artifact uploads (dist, coverage, performance reports)',
|
|
480
|
-
'Dependency caching for faster builds',
|
|
481
|
-
'Custom setup-node-deps action',
|
|
482
|
-
],
|
|
483
|
-
// No additional dependencies - CI configuration only
|
|
484
|
-
files: [
|
|
485
|
-
'.github/workflows/ci.yml',
|
|
486
|
-
'.github/actions/setup-node-deps/action.yml',
|
|
487
|
-
'.github/dependabot.yml',
|
|
488
|
-
'.github/PULL_REQUEST_TEMPLATE.md',
|
|
489
|
-
],
|
|
490
|
-
patterns: [],
|
|
491
|
-
scripts: {},
|
|
492
|
-
configFiles: [],
|
|
493
|
-
};
|
|
494
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
495
|
-
// OBSERVABILITY FEATURE
|
|
496
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
497
|
-
const observability = {
|
|
498
|
-
name: 'Observability',
|
|
499
|
-
description: 'Sentry error tracking with source maps (opt-out via VITE_SENTRY_ENABLED=false)',
|
|
500
|
-
required: false,
|
|
501
|
-
includes: [
|
|
502
|
-
'Sentry React SDK (@sentry/react)',
|
|
503
|
-
'Lazy-loaded Sentry initialization (non-blocking)',
|
|
504
|
-
'Browser tracing integration',
|
|
505
|
-
'Global error handlers (window.onerror, unhandledrejection)',
|
|
506
|
-
'ErrorBoundary integration with Sentry reporting',
|
|
507
|
-
'Source map upload via Vite plugin (CI/CD)',
|
|
508
|
-
'VITE_SENTRY_ENABLED flag for opt-out',
|
|
509
|
-
'SENTRY_CONFIG in lib/config.ts',
|
|
510
|
-
],
|
|
511
|
-
dependencyNames: ['@sentry/react'],
|
|
512
|
-
devDependencyNames: ['@sentry/vite-plugin'],
|
|
513
|
-
files: ['src/lib/config.ts'],
|
|
514
|
-
patterns: ['main-entry', 'lib-config'],
|
|
515
|
-
scripts: {},
|
|
516
|
-
options: {
|
|
517
|
-
enabled: {
|
|
518
|
-
description: 'Enable/disable Sentry at runtime via VITE_SENTRY_ENABLED env var',
|
|
519
|
-
default: true,
|
|
520
|
-
},
|
|
521
|
-
},
|
|
522
|
-
};
|
|
523
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
524
|
-
// THEMING FEATURE
|
|
525
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
526
|
-
const theming = {
|
|
527
|
-
name: 'Theming',
|
|
528
|
-
description: 'Light/dark/system theme toggle with CSS variables (requires state feature)',
|
|
529
|
-
required: false,
|
|
530
|
-
includes: [
|
|
531
|
-
'Light/dark/system theme modes',
|
|
532
|
-
'useThemeEffect hook (applies .dark class to document)',
|
|
533
|
-
'ThemeToggle component',
|
|
534
|
-
'System preference detection (prefers-color-scheme)',
|
|
535
|
-
'Zustand persistence via preferencesStore',
|
|
536
|
-
'Multi-tab sync via storage events',
|
|
537
|
-
],
|
|
538
|
-
// No additional dependencies - uses state feature's Zustand
|
|
539
|
-
files: [
|
|
540
|
-
'src/hooks/useThemeEffect.ts',
|
|
541
|
-
'src/components/shared/ThemeToggle/ThemeToggle.tsx',
|
|
542
|
-
'src/components/shared/ThemeToggle/index.ts',
|
|
543
|
-
],
|
|
544
|
-
testFiles: [
|
|
545
|
-
'src/hooks/useThemeEffect.test.ts',
|
|
546
|
-
'src/components/shared/ThemeToggle/ThemeToggle.test.tsx',
|
|
547
|
-
'e2e/tests/theme.spec.ts',
|
|
548
|
-
],
|
|
549
|
-
patterns: ['theme-toggle', 'hook-effect'],
|
|
550
|
-
scripts: {},
|
|
551
|
-
};
|
|
552
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
553
|
-
// FEATURE REGISTRY EXPORT
|
|
554
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
4
|
+
import { core, mobile, routing, ui, forms, state, api, i18n, testing, performance, devtools, ci, observability, theming, } from './definitions/index.js';
|
|
5
|
+
/** All available features for scaffolding. */
|
|
555
6
|
export const FEATURES = {
|
|
556
7
|
core,
|
|
557
8
|
mobile,
|
|
@@ -568,6 +19,4 @@ export const FEATURES = {
|
|
|
568
19
|
observability,
|
|
569
20
|
theming,
|
|
570
21
|
};
|
|
571
|
-
/** All valid feature IDs */
|
|
572
|
-
export const FEATURE_IDS = Object.keys(FEATURES);
|
|
573
22
|
//# sourceMappingURL=registry.js.map
|
|
@@ -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":"AAAA;;GAEG;AAGH,OAAO,EACL,IAAI,EACJ,MAAM,EACN,OAAO,EACP,EAAE,EACF,KAAK,EACL,KAAK,EACL,GAAG,EACH,IAAI,EACJ,OAAO,EACP,WAAW,EACX,QAAQ,EACR,EAAE,EACF,aAAa,EACb,OAAO,GACR,MAAM,wBAAwB,CAAC;AAEhC,8CAA8C;AAC9C,MAAM,CAAC,MAAM,QAAQ,GAAoB;IACvC,IAAI;IACJ,MAAM;IACN,OAAO;IACP,EAAE;IACF,KAAK;IACL,KAAK;IACL,GAAG;IACH,IAAI;IACJ,OAAO;IACP,WAAW;IACX,QAAQ;IACR,EAAE;IACF,aAAa;IACb,OAAO;CACR,CAAC"}
|
package/dist/features/types.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Type definitions for feature modules
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/**
|
|
5
|
+
* All valid feature IDs as a const tuple.
|
|
6
|
+
* Used for compile-time type safety when referencing features.
|
|
7
|
+
*/
|
|
8
|
+
export declare const FEATURE_IDS: readonly ["core", "mobile", "routing", "ui", "forms", "state", "api", "i18n", "testing", "performance", "devtools", "ci", "observability", "theming"];
|
|
9
|
+
/** Type-safe feature identifier */
|
|
10
|
+
export type FeatureId = (typeof FEATURE_IDS)[number];
|
|
11
|
+
/** Type guard to check if a string is a valid FeatureId */
|
|
12
|
+
export declare function isFeatureId(value: string): value is FeatureId;
|
|
8
13
|
export interface Feature {
|
|
9
14
|
name: string;
|
|
10
15
|
description: string;
|
|
@@ -24,16 +29,13 @@ export interface Feature {
|
|
|
24
29
|
*/
|
|
25
30
|
testFiles?: string[];
|
|
26
31
|
patterns: string[];
|
|
27
|
-
options?: Record<string, FeatureOption>;
|
|
28
32
|
scripts?: Record<string, string>;
|
|
29
33
|
configFiles?: string[];
|
|
30
34
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
35
|
+
/** Type-safe feature registry mapping FeatureId to Feature */
|
|
36
|
+
export type FeatureRegistry = Record<FeatureId, Feature>;
|
|
34
37
|
export interface ScaffoldOptions {
|
|
35
38
|
features: string[];
|
|
36
|
-
options?: Record<string, boolean>;
|
|
37
39
|
projectName?: string;
|
|
38
40
|
}
|
|
39
41
|
export interface ScaffoldResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW,uJAed,CAAC;AAEX,mCAAmC;AACnC,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D;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,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,8DAA8D;AAC9D,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,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"}
|