@pyreon/mcp 0.12.15 → 0.13.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.
@@ -101,4 +101,525 @@ describe('api-reference', () => {
101
101
  expect(handle?.mistakes).toContain('distinct `id`')
102
102
  })
103
103
  })
104
+
105
+ describe('@pyreon/query — manifest-driven region', () => {
106
+ const EXPECTED_QUERY_KEYS = [
107
+ 'query/QueryClientProvider',
108
+ 'query/useQuery',
109
+ 'query/useMutation',
110
+ 'query/useInfiniteQuery',
111
+ 'query/useQueries',
112
+ 'query/useSubscription',
113
+ 'query/useSSE',
114
+ 'query/useSuspenseQuery',
115
+ 'query/useSuspenseInfiniteQuery',
116
+ 'query/QuerySuspense',
117
+ 'query/useIsFetching',
118
+ 'query/useIsMutating',
119
+ 'query/QueryErrorResetBoundary',
120
+ 'query/useQueryErrorResetBoundary',
121
+ 'query/useQueryClient',
122
+ 'query/TanStack core re-exports',
123
+ ]
124
+
125
+ it.each(EXPECTED_QUERY_KEYS)('exposes %s with the full MCP shape', (key) => {
126
+ const entry = API_REFERENCE[key]
127
+ expect(entry, `${key} missing from API_REFERENCE`).toBeDefined()
128
+ expect(entry!.signature).toBeTruthy()
129
+ expect(entry!.example).toBeTruthy()
130
+ expect(entry!.notes).toBeTruthy()
131
+ })
132
+
133
+ it('useQuery carries the enriched options-as-function explanation + 5 mistakes', () => {
134
+ const entry = API_REFERENCE['query/useQuery']
135
+ expect(entry?.notes).toContain('FUNCTION')
136
+ expect(entry?.notes).toContain('fine-grained reactive signals')
137
+ expect(entry?.mistakes?.split('\n').length).toBe(5)
138
+ })
139
+
140
+ it('useMutation explains the plain-object rationale + 3 mistakes', () => {
141
+ const entry = API_REFERENCE['query/useMutation']
142
+ expect(entry?.notes).toContain('plain OBJECT')
143
+ expect(entry?.notes).toContain('imperative')
144
+ expect(entry?.mistakes?.split('\n').length).toBe(3)
145
+ })
146
+
147
+ it('useSubscription documents auto-reconnect + 3 WebSocket foot-guns', () => {
148
+ const entry = API_REFERENCE['query/useSubscription']
149
+ expect(entry?.notes).toContain('auto-reconnect')
150
+ expect(entry?.notes).toContain('QueryClient')
151
+ expect(entry?.mistakes?.split('\n').length).toBe(3)
152
+ })
153
+
154
+ it('QuerySuspense warns about eager children', () => {
155
+ const entry = API_REFERENCE['query/QuerySuspense']
156
+ expect(entry?.mistakes).toContain('function')
157
+ })
158
+
159
+ it('useSSE documents the Last-Event-ID resumption', () => {
160
+ const entry = API_REFERENCE['query/useSSE']
161
+ expect(entry?.notes).toContain('Last-Event-ID')
162
+ })
163
+
164
+ it('TanStack core re-exports mentions QueryClient + dehydrate/hydrate for SSR consumers', () => {
165
+ const entry = API_REFERENCE['query/TanStack core re-exports']
166
+ expect(entry?.notes).toContain('QueryClient')
167
+ expect(entry?.notes).toContain('dehydrate')
168
+ expect(entry?.notes).toContain('hydrate')
169
+ expect(entry?.notes).toContain('QueryKey')
170
+ })
171
+
172
+ it('useSuspenseInfiniteQuery carries boundary-requirement mistakes', () => {
173
+ const entry = API_REFERENCE['query/useSuspenseInfiniteQuery']
174
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
175
+ expect(entry?.mistakes).toContain('QuerySuspense')
176
+ })
177
+
178
+ it('useQueries warns about static arrays losing reactive tracking', () => {
179
+ const entry = API_REFERENCE['query/useQueries']
180
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
181
+ expect(entry?.mistakes).toContain('static array')
182
+ })
183
+ })
184
+
185
+ describe('@pyreon/form — manifest-driven region', () => {
186
+ const EXPECTED_FORM_KEYS = [
187
+ 'form/useForm',
188
+ 'form/useField',
189
+ 'form/useFieldArray',
190
+ 'form/useWatch',
191
+ 'form/useFormState',
192
+ 'form/FormProvider',
193
+ 'form/useFormContext',
194
+ ]
195
+
196
+ it.each(EXPECTED_FORM_KEYS)('exposes %s with the full MCP shape', (key) => {
197
+ const entry = API_REFERENCE[key]
198
+ expect(entry, `${key} missing from API_REFERENCE`).toBeDefined()
199
+ expect(entry!.signature).toBeTruthy()
200
+ expect(entry!.example).toBeTruthy()
201
+ expect(entry!.notes).toBeTruthy()
202
+ })
203
+
204
+ it('useForm carries 5 mistakes covering validateOn + schema ordering', () => {
205
+ const entry = API_REFERENCE['form/useForm']
206
+ expect(entry?.mistakes?.split('\n').length).toBe(5)
207
+ expect(entry?.notes).toContain('validateOn')
208
+ })
209
+
210
+ it('useFormContext warns about module-scope calls + generic omission', () => {
211
+ const entry = API_REFERENCE['form/useFormContext']
212
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
213
+ expect(entry?.mistakes).toContain('module scope')
214
+ })
215
+
216
+ it('useFieldArray documents the stable-key contract', () => {
217
+ const entry = API_REFERENCE['form/useFieldArray']
218
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
219
+ expect(entry?.mistakes).toContain('index-based keys')
220
+ expect(entry?.notes).toContain('stable keys')
221
+ })
222
+ })
223
+
224
+ describe('@pyreon/hooks — manifest-driven region', () => {
225
+ const EXPECTED_HOOKS_KEYS = [
226
+ 'hooks/useControllableState',
227
+ 'hooks/useEventListener',
228
+ 'hooks/useClickOutside',
229
+ 'hooks/useElementSize',
230
+ 'hooks/useFocusTrap',
231
+ 'hooks/useBreakpoint',
232
+ 'hooks/useDebouncedValue',
233
+ 'hooks/useClipboard',
234
+ 'hooks/useDialog',
235
+ 'hooks/useTimeAgo',
236
+ 'hooks/useInfiniteScroll',
237
+ 'hooks/useMergedRef',
238
+ 'hooks/useUpdateEffect',
239
+ 'hooks/useIsomorphicLayoutEffect',
240
+ ]
241
+
242
+ it.each(EXPECTED_HOOKS_KEYS)('exposes %s with the full MCP shape', (key) => {
243
+ const entry = API_REFERENCE[key]
244
+ expect(entry, `${key} missing from API_REFERENCE`).toBeDefined()
245
+ expect(entry!.signature).toBeTruthy()
246
+ expect(entry!.example).toBeTruthy()
247
+ expect(entry!.notes).toBeTruthy()
248
+ })
249
+
250
+ it('useEventListener documents the cleanup contract + 2 mistakes', () => {
251
+ const entry = API_REFERENCE['hooks/useEventListener']
252
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
253
+ expect(entry?.mistakes).toContain('addEventListener')
254
+ expect(entry?.notes).toContain('automatic cleanup')
255
+ })
256
+
257
+ it('useControllableState documents the canonical pattern + 2 mistakes', () => {
258
+ const entry = API_REFERENCE['hooks/useControllableState']
259
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
260
+ expect(entry?.notes).toContain('controlled/uncontrolled')
261
+ })
262
+
263
+ it('useFocusTrap documents the active-signal requirement', () => {
264
+ const entry = API_REFERENCE['hooks/useFocusTrap']
265
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
266
+ expect(entry?.mistakes).toContain('active')
267
+ })
268
+
269
+ it('useInfiniteScroll documents the sentinel placement + enabled guard', () => {
270
+ const entry = API_REFERENCE['hooks/useInfiniteScroll']
271
+ expect(entry?.mistakes?.split('\n').length).toBe(2)
272
+ expect(entry?.mistakes).toContain('overflow')
273
+ })
274
+ })
275
+
276
+ describe('@pyreon/reactivity — manifest-driven region', () => {
277
+ const EXPECTED_REACTIVITY_KEYS = [
278
+ 'reactivity/signal',
279
+ 'reactivity/computed',
280
+ 'reactivity/effect',
281
+ 'reactivity/batch',
282
+ 'reactivity/onCleanup',
283
+ 'reactivity/watch',
284
+ 'reactivity/createStore',
285
+ 'reactivity/untrack',
286
+ ]
287
+
288
+ it.each(EXPECTED_REACTIVITY_KEYS)('exposes %s with the full MCP shape', (key) => {
289
+ const entry = API_REFERENCE[key]
290
+ expect(entry, `${key} missing from API_REFERENCE`).toBeDefined()
291
+ expect(entry!.signature).toBeTruthy()
292
+ expect(entry!.example).toBeTruthy()
293
+ expect(entry!.notes).toBeTruthy()
294
+ })
295
+
296
+ it('signal carries 6 mistakes covering the callable-function contract', () => {
297
+ const entry = API_REFERENCE['reactivity/signal']
298
+ expect(entry?.mistakes?.split('\n').length).toBe(6)
299
+ expect(entry?.notes).toContain('CALLABLE FUNCTION')
300
+ })
301
+
302
+ it('signal notes explain the .set() / .update() / .peek() API', () => {
303
+ const entry = API_REFERENCE['reactivity/signal']
304
+ expect(entry?.notes).toContain('.set(')
305
+ expect(entry?.notes).toContain('.update(')
306
+ expect(entry?.notes).toContain('.peek()')
307
+ })
308
+
309
+ it('effect documents the auto-tracking contract + 4 mistakes', () => {
310
+ const entry = API_REFERENCE['reactivity/effect']
311
+ expect(entry?.mistakes?.split('\n').length).toBe(4)
312
+ expect(entry?.notes).toContain('auto-tracks')
313
+ })
314
+
315
+ it('batch documents the pointer-swap implementation', () => {
316
+ const entry = API_REFERENCE['reactivity/batch']
317
+ expect(entry?.notes).toContain('pointer swap')
318
+ })
319
+ })
320
+
321
+ describe('@pyreon/core — manifest-driven region', () => {
322
+ const EXPECTED_CORE_KEYS = [
323
+ 'core/h',
324
+ 'core/Fragment',
325
+ 'core/onMount',
326
+ 'core/onUnmount',
327
+ 'core/onUpdate',
328
+ 'core/onErrorCaptured',
329
+ 'core/createContext',
330
+ 'core/createReactiveContext',
331
+ 'core/provide',
332
+ 'core/useContext',
333
+ 'core/Show',
334
+ 'core/Switch',
335
+ 'core/Match',
336
+ 'core/For',
337
+ 'core/Suspense',
338
+ 'core/ErrorBoundary',
339
+ 'core/lazy',
340
+ 'core/Dynamic',
341
+ 'core/cx',
342
+ 'core/splitProps',
343
+ 'core/mergeProps',
344
+ 'core/createUniqueId',
345
+ 'core/Portal',
346
+ 'core/mapArray',
347
+ 'core/createRef',
348
+ 'core/untrack',
349
+ 'core/ExtractProps',
350
+ 'core/HigherOrderComponent',
351
+ ]
352
+
353
+ it.each(EXPECTED_CORE_KEYS)('exposes %s with the full MCP shape', (key) => {
354
+ const entry = API_REFERENCE[key]
355
+ expect(entry, `${key} missing from API_REFERENCE`).toBeDefined()
356
+ expect(entry!.signature).toBeTruthy()
357
+ expect(entry!.example).toBeTruthy()
358
+ expect(entry!.notes).toBeTruthy()
359
+ })
360
+
361
+ it('h() documents the VNode creation contract + JSX compilation', () => {
362
+ const entry = API_REFERENCE['core/h']
363
+ expect(entry?.notes).toContain('JSX')
364
+ expect(entry?.notes).toContain('VNode')
365
+ expect(entry?.mistakes?.split('\n').length).toBe(4)
366
+ })
367
+
368
+ it('For documents the by-not-key contract', () => {
369
+ const entry = API_REFERENCE['core/For']
370
+ expect(entry?.notes).toContain('by')
371
+ expect(entry?.mistakes).toContain('key')
372
+ })
373
+
374
+ it('splitProps documents the reactivity-preserving contract', () => {
375
+ const entry = API_REFERENCE['core/splitProps']
376
+ expect(entry?.notes).toContain('reactivity')
377
+ expect(entry?.mistakes?.split('\n').length).toBe(3)
378
+ })
379
+
380
+ it('onMount documents cleanup return value', () => {
381
+ const entry = API_REFERENCE['core/onMount']
382
+ expect(entry?.notes).toContain('cleanup')
383
+ expect(entry?.mistakes?.split('\n').length).toBe(4)
384
+ })
385
+ })
386
+
387
+ describe('@pyreon/runtime-dom — manifest-driven region', () => {
388
+ const EXPECTED_RUNTIME_DOM_KEYS = [
389
+ 'runtime-dom/mount',
390
+ 'runtime-dom/render',
391
+ 'runtime-dom/hydrateRoot',
392
+ 'runtime-dom/Transition',
393
+ 'runtime-dom/TransitionGroup',
394
+ 'runtime-dom/KeepAlive',
395
+ 'runtime-dom/_tpl',
396
+ 'runtime-dom/_bindText',
397
+ 'runtime-dom/sanitizeHtml',
398
+ ]
399
+
400
+ it.each(EXPECTED_RUNTIME_DOM_KEYS)('exposes %s with the full MCP shape', (key) => {
401
+ const entry = API_REFERENCE[key]
402
+ expect(entry, `${key} missing from API_REFERENCE`).toBeDefined()
403
+ expect(entry!.signature).toBeTruthy()
404
+ expect(entry!.example).toBeTruthy()
405
+ expect(entry!.notes).toBeTruthy()
406
+ })
407
+
408
+ it('mount documents the container + unmount contract + 4 mistakes', () => {
409
+ const entry = API_REFERENCE['runtime-dom/mount']
410
+ expect(entry?.notes).toContain('container')
411
+ expect(entry?.notes).toContain('unmount')
412
+ expect(entry?.mistakes?.split('\n').length).toBe(4)
413
+ })
414
+
415
+ it('Transition documents the 5s safety timeout', () => {
416
+ const entry = API_REFERENCE['runtime-dom/Transition']
417
+ expect(entry?.notes).toContain('5')
418
+ expect(entry?.mistakes?.split('\n').length).toBe(3)
419
+ })
420
+ })
421
+
422
+ describe('@pyreon/router — manifest-driven region', () => {
423
+ const EXPECTED_ROUTER_KEYS = [
424
+ 'router/createRouter',
425
+ 'router/RouterProvider',
426
+ 'router/RouterView',
427
+ 'router/RouterLink',
428
+ 'router/useRouter',
429
+ 'router/useRoute',
430
+ 'router/useIsActive',
431
+ 'router/useTypedSearchParams',
432
+ 'router/useTransition',
433
+ 'router/useMiddlewareData',
434
+ 'router/useLoaderData',
435
+ 'router/useSearchParams',
436
+ 'router/useBlocker',
437
+ 'router/onBeforeRouteLeave',
438
+ 'router/onBeforeRouteUpdate',
439
+ ]
440
+
441
+ it.each(EXPECTED_ROUTER_KEYS)('exposes %s with the full MCP shape', (key) => {
442
+ const entry = API_REFERENCE[key]
443
+ expect(entry, `${key} missing from API_REFERENCE`).toBeDefined()
444
+ expect(entry!.signature).toBeTruthy()
445
+ expect(entry!.example).toBeTruthy()
446
+ expect(entry!.notes).toBeTruthy()
447
+ })
448
+
449
+ it('createRouter carries 4 mistakes covering hash mode + catch-all', () => {
450
+ const entry = API_REFERENCE['router/createRouter']
451
+ expect(entry?.notes).toContain('routes')
452
+ expect(entry?.notes).toContain('Router')
453
+ expect(entry?.mistakes?.split('\n').length).toBe(4)
454
+ })
455
+
456
+ it('useRouter documents the View Transition await semantics', () => {
457
+ const entry = API_REFERENCE['router/useRouter']
458
+ expect(entry?.notes).toContain('updateCallbackDone')
459
+ expect(entry?.mistakes?.split('\n').length).toBe(3)
460
+ })
461
+
462
+ it('useIsActive documents segment-aware prefix matching', () => {
463
+ const entry = API_REFERENCE['router/useIsActive']
464
+ expect(entry?.notes).toContain('Segment')
465
+ })
466
+
467
+ it('useBlocker documents the beforeunload integration', () => {
468
+ const entry = API_REFERENCE['router/useBlocker']
469
+ expect(entry?.notes).toContain('beforeunload')
470
+ })
471
+ })
472
+
473
+ describe('@pyreon/store — manifest-driven region', () => {
474
+ it.each(['store/defineStore', 'store/addStorePlugin', 'store/setStoreRegistryProvider', 'store/resetStore', 'store/resetAllStores'])('exposes %s', (key) => {
475
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
476
+ })
477
+ it('defineStore documents composition stores', () => {
478
+ expect(API_REFERENCE['store/defineStore']?.notes).toContain('composition')
479
+ })
480
+ })
481
+
482
+ describe('@pyreon/state-tree — manifest-driven region', () => {
483
+ it.each(['state-tree/model', 'state-tree/getSnapshot', 'state-tree/applySnapshot', 'state-tree/onPatch', 'state-tree/applyPatch', 'state-tree/addMiddleware'])('exposes %s', (key) => {
484
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
485
+ })
486
+ it('model documents structured reactive state', () => {
487
+ expect(API_REFERENCE['state-tree/model']?.notes).toContain('model')
488
+ })
489
+ })
490
+
491
+ describe('@pyreon/permissions — manifest-driven region', () => {
492
+ it.each(['permissions/createPermissions', 'permissions/PermissionsProvider', 'permissions/usePermissions'])('exposes %s', (key) => {
493
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
494
+ })
495
+ it('createPermissions documents reactive callable', () => {
496
+ expect(API_REFERENCE['permissions/createPermissions']?.notes).toContain('callable')
497
+ })
498
+ })
499
+
500
+ describe('@pyreon/machine — manifest-driven region', () => {
501
+ it.each(['machine/createMachine'])('exposes %s', (key) => {
502
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
503
+ })
504
+ it('createMachine documents type-safe transitions', () => {
505
+ expect(API_REFERENCE['machine/createMachine']?.notes).toContain('transition')
506
+ })
507
+ })
508
+
509
+ describe('@pyreon/i18n — manifest-driven region', () => {
510
+ it.each(['i18n/createI18n', 'i18n/I18nProvider', 'i18n/useI18n', 'i18n/Trans', 'i18n/interpolate'])('exposes %s', (key) => {
511
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
512
+ })
513
+ it('createI18n documents two entry points', () => {
514
+ expect(API_REFERENCE['i18n/createI18n']?.notes).toContain('locale')
515
+ })
516
+ })
517
+
518
+ describe('@pyreon/storage — manifest-driven region', () => {
519
+ it.each(['storage/useStorage', 'storage/useCookie', 'storage/useIndexedDB', 'storage/createStorage'])('exposes %s', (key) => {
520
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
521
+ })
522
+ it('useStorage documents cross-tab sync', () => {
523
+ expect(API_REFERENCE['storage/useStorage']?.notes).toContain('syncs across browser tabs')
524
+ })
525
+ })
526
+
527
+ describe('@pyreon/toast — manifest-driven region', () => {
528
+ it.each(['toast/toast', 'toast/Toaster'])('exposes %s', (key) => {
529
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
530
+ })
531
+ it('toast documents imperative API', () => {
532
+ expect(API_REFERENCE['toast/toast']?.notes).toContain('toast')
533
+ })
534
+ })
535
+
536
+ describe('@pyreon/rx — manifest-driven region', () => {
537
+ it.each(['rx/rx', 'rx/pipe', 'rx/filter'])('exposes %s', (key) => {
538
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
539
+ })
540
+ it('rx namespace documents Signal overloading', () => {
541
+ expect(API_REFERENCE['rx/rx']?.notes).toContain('Signal')
542
+ })
543
+ })
544
+
545
+ describe('@pyreon/table — manifest-driven region', () => {
546
+ it.each(['table/useTable', 'table/flexRender'])('exposes %s', (key) => {
547
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
548
+ })
549
+ it('useTable documents options-as-function contract', () => {
550
+ expect(API_REFERENCE['table/useTable']?.notes).toContain('Computed<Table<T>>')
551
+ })
552
+ })
553
+
554
+ describe('@pyreon/virtual — manifest-driven region', () => {
555
+ it.each(['virtual/useVirtualizer', 'virtual/useWindowVirtualizer'])('exposes %s', (key) => {
556
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
557
+ })
558
+ it('useVirtualizer documents reactive virtualItems', () => {
559
+ expect(API_REFERENCE['virtual/useVirtualizer']?.notes).toContain('virtualItems')
560
+ })
561
+ })
562
+
563
+ describe('@pyreon/feature — manifest-driven region', () => {
564
+ it.each(['feature/defineFeature', 'feature/reference'])('exposes %s', (key) => {
565
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
566
+ })
567
+ it('defineFeature documents composing 5 packages', () => {
568
+ expect(API_REFERENCE['feature/defineFeature']?.notes).toContain('@pyreon/query')
569
+ })
570
+ })
571
+
572
+ describe('@pyreon/code — manifest-driven region', () => {
573
+ it.each(['code/createEditor', 'code/bindEditorToSignal', 'code/CodeEditor', 'code/DiffEditor', 'code/loadLanguage', 'code/minimapExtension'])('exposes %s', (key) => {
574
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
575
+ })
576
+ it('createEditor documents writable Signal<string> value', () => {
577
+ expect(API_REFERENCE['code/createEditor']?.notes).toContain('writable Signal<string>')
578
+ })
579
+ })
580
+
581
+ describe('@pyreon/document — manifest-driven region', () => {
582
+ it.each(['document/render', 'document/createDocument', 'document/Document', 'document/download'])('exposes %s', (key) => {
583
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
584
+ })
585
+ it('render documents lazy-loaded heavy renderers', () => {
586
+ expect(API_REFERENCE['document/render']?.notes).toContain('lazy-loaded')
587
+ })
588
+ })
589
+
590
+ describe('@pyreon/hotkeys — manifest-driven region', () => {
591
+ it.each(['hotkeys/useHotkey', 'hotkeys/useHotkeyScope', 'hotkeys/registerHotkey'])('exposes %s', (key) => {
592
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
593
+ })
594
+ it('useHotkey documents mod alias + form element filtering', () => {
595
+ expect(API_REFERENCE['hotkeys/useHotkey']?.notes).toContain('mod')
596
+ })
597
+ })
598
+
599
+ describe('@pyreon/url-state — manifest-driven region', () => {
600
+ it.each(['url-state/useUrlState', 'url-state/setUrlRouter'])('exposes %s', (key) => {
601
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
602
+ })
603
+ it('useUrlState documents auto type coercion + SSR safety', () => {
604
+ expect(API_REFERENCE['url-state/useUrlState']?.notes).toContain('SSR-safe')
605
+ })
606
+ })
607
+
608
+ describe('@pyreon/charts — manifest-driven region', () => {
609
+ it.each(['charts/useChart', 'charts/Chart'])('exposes %s', (key) => {
610
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
611
+ })
612
+ it('useChart documents lazy loading', () => {
613
+ expect(API_REFERENCE['charts/useChart']?.notes).toContain('Lazy-loads')
614
+ })
615
+ })
616
+
617
+ describe('@pyreon/validation — manifest-driven region', () => {
618
+ it.each(['validation/zodSchema', 'validation/zodField', 'validation/valibotSchema', 'validation/valibotField', 'validation/arktypeSchema', 'validation/arktypeField'])('exposes %s', (key) => {
619
+ const e = API_REFERENCE[key]; expect(e).toBeDefined(); expect(e!.signature).toBeTruthy()
620
+ })
621
+ it('zodSchema documents duck-typing', () => {
622
+ expect(API_REFERENCE['validation/zodSchema']?.notes).toContain('Duck-typed')
623
+ })
624
+ })
104
625
  })