@react-spa-scaffold/mcp 1.1.2 → 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.
Files changed (218) hide show
  1. package/README.md +19 -15
  2. package/dist/features/definitions/api.d.ts +3 -0
  3. package/dist/features/definitions/api.d.ts.map +1 -0
  4. package/dist/features/definitions/api.js +20 -0
  5. package/dist/features/definitions/api.js.map +1 -0
  6. package/dist/features/definitions/ci.d.ts +3 -0
  7. package/dist/features/definitions/ci.d.ts.map +1 -0
  8. package/dist/features/definitions/ci.js +25 -0
  9. package/dist/features/definitions/ci.js.map +1 -0
  10. package/dist/features/definitions/core.d.ts +3 -0
  11. package/dist/features/definitions/core.d.ts.map +1 -0
  12. package/dist/features/definitions/core.js +76 -0
  13. package/dist/features/definitions/core.js.map +1 -0
  14. package/dist/features/definitions/devtools.d.ts +3 -0
  15. package/dist/features/definitions/devtools.d.ts.map +1 -0
  16. package/dist/features/definitions/devtools.js +53 -0
  17. package/dist/features/definitions/devtools.js.map +1 -0
  18. package/dist/features/definitions/forms.d.ts +3 -0
  19. package/dist/features/definitions/forms.d.ts.map +1 -0
  20. package/dist/features/definitions/forms.js +32 -0
  21. package/dist/features/definitions/forms.js.map +1 -0
  22. package/dist/features/definitions/i18n.d.ts +3 -0
  23. package/dist/features/definitions/i18n.d.ts.map +1 -0
  24. package/dist/features/definitions/i18n.js +50 -0
  25. package/dist/features/definitions/i18n.js.map +1 -0
  26. package/dist/features/definitions/index.d.ts +15 -0
  27. package/dist/features/definitions/index.d.ts.map +1 -0
  28. package/dist/features/definitions/index.js +15 -0
  29. package/dist/features/definitions/index.js.map +1 -0
  30. package/dist/features/definitions/mobile.d.ts +3 -0
  31. package/dist/features/definitions/mobile.d.ts.map +1 -0
  32. package/dist/features/definitions/mobile.js +19 -0
  33. package/dist/features/definitions/mobile.js.map +1 -0
  34. package/dist/features/definitions/observability.d.ts +3 -0
  35. package/dist/features/definitions/observability.d.ts.map +1 -0
  36. package/dist/features/definitions/observability.js +21 -0
  37. package/dist/features/definitions/observability.js.map +1 -0
  38. package/dist/features/definitions/performance.d.ts +3 -0
  39. package/dist/features/definitions/performance.d.ts.map +1 -0
  40. package/dist/features/definitions/performance.js +28 -0
  41. package/dist/features/definitions/performance.js.map +1 -0
  42. package/dist/features/definitions/routing.d.ts +3 -0
  43. package/dist/features/definitions/routing.d.ts.map +1 -0
  44. package/dist/features/definitions/routing.js +25 -0
  45. package/dist/features/definitions/routing.js.map +1 -0
  46. package/dist/features/definitions/state.d.ts +3 -0
  47. package/dist/features/definitions/state.d.ts.map +1 -0
  48. package/dist/features/definitions/state.js +27 -0
  49. package/dist/features/definitions/state.js.map +1 -0
  50. package/dist/features/definitions/testing.d.ts +3 -0
  51. package/dist/features/definitions/testing.d.ts.map +1 -0
  52. package/dist/features/definitions/testing.js +56 -0
  53. package/dist/features/definitions/testing.js.map +1 -0
  54. package/dist/features/definitions/theming.d.ts +3 -0
  55. package/dist/features/definitions/theming.d.ts.map +1 -0
  56. package/dist/features/definitions/theming.js +26 -0
  57. package/dist/features/definitions/theming.js.map +1 -0
  58. package/dist/features/definitions/ui.d.ts +3 -0
  59. package/dist/features/definitions/ui.d.ts.map +1 -0
  60. package/dist/features/definitions/ui.js +44 -0
  61. package/dist/features/definitions/ui.js.map +1 -0
  62. package/dist/features/index.d.ts +3 -2
  63. package/dist/features/index.d.ts.map +1 -1
  64. package/dist/features/index.js +2 -1
  65. package/dist/features/index.js.map +1 -1
  66. package/dist/features/registry.d.ts +3 -9
  67. package/dist/features/registry.d.ts.map +1 -1
  68. package/dist/features/registry.js +3 -554
  69. package/dist/features/registry.js.map +1 -1
  70. package/dist/features/types.d.ts +11 -9
  71. package/dist/features/types.d.ts.map +1 -1
  72. package/dist/features/types.js +24 -1
  73. package/dist/features/types.js.map +1 -1
  74. package/dist/server.d.ts +2 -7
  75. package/dist/server.d.ts.map +1 -1
  76. package/dist/server.js +22 -56
  77. package/dist/server.js.map +1 -1
  78. package/dist/server.test.d.ts +2 -0
  79. package/dist/server.test.d.ts.map +1 -0
  80. package/dist/server.test.js +14 -0
  81. package/dist/server.test.js.map +1 -0
  82. package/dist/tools/get-example.test.d.ts +5 -0
  83. package/dist/tools/get-example.test.d.ts.map +1 -0
  84. package/dist/tools/get-example.test.js +63 -0
  85. package/dist/tools/get-example.test.js.map +1 -0
  86. package/dist/tools/get-features.d.ts +0 -5
  87. package/dist/tools/get-features.d.ts.map +1 -1
  88. package/dist/tools/get-features.js +0 -2
  89. package/dist/tools/get-features.js.map +1 -1
  90. package/dist/tools/get-features.test.d.ts +5 -0
  91. package/dist/tools/get-features.test.d.ts.map +1 -0
  92. package/dist/tools/get-features.test.js +45 -0
  93. package/dist/tools/get-features.test.js.map +1 -0
  94. package/dist/tools/get-scaffold.d.ts +2 -2
  95. package/dist/tools/get-scaffold.test.d.ts +5 -0
  96. package/dist/tools/get-scaffold.test.d.ts.map +1 -0
  97. package/dist/tools/get-scaffold.test.js +194 -0
  98. package/dist/tools/get-scaffold.test.js.map +1 -0
  99. package/dist/tools/index.d.ts +2 -0
  100. package/dist/tools/index.d.ts.map +1 -1
  101. package/dist/tools/index.js +1 -0
  102. package/dist/tools/index.js.map +1 -1
  103. package/dist/tools/registry.d.ts +9 -0
  104. package/dist/tools/registry.d.ts.map +1 -0
  105. package/dist/tools/registry.js +29 -0
  106. package/dist/tools/registry.js.map +1 -0
  107. package/dist/tools/types.d.ts +23 -0
  108. package/dist/tools/types.d.ts.map +1 -0
  109. package/dist/tools/types.js +5 -0
  110. package/dist/tools/types.js.map +1 -0
  111. package/dist/utils/cache.d.ts +21 -0
  112. package/dist/utils/cache.d.ts.map +1 -0
  113. package/dist/utils/cache.js +45 -0
  114. package/dist/utils/cache.js.map +1 -0
  115. package/dist/utils/docs.test.d.ts +5 -0
  116. package/dist/utils/docs.test.d.ts.map +1 -0
  117. package/dist/utils/docs.test.js +37 -0
  118. package/dist/utils/docs.test.js.map +1 -0
  119. package/dist/utils/errors.d.ts +8 -0
  120. package/dist/utils/errors.d.ts.map +1 -0
  121. package/dist/utils/errors.js +19 -0
  122. package/dist/utils/errors.js.map +1 -0
  123. package/dist/utils/examples/api-patterns.d.ts +3 -0
  124. package/dist/utils/examples/api-patterns.d.ts.map +1 -0
  125. package/dist/utils/examples/api-patterns.js +19 -0
  126. package/dist/utils/examples/api-patterns.js.map +1 -0
  127. package/dist/utils/examples/component-patterns.d.ts +3 -0
  128. package/dist/utils/examples/component-patterns.d.ts.map +1 -0
  129. package/dist/utils/examples/component-patterns.js +71 -0
  130. package/dist/utils/examples/component-patterns.js.map +1 -0
  131. package/dist/utils/examples/context-patterns.d.ts +3 -0
  132. package/dist/utils/examples/context-patterns.d.ts.map +1 -0
  133. package/dist/utils/examples/context-patterns.js +32 -0
  134. package/dist/utils/examples/context-patterns.js.map +1 -0
  135. package/dist/utils/examples/hook-patterns.d.ts +3 -0
  136. package/dist/utils/examples/hook-patterns.d.ts.map +1 -0
  137. package/dist/utils/examples/hook-patterns.js +55 -0
  138. package/dist/utils/examples/hook-patterns.js.map +1 -0
  139. package/dist/utils/examples/i18n-patterns.d.ts +3 -0
  140. package/dist/utils/examples/i18n-patterns.d.ts.map +1 -0
  141. package/dist/utils/examples/i18n-patterns.js +43 -0
  142. package/dist/utils/examples/i18n-patterns.js.map +1 -0
  143. package/dist/utils/examples/index.d.ts +12 -0
  144. package/dist/utils/examples/index.d.ts.map +1 -0
  145. package/dist/utils/examples/index.js +69 -0
  146. package/dist/utils/examples/index.js.map +1 -0
  147. package/dist/utils/examples/mobile-patterns.d.ts +3 -0
  148. package/dist/utils/examples/mobile-patterns.d.ts.map +1 -0
  149. package/dist/utils/examples/mobile-patterns.js +38 -0
  150. package/dist/utils/examples/mobile-patterns.js.map +1 -0
  151. package/dist/utils/examples/page-patterns.d.ts +3 -0
  152. package/dist/utils/examples/page-patterns.d.ts.map +1 -0
  153. package/dist/utils/examples/page-patterns.js +34 -0
  154. package/dist/utils/examples/page-patterns.js.map +1 -0
  155. package/dist/utils/examples/store-patterns.d.ts +3 -0
  156. package/dist/utils/examples/store-patterns.d.ts.map +1 -0
  157. package/dist/utils/examples/store-patterns.js +40 -0
  158. package/dist/utils/examples/store-patterns.js.map +1 -0
  159. package/dist/utils/examples/test-patterns.d.ts +3 -0
  160. package/dist/utils/examples/test-patterns.d.ts.map +1 -0
  161. package/dist/utils/examples/test-patterns.js +58 -0
  162. package/dist/utils/examples/test-patterns.js.map +1 -0
  163. package/dist/utils/examples/types.d.ts +17 -0
  164. package/dist/utils/examples/types.d.ts.map +1 -0
  165. package/dist/utils/examples/types.js +2 -0
  166. package/dist/utils/examples/types.js.map +1 -0
  167. package/dist/utils/examples/utility-patterns.d.ts +3 -0
  168. package/dist/utils/examples/utility-patterns.d.ts.map +1 -0
  169. package/dist/utils/examples/utility-patterns.js +77 -0
  170. package/dist/utils/examples/utility-patterns.js.map +1 -0
  171. package/dist/utils/index.d.ts +5 -3
  172. package/dist/utils/index.d.ts.map +1 -1
  173. package/dist/utils/index.js +5 -3
  174. package/dist/utils/index.js.map +1 -1
  175. package/dist/utils/paths.d.ts +6 -25
  176. package/dist/utils/paths.d.ts.map +1 -1
  177. package/dist/utils/paths.js +11 -40
  178. package/dist/utils/paths.js.map +1 -1
  179. package/dist/utils/paths.test.d.ts +2 -0
  180. package/dist/utils/paths.test.d.ts.map +1 -0
  181. package/dist/utils/paths.test.js +17 -0
  182. package/dist/utils/paths.test.js.map +1 -0
  183. package/dist/utils/scaffold/commands.d.ts +11 -0
  184. package/dist/utils/scaffold/commands.d.ts.map +1 -0
  185. package/dist/utils/scaffold/commands.js +22 -0
  186. package/dist/utils/scaffold/commands.js.map +1 -0
  187. package/dist/utils/scaffold/compute.d.ts +18 -0
  188. package/dist/utils/scaffold/compute.d.ts.map +1 -0
  189. package/dist/utils/scaffold/compute.js +78 -0
  190. package/dist/utils/scaffold/compute.js.map +1 -0
  191. package/dist/utils/scaffold/dependencies.d.ts +32 -0
  192. package/dist/utils/scaffold/dependencies.d.ts.map +1 -0
  193. package/dist/utils/scaffold/dependencies.js +107 -0
  194. package/dist/utils/scaffold/dependencies.js.map +1 -0
  195. package/dist/utils/scaffold/file-structure.d.ts +23 -0
  196. package/dist/utils/scaffold/file-structure.d.ts.map +1 -0
  197. package/dist/utils/scaffold/file-structure.js +62 -0
  198. package/dist/utils/scaffold/file-structure.js.map +1 -0
  199. package/dist/utils/scaffold/generators.d.ts +17 -0
  200. package/dist/utils/scaffold/generators.d.ts.map +1 -0
  201. package/dist/utils/{scaffold.js → scaffold/generators.js} +6 -254
  202. package/dist/utils/scaffold/generators.js.map +1 -0
  203. package/dist/utils/scaffold/index.d.ts +11 -0
  204. package/dist/utils/scaffold/index.d.ts.map +1 -0
  205. package/dist/utils/scaffold/index.js +11 -0
  206. package/dist/utils/scaffold/index.js.map +1 -0
  207. package/package.json +1 -1
  208. package/templates/.github/actions/setup-node-deps/action.yml +1 -0
  209. package/templates/.github/workflows/release.yml +2 -1
  210. package/templates/e2e/tests/home.spec.ts +2 -2
  211. package/templates/e2e/tests/language.spec.ts +7 -3
  212. package/dist/utils/examples.d.ts +0 -27
  213. package/dist/utils/examples.d.ts.map +0 -1
  214. package/dist/utils/examples.js +0 -438
  215. package/dist/utils/examples.js.map +0 -1
  216. package/dist/utils/scaffold.d.ts +0 -59
  217. package/dist/utils/scaffold.d.ts.map +0 -1
  218. package/dist/utils/scaffold.js.map +0 -1
