@react-spa-scaffold/mcp 1.1.3 → 1.2.1
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/constants.d.ts +35 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +35 -0
- package/dist/constants.js.map +1 -0
- 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 +27 -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 +17 -20
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/types.js +7 -1
- package/dist/features/types.js.map +1 -1
- package/dist/features/types.test.d.ts +5 -0
- package/dist/features/types.test.d.ts.map +1 -0
- package/dist/features/types.test.js +32 -0
- package/dist/features/types.test.js.map +1 -0
- package/dist/resources/docs.d.ts +2 -8
- package/dist/resources/docs.d.ts.map +1 -1
- package/dist/resources/docs.js +27 -49
- package/dist/resources/docs.js.map +1 -1
- package/dist/server.d.ts +2 -7
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +24 -57
- 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.d.ts +4 -15
- package/dist/tools/get-example.d.ts.map +1 -1
- package/dist/tools/get-example.js +3 -11
- package/dist/tools/get-example.js.map +1 -1
- 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 +15 -14
- package/dist/tools/get-features.d.ts.map +1 -1
- package/dist/tools/get-features.js +12 -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-file.d.ts +23 -0
- package/dist/tools/get-file.d.ts.map +1 -0
- package/dist/tools/get-file.js +53 -0
- package/dist/tools/get-file.js.map +1 -0
- package/dist/tools/get-file.test.d.ts +5 -0
- package/dist/tools/get-file.test.d.ts.map +1 -0
- package/dist/tools/get-file.test.js +63 -0
- package/dist/tools/get-file.test.js.map +1 -0
- package/dist/tools/get-scaffold.d.ts +8 -29
- package/dist/tools/get-scaffold.d.ts.map +1 -1
- package/dist/tools/get-scaffold.js +18 -24
- package/dist/tools/get-scaffold.js.map +1 -1
- 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 +197 -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 +13 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +47 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +41 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +8 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/cache.d.ts +25 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +61 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/docs.d.ts +1 -3
- package/dist/utils/docs.d.ts.map +1 -1
- package/dist/utils/docs.js +3 -8
- package/dist/utils/docs.js.map +1 -1
- 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 +65 -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/patterns.test.d.ts +6 -0
- package/dist/utils/examples/patterns.test.d.ts.map +1 -0
- package/dist/utils/examples/patterns.test.js +75 -0
- package/dist/utils/examples/patterns.test.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 +13 -23
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +28 -39
- 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 +38 -0
- package/dist/utils/paths.test.js.map +1 -0
- package/dist/utils/scaffold/claude-md/index.d.ts +7 -0
- package/dist/utils/scaffold/claude-md/index.d.ts.map +1 -0
- package/dist/utils/scaffold/claude-md/index.js +23 -0
- package/dist/utils/scaffold/claude-md/index.js.map +1 -0
- package/dist/utils/scaffold/claude-md/sections.d.ts +16 -0
- package/dist/utils/scaffold/claude-md/sections.d.ts.map +1 -0
- package/dist/utils/scaffold/claude-md/sections.js +269 -0
- package/dist/utils/scaffold/claude-md/sections.js.map +1 -0
- package/dist/utils/scaffold/commands.d.ts +7 -0
- package/dist/utils/scaffold/commands.d.ts.map +1 -0
- package/dist/utils/scaffold/commands.js +19 -0
- package/dist/utils/scaffold/commands.js.map +1 -0
- package/dist/utils/scaffold/compute.d.ts +15 -0
- package/dist/utils/scaffold/compute.d.ts.map +1 -0
- package/dist/utils/scaffold/compute.js +63 -0
- package/dist/utils/scaffold/compute.js.map +1 -0
- package/dist/utils/scaffold/dependencies.d.ts +25 -0
- package/dist/utils/scaffold/dependencies.d.ts.map +1 -0
- package/dist/utils/scaffold/dependencies.js +101 -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 +9 -0
- package/dist/utils/scaffold/generators.d.ts.map +1 -0
- package/dist/utils/scaffold/generators.js +121 -0
- package/dist/utils/scaffold/generators.js.map +1 -0
- package/dist/utils/scaffold/index.d.ts +10 -0
- package/dist/utils/scaffold/index.d.ts.map +1 -0
- package/dist/utils/scaffold/index.js +9 -0
- package/dist/utils/scaffold/index.js.map +1 -0
- package/package.json +2 -2
- 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 +0 -637
- package/dist/utils/scaffold.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const hookPatterns = {
|
|
2
|
+
'hook-state': {
|
|
3
|
+
file: 'src/hooks/useMediaQuery.ts',
|
|
4
|
+
description: 'State hook with browser API and cleanup',
|
|
5
|
+
keyPoints: [
|
|
6
|
+
'useRef for persistent MediaQueryList',
|
|
7
|
+
'useState with SSR-safe initialization',
|
|
8
|
+
'useEffect with cleanup function',
|
|
9
|
+
'Exports constants alongside hook (BREAKPOINTS)',
|
|
10
|
+
'Convenience wrapper hooks (useIsMobile, useIsDesktop)',
|
|
11
|
+
],
|
|
12
|
+
},
|
|
13
|
+
'hook-query': {
|
|
14
|
+
file: 'src/hooks/useExampleQuery.ts',
|
|
15
|
+
description: 'TanStack Query hook for data fetching',
|
|
16
|
+
keyPoints: [
|
|
17
|
+
'Separate async fetchFn outside hook',
|
|
18
|
+
'Typed with generics (useQuery<Todo[]>)',
|
|
19
|
+
'Namespaced queryKey array',
|
|
20
|
+
'Uses centralized API client',
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
'hook-form': {
|
|
24
|
+
file: 'src/hooks/useRegisterForm.ts',
|
|
25
|
+
description: 'React Hook Form + Zod validation hook',
|
|
26
|
+
keyPoints: [
|
|
27
|
+
'zodResolver for Zod integration',
|
|
28
|
+
'Type-safe with inferred RegisterFormData',
|
|
29
|
+
'Returns form object + handlers + reset',
|
|
30
|
+
'Extracts commonly used state (isSubmitting, errors)',
|
|
31
|
+
'Uses schema with refine() for cross-field validation',
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
'hook-effect': {
|
|
35
|
+
file: 'src/hooks/useThemeEffect.ts',
|
|
36
|
+
description: 'Effect-only hook with no return value',
|
|
37
|
+
keyPoints: [
|
|
38
|
+
'useEffect with conditional listener',
|
|
39
|
+
'Zustand store subscription',
|
|
40
|
+
'Cleanup function for event listener',
|
|
41
|
+
'DOM manipulation (classList)',
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
'use-language-hook': {
|
|
45
|
+
file: 'src/hooks/useLanguage.ts',
|
|
46
|
+
description: 'Hook for language/locale management',
|
|
47
|
+
keyPoints: [
|
|
48
|
+
'Integrates with Lingui i18n',
|
|
49
|
+
'useCallback for memoized async function',
|
|
50
|
+
'Persists to localStorage',
|
|
51
|
+
'Returns object with state + action',
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=hook-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-patterns.js","sourceRoot":"","sources":["../../../src/utils/examples/hook-patterns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,YAAY,EAAE;QACZ,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,yCAAyC;QACtD,SAAS,EAAE;YACT,sCAAsC;YACtC,uCAAuC;YACvC,iCAAiC;YACjC,gDAAgD;YAChD,uDAAuD;SACxD;KACF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,uCAAuC;QACpD,SAAS,EAAE;YACT,qCAAqC;YACrC,wCAAwC;YACxC,2BAA2B;YAC3B,6BAA6B;SAC9B;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,uCAAuC;QACpD,SAAS,EAAE;YACT,iCAAiC;YACjC,0CAA0C;YAC1C,wCAAwC;YACxC,qDAAqD;YACrD,sDAAsD;SACvD;KACF;IACD,aAAa,EAAE;QACb,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,uCAAuC;QACpD,SAAS,EAAE;YACT,qCAAqC;YACrC,4BAA4B;YAC5B,qCAAqC;YACrC,8BAA8B;SAC/B;KACF;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,qCAAqC;QAClD,SAAS,EAAE;YACT,6BAA6B;YAC7B,yCAAyC;YACzC,0BAA0B;YAC1B,oCAAoC;SACrC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/i18n-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,YAAY,EAAE,UAyC1B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const i18nPatterns = {
|
|
2
|
+
'i18n-index': {
|
|
3
|
+
file: 'src/i18n/index.ts',
|
|
4
|
+
description: 'i18n barrel export with initialization functions',
|
|
5
|
+
keyPoints: [
|
|
6
|
+
'Re-exports i18n instance from @lingui/core',
|
|
7
|
+
'initI18n() async function for app initialization',
|
|
8
|
+
'getLocale() returns current active locale',
|
|
9
|
+
'Re-exports config, detectLanguage, and dynamicActivate',
|
|
10
|
+
],
|
|
11
|
+
},
|
|
12
|
+
'trans-component': {
|
|
13
|
+
file: 'src/components/layout/Header.tsx',
|
|
14
|
+
description: 'Trans component usage for JSX text',
|
|
15
|
+
keyPoints: [
|
|
16
|
+
'Import from @lingui/react/macro',
|
|
17
|
+
'comment prop is REQUIRED (ESLint enforced)',
|
|
18
|
+
'Wraps user-visible text',
|
|
19
|
+
'Can contain JSX children',
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
't-function': {
|
|
23
|
+
file: 'src/components/shared/ThemeToggle/ThemeToggle.tsx',
|
|
24
|
+
description: 't() function for programmatic text',
|
|
25
|
+
keyPoints: [
|
|
26
|
+
'useLingui() hook for t function',
|
|
27
|
+
'Object syntax: t({ message, comment })',
|
|
28
|
+
'comment is REQUIRED',
|
|
29
|
+
'Use for dynamic text, attributes',
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
'language-switcher': {
|
|
33
|
+
file: 'src/components/shared/LanguageSwitcher/LanguageSwitcher.tsx',
|
|
34
|
+
description: 'Language selection component',
|
|
35
|
+
keyPoints: [
|
|
36
|
+
'useLanguage() hook',
|
|
37
|
+
'DropdownMenu for selection',
|
|
38
|
+
'supportedLocales array',
|
|
39
|
+
'changeLanguage async function',
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=i18n-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n-patterns.js","sourceRoot":"","sources":["../../../src/utils/examples/i18n-patterns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,YAAY,EAAE;QACZ,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,kDAAkD;QAC/D,SAAS,EAAE;YACT,4CAA4C;YAC5C,kDAAkD;YAClD,2CAA2C;YAC3C,wDAAwD;SACzD;KACF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,kCAAkC;QACxC,WAAW,EAAE,oCAAoC;QACjD,SAAS,EAAE;YACT,iCAAiC;YACjC,4CAA4C;YAC5C,yBAAyB;YACzB,0BAA0B;SAC3B;KACF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,mDAAmD;QACzD,WAAW,EAAE,oCAAoC;QACjD,SAAS,EAAE;YACT,iCAAiC;YACjC,wCAAwC;YACxC,qBAAqB;YACrB,kCAAkC;SACnC;KACF;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,6DAA6D;QACnE,WAAW,EAAE,8BAA8B;QAC3C,SAAS,EAAE;YACT,oBAAoB;YACpB,4BAA4B;YAC5B,wBAAwB;YACxB,+BAA+B;SAChC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code examples - provides real code patterns from the react-spa-scaffold repository.
|
|
3
|
+
*/
|
|
4
|
+
import type { CodeExample } from './types.js';
|
|
5
|
+
export type { CodeExample } from './types.js';
|
|
6
|
+
/** Get all available pattern names. */
|
|
7
|
+
export declare function getAvailablePatterns(): string[];
|
|
8
|
+
/** Get code example for a pattern. */
|
|
9
|
+
export declare function getCodeExample(pattern: string): Promise<CodeExample | null>;
|
|
10
|
+
/** Get all examples for a list of patterns (parallel). */
|
|
11
|
+
export declare function getFeatureExamples(patterns: string[]): Promise<CodeExample[]>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAY1D,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB9C,uCAAuC;AACvC,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,sCAAsC;AACtC,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwBjF;AAED,0DAA0D;AAC1D,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGnF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code examples - provides real code patterns from the react-spa-scaffold repository.
|
|
3
|
+
*/
|
|
4
|
+
import { readFile } from 'fs/promises';
|
|
5
|
+
import { resolveTemplatePath } from '../paths.js';
|
|
6
|
+
import { componentPatterns } from './component-patterns.js';
|
|
7
|
+
import { hookPatterns } from './hook-patterns.js';
|
|
8
|
+
import { mobilePatterns } from './mobile-patterns.js';
|
|
9
|
+
import { storePatterns } from './store-patterns.js';
|
|
10
|
+
import { pagePatterns } from './page-patterns.js';
|
|
11
|
+
import { contextPatterns } from './context-patterns.js';
|
|
12
|
+
import { apiPatterns } from './api-patterns.js';
|
|
13
|
+
import { testPatterns } from './test-patterns.js';
|
|
14
|
+
import { i18nPatterns } from './i18n-patterns.js';
|
|
15
|
+
import { utilityPatterns } from './utility-patterns.js';
|
|
16
|
+
/** All pattern definitions merged at startup. */
|
|
17
|
+
const PATTERN_MAP = {
|
|
18
|
+
...componentPatterns,
|
|
19
|
+
...hookPatterns,
|
|
20
|
+
...mobilePatterns,
|
|
21
|
+
...storePatterns,
|
|
22
|
+
...pagePatterns,
|
|
23
|
+
...contextPatterns,
|
|
24
|
+
...apiPatterns,
|
|
25
|
+
...testPatterns,
|
|
26
|
+
...i18nPatterns,
|
|
27
|
+
...utilityPatterns,
|
|
28
|
+
};
|
|
29
|
+
const PATTERN_NAMES = Object.keys(PATTERN_MAP).sort();
|
|
30
|
+
/** Get all available pattern names. */
|
|
31
|
+
export function getAvailablePatterns() {
|
|
32
|
+
return PATTERN_NAMES;
|
|
33
|
+
}
|
|
34
|
+
/** Get code example for a pattern. */
|
|
35
|
+
export async function getCodeExample(pattern) {
|
|
36
|
+
const mapping = PATTERN_MAP[pattern];
|
|
37
|
+
if (!mapping)
|
|
38
|
+
return null;
|
|
39
|
+
const fullPath = resolveTemplatePath(mapping.file);
|
|
40
|
+
try {
|
|
41
|
+
const code = await readFile(fullPath, 'utf-8');
|
|
42
|
+
return {
|
|
43
|
+
pattern,
|
|
44
|
+
description: mapping.description,
|
|
45
|
+
filePath: mapping.file,
|
|
46
|
+
code,
|
|
47
|
+
keyPoints: mapping.keyPoints,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return {
|
|
52
|
+
pattern,
|
|
53
|
+
description: mapping.description,
|
|
54
|
+
filePath: mapping.file,
|
|
55
|
+
code: `// File not found: ${mapping.file}\n// Run MCP server from within react-spa-scaffold repository`,
|
|
56
|
+
keyPoints: mapping.keyPoints,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Get all examples for a list of patterns (parallel). */
|
|
61
|
+
export async function getFeatureExamples(patterns) {
|
|
62
|
+
const examples = await Promise.all(patterns.map(getCodeExample));
|
|
63
|
+
return examples.filter((e) => e !== null);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/examples/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD,iDAAiD;AACjD,MAAM,WAAW,GAAe;IAC9B,GAAG,iBAAiB;IACpB,GAAG,YAAY;IACf,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,YAAY;IACf,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,eAAe;CACnB,CAAC;AAEF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;AAEtD,uCAAuC;AACvC,MAAM,UAAU,oBAAoB;IAClC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO;YACL,OAAO;YACP,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,IAAI;YACJ,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO;YACP,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,IAAI,EAAE,sBAAsB,OAAO,CAAC,IAAI,+DAA+D;YACvG,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAkB;IACzD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/mobile-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,cAAc,EAAE,UAoC5B,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const mobilePatterns = {
|
|
2
|
+
'mobile-context': {
|
|
3
|
+
file: 'src/contexts/mobileContext.tsx',
|
|
4
|
+
description: 'Mobile viewport detection context with optimized resize handling',
|
|
5
|
+
keyPoints: [
|
|
6
|
+
'MobileProvider tracks viewport width via window.innerWidth',
|
|
7
|
+
'useMobileContext hook returns isMobile, isTablet, isDesktop, width',
|
|
8
|
+
'requestAnimationFrame debouncing for performance',
|
|
9
|
+
'Only re-renders when width actually changes',
|
|
10
|
+
'SSR-safe with BREAKPOINTS.lg fallback',
|
|
11
|
+
'Throws error when used outside provider',
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
'use-media-query': {
|
|
15
|
+
file: 'src/hooks/useMediaQuery.ts',
|
|
16
|
+
description: 'Media query hook with breakpoint constants',
|
|
17
|
+
keyPoints: [
|
|
18
|
+
'BREAKPOINTS: sm (640), md (768), lg (1024), xl (1280)',
|
|
19
|
+
'useMediaQuery(query) for custom media queries',
|
|
20
|
+
'useIsMobile() returns true if width < md breakpoint',
|
|
21
|
+
'useIsDesktop() returns true if width >= lg breakpoint',
|
|
22
|
+
'Uses useRef to persist MediaQueryList object',
|
|
23
|
+
'SSR-safe initialization',
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
'use-touch-sizes': {
|
|
27
|
+
file: 'src/hooks/useTouchSizes.ts',
|
|
28
|
+
description: 'Touch-aware component sizing hook',
|
|
29
|
+
keyPoints: [
|
|
30
|
+
'Returns size variants based on device type (mobile vs desktop)',
|
|
31
|
+
'Integrates with MobileProvider via useMobileContext',
|
|
32
|
+
'Provides: button, buttonSm, iconButton, iconButtonLg, input, select, toggle, textarea',
|
|
33
|
+
'Mobile uses "touch" variants for larger tap targets',
|
|
34
|
+
'Desktop uses "default" or smaller variants',
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=mobile-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-patterns.js","sourceRoot":"","sources":["../../../src/utils/examples/mobile-patterns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,gBAAgB,EAAE;QAChB,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,kEAAkE;QAC/E,SAAS,EAAE;YACT,4DAA4D;YAC5D,oEAAoE;YACpE,kDAAkD;YAClD,6CAA6C;YAC7C,uCAAuC;YACvC,yCAAyC;SAC1C;KACF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,4CAA4C;QACzD,SAAS,EAAE;YACT,uDAAuD;YACvD,+CAA+C;YAC/C,qDAAqD;YACrD,uDAAuD;YACvD,8CAA8C;YAC9C,yBAAyB;SAC1B;KACF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,mCAAmC;QAChD,SAAS,EAAE;YACT,gEAAgE;YAChE,qDAAqD;YACrD,uFAAuF;YACvF,qDAAqD;YACrD,4CAA4C;SAC7C;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/page-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,YAAY,EAAE,UAgC1B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const pagePatterns = {
|
|
2
|
+
'page-component': {
|
|
3
|
+
file: 'src/pages/Home.tsx',
|
|
4
|
+
description: 'Page component with i18n and SEO',
|
|
5
|
+
keyPoints: [
|
|
6
|
+
'Named export (PageNamePage convention)',
|
|
7
|
+
'SEO component for page-specific meta tags',
|
|
8
|
+
'Trans component for all user text',
|
|
9
|
+
'Container layout classes',
|
|
10
|
+
'Minimal logic (pages are thin)',
|
|
11
|
+
],
|
|
12
|
+
},
|
|
13
|
+
'lazy-page': {
|
|
14
|
+
file: 'src/App.tsx',
|
|
15
|
+
description: 'Lazy loading pattern for pages with default SEO',
|
|
16
|
+
keyPoints: [
|
|
17
|
+
'React.lazy() with dynamic import',
|
|
18
|
+
'Transform named to default: .then(m => ({ default: m.PageName }))',
|
|
19
|
+
'Suspense boundary with fallback',
|
|
20
|
+
'Route constants from lib/routes.ts',
|
|
21
|
+
'Default SEO component for site-wide meta tags',
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
'route-constants': {
|
|
25
|
+
file: 'src/lib/routes.ts',
|
|
26
|
+
description: 'Typed route constants',
|
|
27
|
+
keyPoints: [
|
|
28
|
+
'ROUTES object with as const',
|
|
29
|
+
'AppRoute type for type-safe navigation',
|
|
30
|
+
'Centralized route definitions',
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=page-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-patterns.js","sourceRoot":"","sources":["../../../src/utils/examples/page-patterns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,gBAAgB,EAAE;QAChB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,kCAAkC;QAC/C,SAAS,EAAE;YACT,wCAAwC;YACxC,2CAA2C;YAC3C,mCAAmC;YACnC,0BAA0B;YAC1B,gCAAgC;SACjC;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,iDAAiD;QAC9D,SAAS,EAAE;YACT,kCAAkC;YAClC,mEAAmE;YACnE,iCAAiC;YACjC,oCAAoC;YACpC,+CAA+C;SAChD;KACF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,uBAAuB;QACpC,SAAS,EAAE;YACT,6BAA6B;YAC7B,wCAAwC;YACxC,+BAA+B;SAChC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.test.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/patterns.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern definition validation tests.
|
|
3
|
+
* Ensures all pattern file paths exist and definitions are complete.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { resolveTemplatePath } from '../paths.js';
|
|
8
|
+
import { getAvailablePatterns, getCodeExample } from './index.js';
|
|
9
|
+
// Import all pattern maps to test
|
|
10
|
+
import { componentPatterns } from './component-patterns.js';
|
|
11
|
+
import { hookPatterns } from './hook-patterns.js';
|
|
12
|
+
import { mobilePatterns } from './mobile-patterns.js';
|
|
13
|
+
import { storePatterns } from './store-patterns.js';
|
|
14
|
+
import { pagePatterns } from './page-patterns.js';
|
|
15
|
+
import { contextPatterns } from './context-patterns.js';
|
|
16
|
+
import { apiPatterns } from './api-patterns.js';
|
|
17
|
+
import { testPatterns } from './test-patterns.js';
|
|
18
|
+
import { i18nPatterns } from './i18n-patterns.js';
|
|
19
|
+
import { utilityPatterns } from './utility-patterns.js';
|
|
20
|
+
const ALL_PATTERNS = {
|
|
21
|
+
...componentPatterns,
|
|
22
|
+
...hookPatterns,
|
|
23
|
+
...mobilePatterns,
|
|
24
|
+
...storePatterns,
|
|
25
|
+
...pagePatterns,
|
|
26
|
+
...contextPatterns,
|
|
27
|
+
...apiPatterns,
|
|
28
|
+
...testPatterns,
|
|
29
|
+
...i18nPatterns,
|
|
30
|
+
...utilityPatterns,
|
|
31
|
+
};
|
|
32
|
+
describe('pattern definitions', () => {
|
|
33
|
+
const patterns = Object.entries(ALL_PATTERNS);
|
|
34
|
+
it.each(patterns)('pattern "%s" points to existing file', (_, def) => {
|
|
35
|
+
const fullPath = resolveTemplatePath(def.file);
|
|
36
|
+
expect(existsSync(fullPath), `File not found: ${def.file}`).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it.each(patterns)('pattern "%s" has description', (_, def) => {
|
|
39
|
+
expect(def.description).toBeTruthy();
|
|
40
|
+
expect(def.description.length).toBeGreaterThan(10);
|
|
41
|
+
});
|
|
42
|
+
it.each(patterns)('pattern "%s" has keyPoints array', (_, def) => {
|
|
43
|
+
expect(Array.isArray(def.keyPoints)).toBe(true);
|
|
44
|
+
expect(def.keyPoints.length).toBeGreaterThan(0);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('getAvailablePatterns', () => {
|
|
48
|
+
it('returns sorted array of pattern names', () => {
|
|
49
|
+
const patterns = getAvailablePatterns();
|
|
50
|
+
expect(patterns.length).toBeGreaterThan(0);
|
|
51
|
+
expect(patterns).toEqual([...patterns].sort());
|
|
52
|
+
});
|
|
53
|
+
it('includes all pattern categories', () => {
|
|
54
|
+
const patterns = getAvailablePatterns();
|
|
55
|
+
expect(patterns).toContain('component-ui');
|
|
56
|
+
expect(patterns).toContain('hook-state');
|
|
57
|
+
expect(patterns).toContain('zustand-store');
|
|
58
|
+
expect(patterns).toContain('test-component');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('getCodeExample', () => {
|
|
62
|
+
it('returns null for unknown pattern', async () => {
|
|
63
|
+
const result = await getCodeExample('non-existent-pattern');
|
|
64
|
+
expect(result).toBeNull();
|
|
65
|
+
});
|
|
66
|
+
it('returns complete example for valid pattern', async () => {
|
|
67
|
+
const result = await getCodeExample('component-ui');
|
|
68
|
+
expect(result).not.toBeNull();
|
|
69
|
+
expect(result?.pattern).toBe('component-ui');
|
|
70
|
+
expect(result?.code).toBeTruthy();
|
|
71
|
+
expect(result?.description).toBeTruthy();
|
|
72
|
+
expect(result?.keyPoints.length).toBeGreaterThan(0);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=patterns.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.test.js","sourceRoot":"","sources":["../../../src/utils/examples/patterns.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAElE,kCAAkC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,YAAY,GAAG;IACnB,GAAG,iBAAiB;IACpB,GAAG,YAAY;IACf,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,YAAY;IACf,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,eAAe;CACnB,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE9C,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,sCAAsC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACnE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,8BAA8B,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC3D,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,kCAAkC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC/D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,sBAAsB,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/store-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,UAsC3B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const storePatterns = {
|
|
2
|
+
'zustand-store': {
|
|
3
|
+
file: 'src/stores/preferencesStore.ts',
|
|
4
|
+
description: 'Zustand store with persistence and devtools',
|
|
5
|
+
keyPoints: [
|
|
6
|
+
'Separate type and interface definitions',
|
|
7
|
+
'Middleware stack: devtools(persist(...))',
|
|
8
|
+
'partialize for selective persistence',
|
|
9
|
+
'Computed getter (getResolvedTheme)',
|
|
10
|
+
'reset() action for initial state',
|
|
11
|
+
'Multi-tab sync function export',
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
'store-persistence': {
|
|
15
|
+
file: 'src/stores/preferencesStore.ts',
|
|
16
|
+
description: 'Zustand persist middleware',
|
|
17
|
+
keyPoints: [
|
|
18
|
+
'persist() middleware with name key',
|
|
19
|
+
'partialize to select what to persist',
|
|
20
|
+
'Storage key naming convention',
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
'multi-tab-sync': {
|
|
24
|
+
file: 'src/stores/preferencesStore.ts',
|
|
25
|
+
description: 'Multi-tab state synchronization',
|
|
26
|
+
keyPoints: ['Storage event listener', 'Rehydrate on storage change', 'Cleanup function for HMR'],
|
|
27
|
+
},
|
|
28
|
+
'storage-utility': {
|
|
29
|
+
file: 'src/lib/storage.ts',
|
|
30
|
+
description: 'Type-safe localStorage utilities',
|
|
31
|
+
keyPoints: [
|
|
32
|
+
'SSR-safe (typeof window check)',
|
|
33
|
+
'JSON serialization',
|
|
34
|
+
'Generic type parameter',
|
|
35
|
+
'Error handling with fallback',
|
|
36
|
+
'clearAppStorage for all prefixed keys',
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=store-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-patterns.js","sourceRoot":"","sources":["../../../src/utils/examples/store-patterns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAe;IACvC,eAAe,EAAE;QACf,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,6CAA6C;QAC1D,SAAS,EAAE;YACT,yCAAyC;YACzC,0CAA0C;YAC1C,sCAAsC;YACtC,oCAAoC;YACpC,kCAAkC;YAClC,gCAAgC;SACjC;KACF;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,4BAA4B;QACzC,SAAS,EAAE;YACT,oCAAoC;YACpC,sCAAsC;YACtC,+BAA+B;SAChC;KACF;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,iCAAiC;QAC9C,SAAS,EAAE,CAAC,wBAAwB,EAAE,6BAA6B,EAAE,0BAA0B,CAAC;KACjG;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,kCAAkC;QAC/C,SAAS,EAAE;YACT,gCAAgC;YAChC,oBAAoB;YACpB,wBAAwB;YACxB,8BAA8B;YAC9B,uCAAuC;SACxC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/test-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,YAAY,EAAE,UAwD1B,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const testPatterns = {
|
|
2
|
+
'test-component': {
|
|
3
|
+
file: 'src/components/layout/Header.test.tsx',
|
|
4
|
+
description: 'Component test with Testing Library',
|
|
5
|
+
keyPoints: [
|
|
6
|
+
'Import from vitest (describe, it, expect)',
|
|
7
|
+
'Custom render from @/test',
|
|
8
|
+
'screen queries (getByRole, getByText)',
|
|
9
|
+
'Semantic role assertions',
|
|
10
|
+
'Co-located with component source file',
|
|
11
|
+
],
|
|
12
|
+
},
|
|
13
|
+
'test-hook': {
|
|
14
|
+
file: 'src/hooks/useMediaQuery.test.ts',
|
|
15
|
+
description: 'Hook test with renderHook',
|
|
16
|
+
keyPoints: [
|
|
17
|
+
'renderHook from Testing Library',
|
|
18
|
+
'mockMatchMedia utility',
|
|
19
|
+
'beforeEach for setup',
|
|
20
|
+
'it.each for parameterized tests',
|
|
21
|
+
'act() for state updates',
|
|
22
|
+
'Co-located with hook source file',
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
'test-store': {
|
|
26
|
+
file: 'src/stores/preferencesStore.test.ts',
|
|
27
|
+
description: 'Zustand store test',
|
|
28
|
+
keyPoints: [
|
|
29
|
+
'Direct store access: useStore.getState()',
|
|
30
|
+
'act() wrapper for state changes',
|
|
31
|
+
'Reset state in beforeEach',
|
|
32
|
+
'Test actions and computed values',
|
|
33
|
+
'Co-located with store source file',
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
'test-utility': {
|
|
37
|
+
file: 'src/lib/utils.test.ts',
|
|
38
|
+
description: 'Utility function test',
|
|
39
|
+
keyPoints: ['Simple describe/it/expect pattern', 'Test edge cases', 'No mocking needed'],
|
|
40
|
+
},
|
|
41
|
+
'msw-handler': {
|
|
42
|
+
file: 'src/mocks/handlers/todos.ts',
|
|
43
|
+
description: 'MSW request handler',
|
|
44
|
+
keyPoints: [
|
|
45
|
+
'http.get/post from msw',
|
|
46
|
+
'HttpResponse.json() for responses',
|
|
47
|
+
'URL parameter extraction',
|
|
48
|
+
'delay() for realistic timing',
|
|
49
|
+
'Error responses with status codes',
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
'test-fixture': {
|
|
53
|
+
file: 'src/mocks/fixtures/todos.ts',
|
|
54
|
+
description: 'Test data fixtures',
|
|
55
|
+
keyPoints: ['Typed mock data', 'Realistic test values', 'Reusable across tests'],
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=test-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-patterns.js","sourceRoot":"","sources":["../../../src/utils/examples/test-patterns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,gBAAgB,EAAE;QAChB,IAAI,EAAE,uCAAuC;QAC7C,WAAW,EAAE,qCAAqC;QAClD,SAAS,EAAE;YACT,2CAA2C;YAC3C,2BAA2B;YAC3B,uCAAuC;YACvC,0BAA0B;YAC1B,uCAAuC;SACxC;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,iCAAiC;QACvC,WAAW,EAAE,2BAA2B;QACxC,SAAS,EAAE;YACT,iCAAiC;YACjC,wBAAwB;YACxB,sBAAsB;YACtB,iCAAiC;YACjC,yBAAyB;YACzB,kCAAkC;SACnC;KACF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,oBAAoB;QACjC,SAAS,EAAE;YACT,0CAA0C;YAC1C,iCAAiC;YACjC,2BAA2B;YAC3B,kCAAkC;YAClC,mCAAmC;SACpC;KACF;IACD,cAAc,EAAE;QACd,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,uBAAuB;QACpC,SAAS,EAAE,CAAC,mCAAmC,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;KACzF;IACD,aAAa,EAAE;QACb,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,qBAAqB;QAClC,SAAS,EAAE;YACT,wBAAwB;YACxB,mCAAmC;YACnC,0BAA0B;YAC1B,8BAA8B;YAC9B,mCAAmC;SACpC;KACF;IACD,cAAc,EAAE;QACd,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,oBAAoB;QACjC,SAAS,EAAE,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,uBAAuB,CAAC;KACjF;CACF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Code example returned by get_example tool. */
|
|
2
|
+
export interface CodeExample {
|
|
3
|
+
pattern: string;
|
|
4
|
+
description: string;
|
|
5
|
+
filePath: string;
|
|
6
|
+
code: string;
|
|
7
|
+
keyPoints: string[];
|
|
8
|
+
}
|
|
9
|
+
/** Pattern definition mapping. */
|
|
10
|
+
export interface PatternDef {
|
|
11
|
+
file: string;
|
|
12
|
+
description: string;
|
|
13
|
+
keyPoints: string[];
|
|
14
|
+
}
|
|
15
|
+
/** Pattern map type. */
|
|
16
|
+
export type PatternMap = Record<string, PatternDef>;
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,kCAAkC;AAClC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAwB;AACxB,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/examples/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utility-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/utility-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,eAAe,EAAE,UA2E7B,CAAC"}
|