package/README.md CHANGED
@@ -103,7 +103,7 @@ Or point directly to the built file:
103
103
 
104
104
  ## Available Features
105
105
 
106
- 13 feature modules that can be combined:
106
+ 14 feature modules that can be combined:
107
107
 
108
108
  | Feature | Description | Required |
109
109
  | --------------- | --------------------------------------------- | -------- |
@@ -349,10 +349,9 @@ The server supports two modes:
349
349
  - Templates copied at publish time via `npm run bundle`
350
350
 
351
351
  ```typescript
352
- // Automatically detects which mode
353
- const TEMPLATES_ROOT = existsSync(BUNDLED_TEMPLATES)
354
- ? BUNDLED_TEMPLATES // npx mode
355
- : MONOREPO_ROOT; // development mode
352
+ // Automatically detects which mode via .bundled marker file
353
+ export const isPublishedMode = existsSync(BUNDLE_MARKER);
354
+ export const CONTENT_ROOT = isPublishedMode ? BUNDLED_PATH : MONOREPO_ROOT;
356
355
  ```
357
356
 
358
357
  </details>
@@ -378,26 +377,31 @@ npm publish
378
377
  <details>
379
378
  <summary>Adding a New Feature</summary>
380
379
 
381
- 1. **Define in** `src/features/registry.ts`:
380
+ 1. **Create feature file** in `src/features/definitions/my-feature.ts`:
382
381
 
383
382
  ```typescript
384
- const myFeature: Feature = {
383
+ import type { Feature } from '../types.js';
384
+
385
+ export const myFeature: Feature = {
385
386
  name: 'My Feature',
386
387
  description: 'Description shown to users',
387
388
  required: false,
388
389
  includes: ['Thing 1', 'Thing 2'],
389
- dependencies: { 'some-package': '^1.0.0' },
390
- devDependencies: { 'some-dev-package': '^2.0.0' },
390
+ dependencyNames: ['some-package'],
391
+ devDependencyNames: ['some-dev-package'],
391
392
  files: ['src/lib/myFeature.ts'],
392
393
  patterns: ['my-feature-pattern'],
393
394
  scripts: { 'my-script': 'some-command' },
394
- configFiles: ['my-feature.config.js'],
395
395
  };
396
396
  ```
397
397
 
398
- 2. **Add patterns** in `src/utils/examples.ts`:
398
+ 2. **Export from** `src/features/definitions/index.ts`
399
399
 
400
- ```typescript
400
+ 3. **Add to** `src/features/registry.ts` FEATURES object
401
+
402
+ 4. **Add patterns** in `src/utils/examples/utility-patterns.ts` (or appropriate category):
403
+
404
+ ```
401
405
  'my-feature-pattern': {
402
406
  file: 'src/lib/myFeature.ts',
403
407
  description: 'My feature implementation',
@@ -405,9 +409,9 @@ const myFeature: Feature = {
405
409
  },
406
410
  ```
407
411
 
408
- 3. **Create actual files** in react-spa-scaffold's `src/`
412
+ 5. **Create actual files** in react-spa-scaffold's `src/`
409
413
 
410
- 4. **Rebuild**: `npm run build`
414
+ 6. **Rebuild**: `npm run build`
411
415
 
412
416
  </details>
413
417
 
@@ -416,7 +420,7 @@ const myFeature: Feature = {
416
420
 
417
421
  1. **Add to** `src/resources/docs.ts`:
418
422
 
419
- ```typescript
423
+ ```
420
424
  'docs://my-topic': {
421
425
  files: ['docs/MY_TOPIC.md'],
422
426
  name: 'My Topic',
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const api: Feature;
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,GAAG,EAAE,OAkBjB,CAAC"}
@@ -0,0 +1,20 @@
1
+ export const api = {
2
+ name: 'API',
3
+ description: 'TanStack Query + typed API client',
4
+ required: false,
5
+ includes: [
6
+ 'TanStack Query v5',
7
+ 'QueryProvider with optimized defaults (staleTime, gcTime, retry)',
8
+ 'Typed API client with methods (get/post/put/patch/delete)',
9
+ 'ApiClientError class with status and code',
10
+ 'Request timeout handling',
11
+ 'Example useExampleQuery hook',
12
+ 'API types (Todo, PaginatedResponse, etc.)',
13
+ ],
14
+ dependencyNames: ['@tanstack/react-query'],
15
+ files: ['src/lib/api.ts', 'src/contexts/queryContext.tsx', 'src/hooks/useExampleQuery.ts', 'src/types/api.ts'],
16
+ testFiles: ['src/lib/api.test.ts', 'src/hooks/useExampleQuery.test.tsx'],
17
+ patterns: ['query-provider', 'use-query-hook', 'api-client'],
18
+ scripts: {},
19
+ };
20
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/features/definitions/api.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAY;IAC1B,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,mCAAmC;IAChD,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,mBAAmB;QACnB,kEAAkE;QAClE,2DAA2D;QAC3D,2CAA2C;QAC3C,0BAA0B;QAC1B,8BAA8B;QAC9B,2CAA2C;KAC5C;IACD,eAAe,EAAE,CAAC,uBAAuB,CAAC;IAC1C,KAAK,EAAE,CAAC,gBAAgB,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,kBAAkB,CAAC;IAC9G,SAAS,EAAE,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;IACxE,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,CAAC;IAC5D,OAAO,EAAE,EAAE;CACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const ci: Feature;
3
+ //# sourceMappingURL=ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/ci.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,EAAE,EAAE,OAuBhB,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const ci = {
2
+ name: 'CI/CD',
3
+ description: 'GitHub Actions + Performance Testing + Dependabot',
4
+ required: false,
5
+ includes: [
6
+ 'GitHub Actions CI workflow',
7
+ 'Parallel jobs: lint, typecheck, security audit, build, unit tests, e2e tests, performance tests',
8
+ 'Performance testing with react-performance-tracking (React Profiler, Lighthouse, Web Vitals)',
9
+ 'Dependabot with grouped updates by category',
10
+ 'PR template',
11
+ 'Artifact uploads (dist, coverage, performance reports)',
12
+ 'Dependency caching for faster builds',
13
+ 'Custom setup-node-deps action',
14
+ ],
15
+ files: [
16
+ '.github/workflows/ci.yml',
17
+ '.github/actions/setup-node-deps/action.yml',
18
+ '.github/dependabot.yml',
19
+ '.github/PULL_REQUEST_TEMPLATE.md',
20
+ ],
21
+ patterns: [],
22
+ scripts: {},
23
+ configFiles: [],
24
+ };
25
+ //# sourceMappingURL=ci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../../src/features/definitions/ci.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAY;IACzB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,mDAAmD;IAChE,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,4BAA4B;QAC5B,iGAAiG;QACjG,8FAA8F;QAC9F,6CAA6C;QAC7C,aAAa;QACb,wDAAwD;QACxD,sCAAsC;QACtC,+BAA+B;KAChC;IACD,KAAK,EAAE;QACL,0BAA0B;QAC1B,4CAA4C;QAC5C,wBAAwB;QACxB,kCAAkC;KACnC;IACD,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,EAAE;CAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const core: Feature;
3
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,IAAI,EAAE,OA0ElB,CAAC"}
@@ -0,0 +1,76 @@
1
+ export const core = {
2
+ name: 'Core',
3
+ description: 'React 19 + TypeScript + Vite 7 + Tailwind CSS v4',
4
+ required: true,
5
+ includes: [
6
+ 'React 19 with TypeScript (~5.9.0)',
7
+ 'Vite 7 build system',
8
+ 'Tailwind CSS v4 with Vite plugin',
9
+ 'Inter variable font (@fontsource-variable/inter)',
10
+ 'Environment validation with Zod (src/lib/env.ts)',
11
+ 'cn() class merge utility (clsx + tailwind-merge)',
12
+ 'Basic SEO component (React 19 native head hoisting)',
13
+ 'App configuration (src/lib/config.ts)',
14
+ 'Type definitions',
15
+ 'ErrorBoundary component with reset functionality',
16
+ ],
17
+ dependencyNames: ['@fontsource-variable/inter', 'clsx', 'react', 'react-dom', 'tailwind-merge', 'zod'],
18
+ devDependencyNames: [
19
+ '@tailwindcss/vite',
20
+ '@types/node',
21
+ '@types/react',
22
+ '@types/react-dom',
23
+ '@vitejs/plugin-react',
24
+ '@react-spa-scaffold/tsconfig',
25
+ 'tailwindcss',
26
+ 'typescript',
27
+ 'vite',
28
+ ],
29
+ files: [
30
+ 'src/main.tsx',
31
+ 'src/App.tsx',
32
+ 'src/index.css',
33
+ 'src/vite-env.d.ts',
34
+ 'src/lib/config.ts',
35
+ 'src/lib/env.ts',
36
+ 'src/lib/utils.ts',
37
+ 'src/lib/index.ts',
38
+ 'src/types/index.ts',
39
+ 'src/hooks/index.ts',
40
+ 'src/components/shared/SEO/SEO.tsx',
41
+ 'src/components/shared/SEO/index.ts',
42
+ 'src/components/shared/ErrorBoundary/ErrorBoundary.tsx',
43
+ 'src/components/shared/ErrorBoundary/index.ts',
44
+ 'src/components/shared/index.ts',
45
+ 'index.html',
46
+ 'vite.config.ts',
47
+ 'tsconfig.json',
48
+ 'tsconfig.app.json',
49
+ 'tsconfig.node.json',
50
+ '.env.example',
51
+ '.gitignore',
52
+ 'public/favicon.svg',
53
+ ],
54
+ testFiles: [
55
+ 'src/lib/utils.test.ts',
56
+ 'src/components/shared/SEO/SEO.test.tsx',
57
+ 'src/components/shared/ErrorBoundary/ErrorBoundary.test.tsx',
58
+ 'e2e/tests/home.spec.ts',
59
+ ],
60
+ patterns: ['component-shared', 'hook-effect', 'error-boundary', 'seo-component'],
61
+ scripts: {
62
+ dev: 'vite',
63
+ build: 'tsc -b && vite build',
64
+ preview: 'vite preview',
65
+ typecheck: 'tsc --noEmit',
66
+ },
67
+ configFiles: [
68
+ 'vite.config.ts',
69
+ 'tsconfig.json',
70
+ 'tsconfig.app.json',
71
+ 'tsconfig.node.json',
72
+ '.gitignore',
73
+ 'src/index.css',
74
+ ],
75
+ };
76
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/features/definitions/core.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,IAAI,GAAY;IAC3B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,kDAAkD;IAC/D,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE;QACR,mCAAmC;QACnC,qBAAqB;QACrB,kCAAkC;QAClC,kDAAkD;QAClD,kDAAkD;QAClD,kDAAkD;QAClD,qDAAqD;QACrD,uCAAuC;QACvC,kBAAkB;QAClB,kDAAkD;KACnD;IACD,eAAe,EAAE,CAAC,4BAA4B,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC;IACtG,kBAAkB,EAAE;QAClB,mBAAmB;QACnB,aAAa;QACb,cAAc;QACd,kBAAkB;QAClB,sBAAsB;QACtB,8BAA8B;QAC9B,aAAa;QACb,YAAY;QACZ,MAAM;KACP;IACD,KAAK,EAAE;QACL,cAAc;QACd,aAAa;QACb,eAAe;QACf,mBAAmB;QACnB,mBAAmB;QACnB,gBAAgB;QAChB,kBAAkB;QAClB,kBAAkB;QAClB,oBAAoB;QACpB,oBAAoB;QACpB,mCAAmC;QACnC,oCAAoC;QACpC,uDAAuD;QACvD,8CAA8C;QAC9C,gCAAgC;QAChC,YAAY;QACZ,gBAAgB;QAChB,eAAe;QACf,mBAAmB;QACnB,oBAAoB;QACpB,cAAc;QACd,YAAY;QACZ,oBAAoB;KACrB;IACD,SAAS,EAAE;QACT,uBAAuB;QACvB,wCAAwC;QACxC,4DAA4D;QAC5D,wBAAwB;KACzB;IACD,QAAQ,EAAE,CAAC,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAChF,OAAO,EAAE;QACP,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,sBAAsB;QAC7B,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,cAAc;KAC1B;IACD,WAAW,EAAE;QACX,gBAAgB;QAChB,eAAe;QACf,mBAAmB;QACnB,oBAAoB;QACpB,YAAY;QACZ,eAAe;KAChB;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const devtools: Feature;
3
+ //# sourceMappingURL=devtools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/devtools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,QAAQ,EAAE,OAmDtB,CAAC"}
@@ -0,0 +1,53 @@
1
+ export const devtools = {
2
+ name: 'Developer Tooling',
3
+ description: 'ESLint + Prettier + Husky + Commitlint (using @react-spa-scaffold shared configs)',
4
+ required: false,
5
+ includes: [
6
+ '@react-spa-scaffold/eslint-config (React + TypeScript + LinguiJS)',
7
+ '@react-spa-scaffold/prettier-config (with Tailwind plugin)',
8
+ 'ESLint with TypeScript and React Hooks plugins',
9
+ 'eslint-plugin-react-refresh for HMR',
10
+ 'Prettier with Tailwind CSS plugin',
11
+ 'Husky for git hooks',
12
+ 'lint-staged for pre-commit linting',
13
+ 'Commitlint for conventional commits',
14
+ '.nvmrc for Node.js version (22)',
15
+ 'Pre-commit hook: typecheck + lint-staged',
16
+ 'Commit-msg hook: commitlint',
17
+ ],
18
+ devDependencyNames: [
19
+ '@commitlint/config-conventional',
20
+ '@eslint/js',
21
+ '@react-spa-scaffold/eslint-config',
22
+ '@react-spa-scaffold/prettier-config',
23
+ 'commitlint',
24
+ 'eslint',
25
+ 'eslint-config-prettier',
26
+ 'eslint-plugin-lingui',
27
+ 'eslint-plugin-react-hooks',
28
+ 'eslint-plugin-react-refresh',
29
+ 'husky',
30
+ 'lint-staged',
31
+ 'prettier',
32
+ 'prettier-plugin-tailwindcss',
33
+ 'typescript-eslint',
34
+ ],
35
+ files: [
36
+ 'eslint.config.js',
37
+ 'prettier.config.js',
38
+ 'commitlint.config.js',
39
+ '.husky/pre-commit',
40
+ '.husky/commit-msg',
41
+ '.nvmrc',
42
+ ],
43
+ patterns: [],
44
+ scripts: {
45
+ lint: 'eslint .',
46
+ 'lint:fix': 'eslint . --fix',
47
+ format: 'prettier --write .',
48
+ 'format:check': 'prettier --check .',
49
+ prepare: 'husky',
50
+ },
51
+ configFiles: ['eslint.config.js', 'prettier.config.js', 'commitlint.config.js'],
52
+ };
53
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../../src/features/definitions/devtools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAY;IAC/B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mFAAmF;IAChG,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,mEAAmE;QACnE,4DAA4D;QAC5D,gDAAgD;QAChD,qCAAqC;QACrC,mCAAmC;QACnC,qBAAqB;QACrB,oCAAoC;QACpC,qCAAqC;QACrC,iCAAiC;QACjC,0CAA0C;QAC1C,6BAA6B;KAC9B;IACD,kBAAkB,EAAE;QAClB,iCAAiC;QACjC,YAAY;QACZ,mCAAmC;QACnC,qCAAqC;QACrC,YAAY;QACZ,QAAQ;QACR,wBAAwB;QACxB,sBAAsB;QACtB,2BAA2B;QAC3B,6BAA6B;QAC7B,OAAO;QACP,aAAa;QACb,UAAU;QACV,6BAA6B;QAC7B,mBAAmB;KACpB;IACD,KAAK,EAAE;QACL,kBAAkB;QAClB,oBAAoB;QACpB,sBAAsB;QACtB,mBAAmB;QACnB,mBAAmB;QACnB,QAAQ;KACT;IACD,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE;QACP,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,gBAAgB;QAC5B,MAAM,EAAE,oBAAoB;QAC5B,cAAc,EAAE,oBAAoB;QACpC,OAAO,EAAE,OAAO;KACjB;IACD,WAAW,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,CAAC;CAChF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const forms: Feature;
3
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,KAAK,EAAE,OA8BnB,CAAC"}
@@ -0,0 +1,32 @@
1
+ export const forms = {
2
+ name: 'Form Handling',
3
+ description: 'React Hook Form + Zod validation + working demo form',
4
+ required: false,
5
+ includes: [
6
+ 'React Hook Form with Zod validation',
7
+ '@hookform/resolvers for schema integration',
8
+ 'RegisterForm component with validation demo (displayed on HomePage)',
9
+ 'Form error components (FieldErrorMessage, FormErrorSummary, RootFormError)',
10
+ 'useRegisterForm custom hook pattern',
11
+ 'Zod schema with refine() for cross-field validation',
12
+ ],
13
+ dependencyNames: ['@hookform/resolvers', 'react-hook-form'],
14
+ files: [
15
+ 'src/lib/validations.ts',
16
+ 'src/hooks/useRegisterForm.ts',
17
+ 'src/components/ui/form-error.tsx',
18
+ 'src/components/ui/input.tsx',
19
+ 'src/components/ui/label.tsx',
20
+ 'src/components/ui/card.tsx',
21
+ 'src/components/shared/RegisterForm/RegisterForm.tsx',
22
+ 'src/components/shared/RegisterForm/index.ts',
23
+ ],
24
+ testFiles: [
25
+ 'src/lib/validations.test.ts',
26
+ 'src/hooks/useRegisterForm.test.tsx',
27
+ 'src/components/shared/RegisterForm/RegisterForm.test.tsx',
28
+ ],
29
+ patterns: ['zod-schema', 'hook-form', 'form-error-component', 'register-form'],
30
+ scripts: {},
31
+ };
32
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../src/features/definitions/forms.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAY;IAC5B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,sDAAsD;IACnE,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,qCAAqC;QACrC,4CAA4C;QAC5C,qEAAqE;QACrE,4EAA4E;QAC5E,qCAAqC;QACrC,qDAAqD;KACtD;IACD,eAAe,EAAE,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;IAC3D,KAAK,EAAE;QACL,wBAAwB;QACxB,8BAA8B;QAC9B,kCAAkC;QAClC,6BAA6B;QAC7B,6BAA6B;QAC7B,4BAA4B;QAC5B,qDAAqD;QACrD,6CAA6C;KAC9C;IACD,SAAS,EAAE;QACT,6BAA6B;QAC7B,oCAAoC;QACpC,0DAA0D;KAC3D;IACD,QAAQ,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE,eAAe,CAAC;IAC9E,OAAO,EAAE,EAAE;CACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const i18n: Feature;
3
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,IAAI,EAAE,OAgDlB,CAAC"}
@@ -0,0 +1,50 @@
1
+ export const i18n = {
2
+ name: 'Internationalization',
3
+ description: 'LinguiJS with dynamic loading and language detection',
4
+ required: false,
5
+ includes: [
6
+ 'LinguiJS (core + react + macro)',
7
+ 'Trans component for JSX text',
8
+ 't() function for programmatic text',
9
+ 'Dynamic catalog loading (code splitting per locale)',
10
+ 'Browser language detection',
11
+ 'Language switcher component',
12
+ 'ESLint rule for translator comments (enforced)',
13
+ 'Locale files (.po format) for en, es, de',
14
+ 'Vite plugin for compilation',
15
+ 'useLanguage hook',
16
+ ],
17
+ dependencyNames: ['@lingui/core', '@lingui/react'],
18
+ devDependencyNames: [
19
+ '@lingui/babel-plugin-lingui-macro',
20
+ '@lingui/cli',
21
+ '@lingui/vite-plugin',
22
+ 'babel-plugin-macros',
23
+ 'eslint-plugin-lingui',
24
+ ],
25
+ files: [
26
+ 'src/i18n/config.ts',
27
+ 'src/i18n/detectLanguage.ts',
28
+ 'src/i18n/loadCatalog.ts',
29
+ 'src/i18n/index.ts',
30
+ 'src/locales/en.po',
31
+ 'src/locales/es.po',
32
+ 'src/locales/de.po',
33
+ 'src/hooks/useLanguage.ts',
34
+ 'src/components/shared/LanguageSwitcher/LanguageSwitcher.tsx',
35
+ 'src/components/shared/LanguageSwitcher/index.ts',
36
+ 'lingui.config.js',
37
+ ],
38
+ testFiles: [
39
+ 'src/i18n/detectLanguage.test.ts',
40
+ 'src/i18n/loadCatalog.test.ts',
41
+ 'src/hooks/useLanguage.test.tsx',
42
+ 'src/components/shared/LanguageSwitcher/LanguageSwitcher.test.tsx',
43
+ 'e2e/tests/language.spec.ts',
44
+ ],
45
+ patterns: ['i18n-index', 'trans-component', 't-function', 'language-switcher', 'use-language-hook'],
46
+ scripts: {
47
+ 'i18n:extract': 'lingui extract',
48
+ },
49
+ };
50
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/features/definitions/i18n.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,IAAI,GAAY;IAC3B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,sDAAsD;IACnE,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,iCAAiC;QACjC,8BAA8B;QAC9B,oCAAoC;QACpC,qDAAqD;QACrD,4BAA4B;QAC5B,6BAA6B;QAC7B,gDAAgD;QAChD,0CAA0C;QAC1C,6BAA6B;QAC7B,kBAAkB;KACnB;IACD,eAAe,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;IAClD,kBAAkB,EAAE;QAClB,mCAAmC;QACnC,aAAa;QACb,qBAAqB;QACrB,qBAAqB;QACrB,sBAAsB;KACvB;IACD,KAAK,EAAE;QACL,oBAAoB;QACpB,4BAA4B;QAC5B,yBAAyB;QACzB,mBAAmB;QACnB,mBAAmB;QACnB,mBAAmB;QACnB,mBAAmB;QACnB,0BAA0B;QAC1B,6DAA6D;QAC7D,iDAAiD;QACjD,kBAAkB;KACnB;IACD,SAAS,EAAE;QACT,iCAAiC;QACjC,8BAA8B;QAC9B,gCAAgC;QAChC,kEAAkE;QAClE,4BAA4B;KAC7B;IACD,QAAQ,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;IACnG,OAAO,EAAE;QACP,cAAc,EAAE,gBAAgB;KACjC;CACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { core } from './core.js';
2
+ export { mobile } from './mobile.js';
3
+ export { routing } from './routing.js';
4
+ export { ui } from './ui.js';
5
+ export { forms } from './forms.js';
6
+ export { state } from './state.js';
7
+ export { api } from './api.js';
8
+ export { i18n } from './i18n.js';
9
+ export { testing } from './testing.js';
10
+ export { performance } from './performance.js';
11
+ export { devtools } from './devtools.js';
12
+ export { ci } from './ci.js';
13
+ export { observability } from './observability.js';
14
+ export { theming } from './theming.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { core } from './core.js';
2
+ export { mobile } from './mobile.js';
3
+ export { routing } from './routing.js';
4
+ export { ui } from './ui.js';
5
+ export { forms } from './forms.js';
6
+ export { state } from './state.js';
7
+ export { api } from './api.js';
8
+ export { i18n } from './i18n.js';
9
+ export { testing } from './testing.js';
10
+ export { performance } from './performance.js';
11
+ export { devtools } from './devtools.js';
12
+ export { ci } from './ci.js';
13
+ export { observability } from './observability.js';
14
+ export { theming } from './theming.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/definitions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const mobile: Feature;
3
+ //# sourceMappingURL=mobile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/mobile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,MAAM,EAAE,OAiBpB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export const mobile = {
2
+ name: 'Mobile Support',
3
+ description: 'Responsive design utilities with viewport detection, breakpoints, and touch-aware sizing',
4
+ required: false,
5
+ includes: [
6
+ 'MobileProvider context for viewport detection',
7
+ 'useMobileContext hook (isMobile, isTablet, isDesktop, width)',
8
+ 'useMediaQuery hook with BREAKPOINTS constants (sm, md, lg, xl)',
9
+ 'useIsMobile and useIsDesktop convenience hooks',
10
+ 'useTouchSizes hook for touch-aware component sizing',
11
+ 'requestAnimationFrame-debounced resize handling',
12
+ 'SSR-safe viewport detection with fallbacks',
13
+ ],
14
+ files: ['src/contexts/mobileContext.tsx', 'src/hooks/useMediaQuery.ts', 'src/hooks/useTouchSizes.ts'],
15
+ testFiles: ['src/contexts/mobileContext.test.tsx', 'src/hooks/useMediaQuery.test.ts'],
16
+ patterns: ['mobile-context', 'use-media-query', 'use-touch-sizes'],
17
+ scripts: {},
18
+ };
19
+ //# sourceMappingURL=mobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile.js","sourceRoot":"","sources":["../../../src/features/definitions/mobile.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAY;IAC7B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,0FAA0F;IACvG,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,+CAA+C;QAC/C,8DAA8D;QAC9D,gEAAgE;QAChE,gDAAgD;QAChD,qDAAqD;QACrD,iDAAiD;QACjD,4CAA4C;KAC7C;IACD,KAAK,EAAE,CAAC,gCAAgC,EAAE,4BAA4B,EAAE,4BAA4B,CAAC;IACrG,SAAS,EAAE,CAAC,qCAAqC,EAAE,iCAAiC,CAAC;IACrF,QAAQ,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;IAClE,OAAO,EAAE,EAAE;CACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const observability: Feature;
3
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/observability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,aAAa,EAAE,OAmB3B,CAAC"}
@@ -0,0 +1,21 @@
1
+ export const observability = {
2
+ name: 'Observability',
3
+ description: 'Sentry error tracking with source maps (opt-out via VITE_SENTRY_ENABLED=false)',
4
+ required: false,
5
+ includes: [
6
+ 'Sentry React SDK (@sentry/react)',
7
+ 'Lazy-loaded Sentry initialization (non-blocking)',
8
+ 'Browser tracing integration',
9
+ 'Global error handlers (window.onerror, unhandledrejection)',
10
+ 'ErrorBoundary integration with Sentry reporting',
11
+ 'Source map upload via Vite plugin (CI/CD)',
12
+ 'VITE_SENTRY_ENABLED flag for opt-out',
13
+ 'SENTRY_CONFIG in lib/config.ts',
14
+ ],
15
+ dependencyNames: ['@sentry/react'],
16
+ devDependencyNames: ['@sentry/vite-plugin'],
17
+ files: ['src/lib/config.ts'],
18
+ patterns: ['main-entry', 'lib-config'],
19
+ scripts: {},
20
+ };
21
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../src/features/definitions/observability.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,gFAAgF;IAC7F,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,kCAAkC;QAClC,kDAAkD;QAClD,6BAA6B;QAC7B,4DAA4D;QAC5D,iDAAiD;QACjD,2CAA2C;QAC3C,sCAAsC;QACtC,gCAAgC;KACjC;IACD,eAAe,EAAE,CAAC,eAAe,CAAC;IAClC,kBAAkB,EAAE,CAAC,qBAAqB,CAAC;IAC3C,KAAK,EAAE,CAAC,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IACtC,OAAO,EAAE,EAAE;CACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const performance: Feature;
3
+ //# sourceMappingURL=performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/performance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,OA0BzB,CAAC"}
@@ -0,0 +1,28 @@
1
+ export const performance = {
2
+ name: 'Performance Testing',
3
+ description: 'React Profiler + Lighthouse + Web Vitals via react-performance-tracking',
4
+ required: false,
5
+ includes: [
6
+ 'react-performance-tracking for unified performance testing',
7
+ 'React Profiler metrics (render duration, re-renders)',
8
+ 'Lighthouse audits (performance, accessibility, best practices)',
9
+ 'Core Web Vitals (LCP, INP, CLS)',
10
+ 'FPS monitoring (Chromium only)',
11
+ 'PerformanceProviderWrapper with lazy loading (zero prod overhead)',
12
+ 'Safe usePerformance hook (never throws)',
13
+ 'Separate Playwright project for performance tests',
14
+ 'CI-optimized Chrome flags (--no-sandbox)',
15
+ ],
16
+ dependencyNames: ['react-performance-tracking'],
17
+ devDependencyNames: ['chrome-launcher', 'lighthouse'],
18
+ files: ['src/contexts/performanceContext.tsx', 'e2e/performance/setup.ts'],
19
+ testFiles: ['e2e/performance/home.spec.ts', 'src/contexts/performanceContext.test.tsx'],
20
+ patterns: ['performance-context', 'performance-e2e', 'profiler-wrapper'],
21
+ scripts: {
22
+ 'e2e:perf': 'PERF_TEST=true playwright test --project=performance',
23
+ 'e2e:perf:ui': 'PERF_TEST=true playwright test --project=performance --ui',
24
+ 'e2e:all': 'PERF_TEST=true playwright test',
25
+ },
26
+ configFiles: [],
27
+ };
28
+ //# sourceMappingURL=performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/features/definitions/performance.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,yEAAyE;IACtF,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,4DAA4D;QAC5D,sDAAsD;QACtD,gEAAgE;QAChE,iCAAiC;QACjC,gCAAgC;QAChC,mEAAmE;QACnE,yCAAyC;QACzC,mDAAmD;QACnD,0CAA0C;KAC3C;IACD,eAAe,EAAE,CAAC,4BAA4B,CAAC;IAC/C,kBAAkB,EAAE,CAAC,iBAAiB,EAAE,YAAY,CAAC;IACrD,KAAK,EAAE,CAAC,qCAAqC,EAAE,0BAA0B,CAAC;IAC1E,SAAS,EAAE,CAAC,8BAA8B,EAAE,0CAA0C,CAAC;IACvF,QAAQ,EAAE,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;IACxE,OAAO,EAAE;QACP,UAAU,EAAE,sDAAsD;QAClE,aAAa,EAAE,2DAA2D;QAC1E,SAAS,EAAE,gCAAgC;KAC5C;IACD,WAAW,EAAE,EAAE;CAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const routing: Feature;
3
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,OAAO,EAAE,OAuBrB,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const routing = {
2
+ name: 'Routing',
3
+ description: 'React Router 7 with lazy loading and route constants',
4
+ required: false,
5
+ includes: [
6
+ 'React Router 7',
7
+ 'Lazy-loaded pages with React.lazy()',
8
+ 'Route constants with TypeScript types (generated based on features)',
9
+ '404 Not Found page',
10
+ 'App.tsx with Suspense fallback',
11
+ 'PageLoading component for transitions',
12
+ ],
13
+ dependencyNames: ['react-router'],
14
+ files: [
15
+ 'src/pages/Home.tsx',
16
+ 'src/pages/NotFound.tsx',
17
+ 'src/pages/index.ts',
18
+ 'src/components/ui/loading.tsx',
19
+ 'src/components/ui/visually-hidden.tsx',
20
+ ],
21
+ testFiles: ['e2e/tests/navigation.spec.ts'],
22
+ patterns: ['lazy-page', 'route-constants', 'page-component'],
23
+ scripts: {},
24
+ };
25
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/features/definitions/routing.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAY;IAC9B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,sDAAsD;IACnE,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE;QACR,gBAAgB;QAChB,qCAAqC;QACrC,qEAAqE;QACrE,oBAAoB;QACpB,gCAAgC;QAChC,uCAAuC;KACxC;IACD,eAAe,EAAE,CAAC,cAAc,CAAC;IACjC,KAAK,EAAE;QACL,oBAAoB;QACpB,wBAAwB;QACxB,oBAAoB;QACpB,+BAA+B;QAC/B,uCAAuC;KACxC;IACD,SAAS,EAAE,CAAC,8BAA8B,CAAC;IAC3C,QAAQ,EAAE,CAAC,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;IAC5D,OAAO,EAAE,EAAE;CACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const state: Feature;
3
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/features/definitions/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,KAAK,EAAE,OAyBnB,CAAC"}