@emeryld/rrroutes-openapi 2.5.10 → 2.5.13

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 (48) hide show
  1. package/dist/index.cjs +64 -126
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +3 -2
  4. package/dist/index.mjs +63 -125
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/public/assets/docs.js +113 -113
  7. package/dist/web/v2/types/types.base.d.ts +1 -6
  8. package/dist/web/v2/types/types.cacheLog.d.ts +61 -670
  9. package/dist/web/v2/types/types.d.ts +3 -1
  10. package/dist/web/v2/types/types.endpoint.d.ts +5 -20
  11. package/dist/web/v2/types/types.log.d.ts +5 -20
  12. package/dist/web/v2/types/types.preset.d.ts +5 -20
  13. package/dist/web/v2/types/types.requestLog.d.ts +5 -20
  14. package/dist/web/v2/types/types.scheduling.d.ts +408 -0
  15. package/dist/web/v2/types/types.socket.d.ts +5 -20
  16. package/dist/web/v2/utils/dates.d.ts +4 -0
  17. package/dist/web/v2/utils/sizeFormat.d.ts +0 -1
  18. package/package.json +3 -3
  19. package/dist/web/v2/components/logs/cache/common/CacheSummaryStat.d.ts +0 -7
  20. package/dist/web/v2/components/logs/cache/common/CacheTraceDialog.d.ts +0 -8
  21. package/dist/web/v2/components/logs/cache/common/CacheValueDialog.d.ts +0 -8
  22. package/dist/web/v2/components/logs/cache/common/DetailField.d.ts +0 -7
  23. package/dist/web/v2/components/logs/cache/common/MutedText.d.ts +0 -4
  24. package/dist/web/v2/components/logs/cache/insights/CacheInsights.d.ts +0 -10
  25. package/dist/web/v2/components/logs/cache/insights/CacheInsightsKeySection.d.ts +0 -7
  26. package/dist/web/v2/components/logs/cache/insights/CacheInsightsKpiRow.d.ts +0 -8
  27. package/dist/web/v2/components/logs/cache/insights/CacheInsightsOverview.d.ts +0 -8
  28. package/dist/web/v2/components/logs/cache/insights/CacheInsightsTagSection.d.ts +0 -7
  29. package/dist/web/v2/components/logs/cache/insights/CacheProblemPanels.d.ts +0 -7
  30. package/dist/web/v2/components/logs/cache/insights/CacheTagInsights.d.ts +0 -20
  31. package/dist/web/v2/components/logs/cache/key-detail/CacheKeyDetailActions.d.ts +0 -12
  32. package/dist/web/v2/components/logs/cache/key-detail/CacheKeyDetailLogsTab.d.ts +0 -3
  33. package/dist/web/v2/components/logs/cache/key-detail/CacheKeyDetailModal.d.ts +0 -18
  34. package/dist/web/v2/components/logs/cache/key-detail/CacheKeyDetailSummary.d.ts +0 -17
  35. package/dist/web/v2/components/logs/cache/key-detail/CacheKeyDetailTimelineTab.d.ts +0 -7
  36. package/dist/web/v2/components/logs/cache/key-detail/CacheKeyDetailTracesTab.d.ts +0 -3
  37. package/dist/web/v2/components/logs/cache/logs/CacheDataCard.d.ts +0 -30
  38. package/dist/web/v2/components/logs/cache/logs/CacheFiltersCard.d.ts +0 -15
  39. package/dist/web/v2/components/logs/cache/logs/CacheLogsSection.d.ts +0 -1
  40. package/dist/web/v2/components/logs/cache/logs/CacheLogsTable.d.ts +0 -7
  41. package/dist/web/v2/components/logs/cache/logs/CacheSummaryTable.d.ts +0 -8
  42. package/dist/web/v2/components/logs/cache/modals/CacheTagDetailModal.d.ts +0 -11
  43. package/dist/web/v2/hooks/useCacheInsights.d.ts +0 -308
  44. package/dist/web/v2/utils/cache/cacheInsightsMappers.d.ts +0 -6
  45. package/dist/web/v2/utils/cache/cacheInsightsMetrics.d.ts +0 -24
  46. package/dist/web/v2/utils/cache/cacheTraceInsights.d.ts +0 -35
  47. package/dist/web/v2/utils/cacheFormat.d.ts +0 -7
  48. package/dist/web/v2/utils/cacheUtils.d.ts +0 -2
package/dist/index.mjs CHANGED
@@ -424,7 +424,7 @@ function applyDocsSecurityHeaders(res) {
424
424
  // src/web/v2/types/types.ts
425
425
  import {
426
426
  finalize,
427
- resource as resource7
427
+ resource as resource8
428
428
  } from "@emeryld/rrroutes-contract";
429
429
 
430
430
  // src/web/v2/types/types.cacheLog.ts
@@ -447,7 +447,7 @@ var baseEntitySchema = z2.object({
447
447
  var baseQuerySchema = z2.object({
448
448
  beforeDate: z2.string().optional(),
449
449
  afterDate: z2.string().optional(),
450
- orderBy: z2.enum(["timestamp", "duration", "level", "path"]).optional(),
450
+ orderBy: z2.string().optional(),
451
451
  orderDirection: z2.enum(["asc", "desc"]).optional(),
452
452
  searchQuery: z2.string().optional(),
453
453
  groupsInclude: z2.string().array().optional(),
@@ -478,107 +478,16 @@ var cacheTraceSchema = z3.object({
478
478
  type: z3.string().optional()
479
479
  // 'redis', 'dataloader', etc.
480
480
  });
481
+ var cacheTraceQuerySchema = baseQuerySchema;
481
482
  var cacheLogSchema = baseEntitySchema.extend({
482
483
  value: z3.any().nullable(),
483
484
  size: z3.number().optional(),
484
- operation: operationEnum.optional(),
485
- lastSet: z3.number().nullable(),
486
- lastHit: z3.number().nullable(),
487
- lastMiss: z3.number().nullable(),
488
- lastDelete: z3.number().nullable()
489
- });
490
- var cacheTraceQuerySchema = baseQuerySchema.extend({
491
- operationsInclude: operationEnum.array().optional(),
492
- operationsExclude: operationEnum.array().optional(),
493
- keys: z3.array(z3.string()).optional(),
494
- keySearch: z3.string().optional()
485
+ setAt: z3.number().optional(),
486
+ ttlMs: z3.number().optional()
495
487
  });
496
488
  var cacheLogQuerySchema = baseQuerySchema.extend({
497
- operationsInclude: operationEnum.array().optional(),
498
- operationsExclude: operationEnum.array().optional(),
499
- keys: z3.array(z3.string()).optional(),
500
- keySearch: z3.string().optional()
501
- });
502
- var cacheSummarySchema = z3.object({
503
- key: z3.string(),
504
- lastSetAt: z3.number().nullable(),
505
- lastHitAt: z3.number().nullable(),
506
- lastMissAt: z3.number().nullable(),
507
- totalHits: z3.number(),
508
- totalMisses: z3.number(),
509
- totalSets: z3.number(),
510
- // Latest known size for this key, based on recent logs with a size value.
511
- sizeBytes: z3.number().optional()
512
- });
513
- var cacheKeyInsightSchema = z3.object({
514
- key: z3.string(),
515
- // Current state
516
- currentSizeBytes: z3.number().nullable(),
517
- lastSetAt: z3.number().nullable(),
518
- lastDeleteAt: z3.number().nullable(),
519
- lastHitAt: z3.number().nullable(),
520
- lastMissAt: z3.number().nullable(),
521
- lastActivityAt: z3.number().nullable(),
522
- // Totals in the selected window (or all time, if no window supplied)
523
- totalHits: z3.number(),
524
- totalMisses: z3.number(),
525
- totalSets: z3.number(),
526
- totalDeletes: z3.number(),
527
- // “Since last set” for this key (based on most recent set in window)
528
- hitsSinceLastSet: z3.number(),
529
- missesSinceLastSet: z3.number(),
530
- deletesSinceLastSet: z3.number(),
531
- // Behaviour between sets in the selected window
532
- avgTimeBetweenSetsMs: z3.number().nullable(),
533
- avgHitsBetweenSets: z3.number().nullable(),
534
- avgMissesBetweenSets: z3.number().nullable(),
535
- // Basic hit/miss rates in the window
536
- hitRate: z3.number(),
537
- // 0–100
538
- missRate: z3.number()
539
- // 0–100
540
- });
541
- var cacheTagInsightSchema = z3.object({
542
- tag: z3.string(),
543
- // Approximate current size for this tag (from current key sizes,
544
- // e.g. splitting multi-tag keys evenly).
545
- approxCurrentSizeBytes: z3.number().nullable(),
546
- // Totals across all keys with this tag in the selected window
547
- totalHits: z3.number(),
548
- totalMisses: z3.number(),
549
- totalSets: z3.number(),
550
- totalDeletes: z3.number(),
551
- // Behaviour between sets (aggregated / averaged across keys)
552
- avgTimeBetweenSetsMs: z3.number().nullable(),
553
- avgHitsBetweenSets: z3.number().nullable(),
554
- avgMissesBetweenSets: z3.number().nullable(),
555
- hitRate: z3.number(),
556
- // 0–100
557
- missRate: z3.number()
558
- // 0–100
559
- });
560
- var cacheInsightsSchema = z3.object({
561
- computedAt: z3.number(),
562
- // epoch ms when these stats were computed
563
- // Optional time window that was applied to logs for this computation
564
- windowStart: z3.number().nullable(),
565
- windowEnd: z3.number().nullable(),
566
- groupBy: z3.enum(["key", "tag", "both"]),
567
- // When groupBy = 'key' or 'both'
568
- keys: cacheKeyInsightSchema.array().optional(),
569
- // When groupBy = 'tag' or 'both'
570
- tags: cacheTagInsightSchema.array().optional()
571
- });
572
- var cacheInsightsQuerySchema = baseQuerySchema.extend({
573
- /**
574
- * Restrict to given keys (optional).
575
- * If omitted, all keys are considered.
576
- */
577
- keys: z3.array(z3.string()).optional(),
578
- /**
579
- * How to group results. 'both' returns both per-key and per-tag views.
580
- */
581
- groupBy: z3.enum(["key", "tag", "both"]).default("both")
489
+ keysInclude: z3.array(z3.string()).optional(),
490
+ keysExclude: z3.array(z3.string()).optional()
582
491
  });
583
492
  var cacheLeaves = resource("cache").get({
584
493
  feed: true,
@@ -594,10 +503,6 @@ var cacheLeaves = resource("cache").get({
594
503
  querySchema: cacheTraceQuerySchema,
595
504
  outputMetaSchema: feedMeta
596
505
  }).done(),
597
- resource("insights").get({
598
- outputSchema: cacheInsightsSchema,
599
- querySchema: cacheInsightsQuerySchema
600
- }).done(),
601
506
  resource("clear").post({
602
507
  outputSchema: z3.object({ success: z3.boolean() }),
603
508
  querySchema: cacheLogQuerySchema
@@ -808,10 +713,42 @@ var presetLeaves = resource5("presets").get({
808
713
  outputSchema: presetSchema
809
714
  }).done();
810
715
 
811
- // src/web/v2/types/types.socket.ts
716
+ // src/web/v2/types/types.scheduling.ts
812
717
  import { resource as resource6 } from "@emeryld/rrroutes-contract";
813
718
  import z8 from "zod";
814
- var socketEventDirectionSchema = z8.enum([
719
+ var schedulingSchema = baseEntitySchema.extend({
720
+ scheduledAt: z8.number().optional(),
721
+ startedAt: z8.number().optional(),
722
+ completedAt: z8.number().optional(),
723
+ status: z8.string()
724
+ });
725
+ var schedulingQuerySchema = baseQuerySchema.extend({
726
+ status: z8.string().array().optional()
727
+ });
728
+ var schedulableHandler = z8.object({
729
+ name: z8.string(),
730
+ payload: z8.string()
731
+ });
732
+ var schedulingLeaves = resource6("schedulings").get({
733
+ feed: true,
734
+ outputSchema: schedulingSchema.array(),
735
+ querySchema: schedulingQuerySchema,
736
+ outputMetaSchema: feedMeta,
737
+ queryExtensionSchema: paginationSchema
738
+ }).sub(
739
+ resource6("handlers").get({
740
+ feed: true,
741
+ outputSchema: schedulableHandler.array(),
742
+ querySchema: z8.object({ name: z8.string().optional() }),
743
+ outputMetaSchema: feedMeta,
744
+ queryExtensionSchema: paginationSchema
745
+ }).done()
746
+ ).done();
747
+
748
+ // src/web/v2/types/types.socket.ts
749
+ import { resource as resource7 } from "@emeryld/rrroutes-contract";
750
+ import z9 from "zod";
751
+ var socketEventDirectionSchema = z9.enum([
815
752
  "incoming",
816
753
  // client -> server
817
754
  "outgoing",
@@ -821,37 +758,37 @@ var socketEventDirectionSchema = z8.enum([
821
758
  ]);
822
759
  var socketEventSchema = baseEntitySchema.extend({
823
760
  // event name
824
- name: z8.string(),
761
+ name: z9.string(),
825
762
  // arbitrary payload
826
- message: z8.any().optional(),
763
+ message: z9.any().optional(),
827
764
  // "server" or socket id
828
- origin: z8.union([z8.literal("server"), z8.string()]),
765
+ origin: z9.union([z9.literal("server"), z9.string()]),
829
766
  // "incoming" | "outgoing" | "broadcast"
830
- direction: z8.enum(["incoming", "outgoing", "broadcast"]),
767
+ direction: z9.enum(["incoming", "outgoing", "broadcast"]),
831
768
  // for incoming/outgoing direct events
832
- socketId: z8.string().optional(),
769
+ socketId: z9.string().optional(),
833
770
  // for broadcast events
834
- rooms: z8.array(z8.string()).optional(),
835
- except: z8.array(z8.string()).optional()
771
+ rooms: z9.array(z9.string()).optional(),
772
+ except: z9.array(z9.string()).optional()
836
773
  });
837
774
  var socketEventQuerySchema = baseQuerySchema.extend({
838
775
  // Exact event name match (single value for now)
839
- eventName: z8.string().optional(),
840
- roomsInclude: z8.array(z8.string()).optional(),
841
- roomsExclude: z8.array(z8.string()).optional()
776
+ eventName: z9.string().optional(),
777
+ roomsInclude: z9.array(z9.string()).optional(),
778
+ roomsExclude: z9.array(z9.string()).optional()
842
779
  });
843
- var socketEmitSchema = z8.object({
844
- eventName: z8.string(),
780
+ var socketEmitSchema = z9.object({
781
+ eventName: z9.string(),
845
782
  // JSON payload for the event
846
- message: z8.json().optional(),
783
+ message: z9.json().optional(),
847
784
  // Target room IDs. Use null for broadcast.
848
- toRoomId: z8.array(z8.string()).nullable()
785
+ toRoomId: z9.array(z9.string()).nullable()
849
786
  });
850
- var socketEmitResultSchema = z8.object({
851
- success: z8.boolean(),
852
- eventId: z8.string().optional()
787
+ var socketEmitResultSchema = z9.object({
788
+ success: z9.boolean(),
789
+ eventId: z9.string().optional()
853
790
  });
854
- var socketLeaves = resource6("sockets").get({
791
+ var socketLeaves = resource7("sockets").get({
855
792
  feed: true,
856
793
  outputSchema: socketEventSchema.array(),
857
794
  querySchema: socketEventQuerySchema,
@@ -863,14 +800,15 @@ var socketLeaves = resource6("sockets").get({
863
800
  }).done();
864
801
 
865
802
  // src/web/v2/types/types.ts
866
- var allLeaves = resource7().sub(
867
- resource7("/__rrroutes").sub(
803
+ var allLeaves = resource8().sub(
804
+ resource8("/__rrroutes").sub(
868
805
  endpointLeaves,
869
806
  requestLogLeaves,
870
807
  logLeaves,
871
808
  cacheLeaves,
872
809
  presetLeaves,
873
- socketLeaves
810
+ socketLeaves,
811
+ schedulingLeaves
874
812
  ).done()
875
813
  ).done();
876
814
  var leaves = finalize(allLeaves);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/docs/LeafDocsPage.tsx","../src/docs/serializer.ts","../src/docs/schemaIntrospection.ts","../src/docs/docs.ts","../src/web/utils/security.ts","../src/web/v2/types/types.ts","../src/web/v2/types/types.cacheLog.ts","../src/web/v2/types/types.base.ts","../src/web/v2/types/types.endpoint.ts","../src/web/v2/types/types.requestLog.ts","../src/web/v2/types/types.log.ts","../src/web/v2/types/types.preset.ts","../src/web/v2/types/types.socket.ts"],"sourcesContent":["// index.ts\n\nimport { randomBytes } from 'crypto'\nimport type { RequestHandler, Router } from 'express'\nimport { static as expressStatic } from 'express'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { renderLeafDocsHTML } from './docs/docs.js'\nimport {\n applyDocsSecurityHeaders,\n createCookieGuard,\n createIpAllowListGuard,\n createMissingPasswordGuard,\n createPasswordGuard,\n} from './web/utils/security.js'\n\nexport type DocsAuthOptions = {\n enabled?: boolean\n password?: string\n realm?: string\n allowedIps?: string[]\n cookieName?: string\n cookieSecret?: string\n guardMiddleware?: RequestHandler\n csp?: boolean\n}\n\nexport type DocsThemeConfig = Partial<{\n bg: string\n surface: string\n primary: string\n secondary: string\n success: string\n warning: string\n error: string\n textPrimary: string\n}>\n\nexport type MountDocsArgs = {\n router: Router\n auth: DocsAuthOptions\n theme?: DocsThemeConfig\n}\n\nfunction resolvePublicDir() {\n const moduleDir =\n typeof __dirname !== 'undefined'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url))\n const fromModule = path.resolve(moduleDir, '../public')\n if (fs.existsSync(fromModule)) return fromModule\n\n // When running from source (ts-node), fall back to the built output path.\n const fallback = path.resolve(moduleDir, '../dist/public')\n if (fs.existsSync(fallback)) return fallback\n\n return fromModule // fallback; express static will 404 if missing\n}\n\nexport function mountRRRoutesDocs({\n router,\n auth = {},\n theme,\n}: MountDocsArgs): string {\n const docsPath = '/__rrroutes/docs'\n\n const publicDir = resolvePublicDir()\n const assetsDir = path.join(publicDir, 'assets')\n\n const cspEnabled = auth.csp !== false\n const authEnabled = auth.enabled !== false\n const docsPassword = auth.password\n const authRealm = auth.realm || 'RRRoutes Docs'\n const allowedIps = auth.allowedIps ?? []\n const cookieName = auth.cookieName\n const cookieSecret = auth?.cookieSecret\n const customGuard = auth?.guardMiddleware\n\n const ipGuard =\n allowedIps.length > 0 ? createIpAllowListGuard(allowedIps) : undefined\n\n const authGuard: RequestHandler = !authEnabled\n ? (_req, _res, next) => next()\n : customGuard\n ? customGuard\n : cookieName\n ? createCookieGuard(cookieName, cookieSecret)\n : docsPassword\n ? createPasswordGuard(docsPassword, authRealm)\n : createMissingPasswordGuard()\n\n // Protect docs HTML, static assets, and webhook feeds with IP guard (if any) + auth guard.\n ;[docsPath, `${docsPath}/assets`, `__rrroutes/`].forEach((p) => {\n if (ipGuard) router.use(p, ipGuard)\n router.use(p, authGuard)\n })\n\n router.use(\n `${docsPath}/assets`,\n expressStatic(assetsDir, { immutable: true, maxAge: '365d' }),\n )\n\n const docsRoutePaths = [docsPath, `${docsPath}/`, `${docsPath}/*id`]\n\n router.get(docsRoutePaths, (_req, res) => {\n const nonce = cspEnabled ? randomBytes(16).toString('base64') : undefined\n\n const html = renderLeafDocsHTML({\n cspNonce: nonce,\n assetBasePath: `${docsPath}/assets`,\n docsBasePath: `${docsPath}`,\n theme,\n })\n\n applyDocsSecurityHeaders(res)\n\n if (cspEnabled && nonce) {\n res.setHeader(\n 'Content-Security-Policy',\n [\n \"default-src 'self'\",\n `script-src 'self' 'nonce-${nonce}'`,\n `style-src 'self' 'nonce-${nonce}'`,\n \"img-src 'self' data:\",\n \"connect-src 'self'\",\n \"font-src 'self'\",\n \"frame-ancestors 'self'\",\n \"object-src 'none'\",\n \"base-uri 'self'\",\n ].join('; '),\n )\n }\n\n res.send(html)\n })\n\n return docsPath\n}\n\nexport { renderLeafDocsHTML } from './docs/docs.js'\nexport { introspectSchema } from './docs/schemaIntrospection.js'\nexport { serializeLeaf } from './docs/serializer.js'\nexport type { SerializedLeaf as SerializableLeaf } from './docs/serializer.js'\nexport { leaves as requiredRoutes } from './web/utils/types.js'\n\nexport type {\n CacheInsights as RRRCacheInsights,\n CacheInsightsFilter as RRRCacheInsightsFilter,\n CacheLogsFilter as RRRCacheLogsFilter,\n CacheLogType as RRRCacheLogType,\n CacheTraceQuery as RRRCacheTraceQuery,\n CacheTraceType as RRRCacheTraceType,\n} from './web/v2/types/types.cacheLog.js'\nexport type {\n EndpointDetailData as RRREndpointDetailData,\n RoutesFilter as RRREndpointFilter,\n EndpointType as RRREndpointType,\n} from './web/v2/types/types.endpoint.js'\nexport type {\n LogType as RRLogType,\n ApplicationLogsFilter as RRRLogFilter,\n} from './web/v2/types/types.log.js'\nexport type {\n PresetsFilter as RRRPresetsFilter,\n PresetType as RRRPresetType,\n} from './web/v2/types/types.preset.js'\nexport type {\n HistoryFilter as RRRRequestLogFilter,\n RequestLogType as RRRRequestLogType,\n} from './web/v2/types/types.requestLog.js'\nexport type {\n SocketEmitBody as RRRSocketEmitBody,\n SocketEmitResult as RRRSocketEmitResult,\n SocketEventsFilter as RRRSocketEventsFilter,\n SocketEventType as RRRSocketEventType,\n} from './web/v2/types/types.socket.js'\n","// LeafDocsPage.tsx\n\nimport type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract'\nimport type { ReactElement } from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { serializeLeaf } from './serializer.js'\n\nexport type DocsThemeConfig = Partial<{\n bg: string\n surface: string\n primary: string\n secondary: string\n success: string\n warning: string\n error: string\n textPrimary: string\n}>\n\nexport interface RenderOptions {\n /** CSP nonce applied to data + script tags. */\n cspNonce?: string\n /** Base URL where static assets are served (e.g. `/__rrroutes/docs/assets`). */\n assetBasePath?: string\n /** Root path where the docs are mounted (e.g. `/__rrroutes/docs`). Used for client routing. */\n docsBasePath?: string\n /**\n * Optional theme seed overrides passed to the client.\n * If omitted, the client uses its built-in default docs theme.\n */\n theme?: DocsThemeConfig\n}\n\nconst DEFAULT_ASSET_BASE = '/__rrroutes/docs/assets'\n\nfunction normalizeBase(base: string) {\n if (!base) return DEFAULT_ASSET_BASE\n return base.endsWith('/') ? base.slice(0, -1) : base\n}\n\nfunction normalizeDocsBase(base: string | undefined) {\n if (!base) return ''\n if (base === '/') return '/'\n return base.endsWith('/') && base.length > 1 ? base.slice(0, -1) : base\n}\n\nfunction normalizeBaseUrlSuffix(suffix: string | undefined) {\n if (!suffix) return ''\n const trimmed =\n suffix.endsWith('/') && suffix.length > 1 ? suffix.slice(0, -1) : suffix\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\ntype DocsDocumentProps = {\n assetBase: string\n docsBase: string\n cspNonce?: string\n theme?: DocsThemeConfig\n}\n\nexport const DocsDocument = ({\n assetBase,\n docsBase,\n cspNonce,\n theme,\n}: DocsDocumentProps) => {\n const cssHref = `${assetBase}/docs.css`\n const jsSrc = `${assetBase}/docs.js`\n\n const configJson = serializeConfig({\n docsBasePath: docsBase,\n cspNonce,\n theme,\n })\n\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>API Reference</title>\n <link rel=\"stylesheet\" href={cssHref} />\n </head>\n <body>\n <div id=\"docs-root\"></div>\n <script\n id=\"docs-config\"\n type=\"application/json\"\n nonce={cspNonce}\n dangerouslySetInnerHTML={{ __html: configJson }}\n />\n <script type=\"module\" src={jsSrc} nonce={cspNonce} />\n </body>\n </html>\n )\n}\n\nfunction serializeLeaves(leaves: AnyLeafLowProfile[]) {\n return JSON.stringify(leaves.map(serializeLeaf)).replace(/<\\//g, '<\\\\/')\n}\n\ntype DocsConfig = {\n docsBasePath: string\n baseUrlSuffix?: string\n cspNonce?: string\n theme?: DocsThemeConfig\n}\n\nfunction serializeConfig(config: DocsConfig) {\n return JSON.stringify(config).replace(/<\\//g, '<\\\\/')\n}\n\nexport function createLeafDocsDocument(\n options: RenderOptions = {},\n): ReactElement {\n const assetBase = normalizeBase(options.assetBasePath ?? DEFAULT_ASSET_BASE)\n const docsBase = normalizeDocsBase(options.docsBasePath)\n\n return (\n <DocsDocument\n assetBase={assetBase}\n docsBase={docsBase}\n cspNonce={options.cspNonce}\n theme={options.theme}\n />\n )\n}\n\nexport function renderLeafDocsHTML(options: RenderOptions = {}): string {\n const doc = createLeafDocsDocument(options)\n const html = renderToStaticMarkup(doc)\n return `<!DOCTYPE html>${html}`\n}\n\nexport type SerializableHistoryEntry = {\n id?: string\n timestamp: number\n method: string\n path: string\n fullUrl: string\n params?: Record<string, string>\n query?: Record<string, string>\n body?: string\n output?: string\n status?: number\n durationMs: number\n error?: string\n}\n","// serializer.ts\nimport {\n MethodCfgLowProfile,\n routeSchemaParse,\n type AnyLeafLowProfile,\n} from '@emeryld/rrroutes-contract'\nimport { MethodType } from '../web/v2/types/types.base.js'\nimport type { EndpointType } from '../web/v2/types/types.endpoint.js'\nimport { introspectSchema } from './schemaIntrospection.js'\n\nexport type SerializedLeaf = EndpointType\n\nexport type { SerializableSchemaNode } from './schemaIntrospection.js'\n\nexport function serializeLeaf(leaf: AnyLeafLowProfile): EndpointType {\n const cfg = leaf.cfg\n\n const tags = Array.isArray(cfg.tags) ? cfg.tags.slice() : []\n const stability = (cfg.stability ??\n 'experimental') as EndpointType['stability']\n const now = Date.now()\n\n return {\n id: buildLeafId(leaf),\n name: inferName(cfg, leaf.path),\n description: cfg.description,\n groupId: cfg.docsGroup,\n tags: tags.length > 0 ? tags : undefined,\n createdAt: now,\n updatedAt: now,\n method: leaf.method as MethodType,\n path: leaf.path,\n contract: {\n body: serializeContractSchema(cfg.bodySchema),\n query: serializeContractSchema(cfg.querySchema),\n params: serializeContractSchema(cfg.paramsSchema),\n output: serializeContractSchema(cfg.outputSchema),\n bodyFiles: serializeBodyFiles(cfg),\n },\n feed: cfg.feed ?? undefined,\n summary: cfg.summary,\n stability,\n hidden: cfg.docsHidden,\n meta: serializeMeta(cfg.docsMeta),\n }\n}\n\nfunction serializeContractSchema(schema: MethodCfgLowProfile['bodySchema']) {\n return schema ? introspectSchema(routeSchemaParse(schema)) : undefined\n}\n\nfunction serializeBodyFiles(cfg: MethodCfgLowProfile) {\n if (!Array.isArray(cfg.bodyFiles) || cfg.bodyFiles.length === 0)\n return undefined\n return cfg.bodyFiles.map(({ name, maxCount }) => ({ name, maxCount }))\n}\n\nfunction serializeMeta(meta?: Record<string, unknown>): Record<string, string> {\n if (!meta) return {}\n const entries = Object.entries(meta)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => [\n key,\n typeof value === 'string' ? value : JSON.stringify(value),\n ])\n return Object.fromEntries(entries)\n}\n\nfunction buildLeafId(leaf: AnyLeafLowProfile) {\n return `${leaf.method.toUpperCase()} ${leaf.path}`\n}\n\nfunction inferName(cfg: MethodCfgLowProfile, path: string) {\n return cfg.summary || cfg.description || path\n}\n","// schemaIntrospection.ts\nimport * as z from 'zod'\nimport type { SerializableSchema } from '../web/v2/types/types.endpoint.js'\n\nexport type SerializableSchemaNode = SerializableSchema\n\ntype ZodAny = z.ZodTypeAny\n\n/**\n * Zod 3 uses `schema._def`, Zod 4 uses `schema._zod.def`.\n */\nfunction getDef(schema: unknown): any | undefined {\n if (!schema || typeof schema !== 'object') return undefined\n const anySchema = schema as any\n return anySchema._zod?.def ?? anySchema._def\n}\n\n/**\n * Try to get a human-readable description.\n * Zod 4: use metadata/registry; fallback to internal def.description.\n * Zod 3: only internal def.description exists.\n */\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\n // Zod 4 global registry metadata, if present\n const registry = anyZ.globalRegistry?.get\n ? anyZ.globalRegistry.get(schema)\n : undefined\n if (registry && typeof registry.description === 'string') {\n return registry.description\n }\n\n // Legacy / internal description\n const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\n\n/**\n * Peel off wrappers (effects, optional, nullable, default) and\n * return the inner schema + flags.\n *\n * Supports:\n * - Zod 3: ZodEffects, ZodOptional, ZodNullable, ZodDefault\n * - Zod 4: ZodOptional, ZodNullable, ZodDefault\n */\nfunction unwrap(schema: ZodAny): {\n base: ZodAny\n optional: boolean\n nullable: boolean\n} {\n let s: ZodAny = schema\n let optional = false\n let nullable = false\n\n // Zod 3 only (undefined in Zod 4)\n const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Zod 3: ZodEffects wrapper\n if (ZodEffectsCtor && s instanceof ZodEffectsCtor) {\n const def = getDef(s) || {}\n const sourceType =\n typeof (s as any).sourceType === 'function'\n ? (s as any).sourceType()\n : def.schema\n if (!sourceType) break\n s = sourceType\n continue\n }\n\n // Zod 3 + 4: optional/nullable/default wrappers\n if (s instanceof z.ZodOptional) {\n optional = true\n const def = getDef(s)\n s = (def && def.innerType) || s // innerType exists in both 3 & 4\n continue\n }\n\n if (s instanceof z.ZodNullable) {\n nullable = true\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n if (s instanceof z.ZodDefault) {\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n break\n }\n\n return { base: s, optional, nullable }\n}\n\nexport function introspectSchema(\n schema: ZodAny | undefined,\n): SerializableSchema | undefined {\n if (!schema) return undefined\n\n const { base, optional, nullable } = unwrap(schema)\n const def = getDef(base)\n\n const node: SerializableSchema = {\n kind: inferKind(base),\n optional: optional || undefined,\n nullable: nullable || undefined,\n description: getDescription(base),\n }\n\n // OBJECT\n if (base instanceof z.ZodObject) {\n // Zod 3: _def.shape() (function)\n // Zod 4: .shape getter returns an object\n const rawShape: any =\n (base as any).shape ??\n (def && typeof def.shape === 'function' ? def.shape() : def?.shape)\n\n const shape = typeof rawShape === 'function' ? rawShape() : (rawShape ?? {})\n\n const props: Record<string, SerializableSchema> = {}\n for (const key of Object.keys(shape)) {\n const child = shape[key] as ZodAny\n const childNode = introspectSchema(child)\n if (childNode) props[key] = childNode\n }\n node.properties = props\n }\n\n // ARRAY\n if (base instanceof z.ZodArray) {\n // Zod 3: def.type is inner schema\n // Zod 4: def.element is inner schema\n const inner =\n (def && (def.element as ZodAny)) ||\n (def && (def.type as ZodAny)) ||\n undefined\n if (inner) {\n node.element = introspectSchema(inner)\n }\n }\n\n // UNION\n if (base instanceof z.ZodUnion) {\n const options: ZodAny[] = (def && def.options) || []\n node.union = options\n .map((opt) => introspectSchema(opt))\n .filter(Boolean) as SerializableSchema[]\n }\n\n // EXTENSION\n if (base instanceof z.ZodIntersection) {\n const left: ZodAny = (def && def.left) || undefined\n const right: ZodAny = (def && def.right) || undefined\n if (left && right) {\n node.properties = {\n left: introspectSchema(left) as SerializableSchema,\n right: introspectSchema(right) as SerializableSchema,\n }\n }\n }\n\n // LITERAL\n if (base instanceof z.ZodLiteral) {\n if (def) {\n // Zod 4: def.values (multi-literal)\n if (Array.isArray(def.values)) {\n node.literal =\n def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\n // Zod 3: def.value\n node.literal = def.value\n }\n }\n }\n\n // ENUM\n if (base instanceof z.ZodEnum) {\n if (def) {\n if (Array.isArray(def.values)) {\n // Zod 3\n node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\n // Zod 4: entries is a { key: value } map\n node.enumValues = Object.values(def.entries).map((v: unknown) =>\n String(v),\n )\n }\n }\n }\n\n return node\n}\n\nfunction inferKind(schema: ZodAny): SerializableSchema['kind'] {\n // This path still uses instanceof; it works with Zod 4 Classic\n // (importing from \"zod\"). Anything unknown falls back to \"unknown\".\n if (schema instanceof z.ZodString) return 'string'\n if (schema instanceof z.ZodNumber) return 'number'\n if (schema instanceof z.ZodBoolean) return 'boolean'\n if (schema instanceof z.ZodBigInt) return 'bigint'\n if (schema instanceof z.ZodDate) return 'date'\n if (schema instanceof z.ZodArray) return 'array'\n if (schema instanceof z.ZodObject) return 'object'\n if (schema instanceof z.ZodUnion) return 'union'\n if (schema instanceof z.ZodLiteral) return 'literal'\n if (schema instanceof z.ZodEnum) return 'enum'\n if (schema instanceof z.ZodRecord) return 'record'\n if (schema instanceof z.ZodTuple) return 'tuple'\n if (schema instanceof z.ZodUnknown) return 'unknown'\n if (schema instanceof z.ZodAny) return 'any'\n\n return 'unknown'\n}\n","// renderLeafDocsHTML.ts\nimport {\n renderLeafDocsHTML as LeafDocsPage,\n RenderOptions,\n} from './LeafDocsPage.js'\n\nexport function renderLeafDocsHTML(options: RenderOptions = {}): string {\n return LeafDocsPage(options)\n}\n\nexport { createLeafDocsDocument } from './LeafDocsPage.js'\nexport type { RenderOptions } from './LeafDocsPage.js'\n","import type { Request, RequestHandler, Response } from 'express'\nimport net from 'node:net'\n\n/**\n * HTTP Basic password guard.\n */\nexport function createPasswordGuard(\n password: string,\n realm: string,\n): RequestHandler {\n const trimmed = password.trim()\n return (req: Request, res: Response, next: () => void) => {\n const provided = extractPassword(req.headers.authorization)\n if (provided && provided === trimmed) {\n return next()\n }\n applyDocsSecurityHeaders(res)\n res.setHeader('WWW-Authenticate', `Basic realm=\"${realm}\"`)\n res\n .status(401)\n .send(\n renderAuthErrorPage(\n 'Docs are password protected. Provide the configured password.',\n ),\n )\n }\n}\n/**\n * Cookie-based guard. Requires `req.cookies` to be populated\n * (e.g. via `cookie-parser`).\n */\nexport function createCookieGuard(\n cookieName: string,\n cookieSecret?: string,\n): RequestHandler {\n return (req: Request, res: Response, next: () => void) => {\n const cookies = (req as any).cookies as Record<string, string> | undefined\n const value = cookies?.[cookieName]\n\n const valid = cookieSecret ? value === cookieSecret : Boolean(value)\n\n if (valid) {\n return next()\n }\n\n applyDocsSecurityHeaders(res)\n res\n .status(401)\n .send(\n renderAuthErrorPage(\n 'Docs are protected. You must be authenticated to access this page.',\n ),\n )\n }\n}\n/**\n * When auth is enabled but no password/cookie/custom guard is provided,\n * fail closed.\n */\nexport function createMissingPasswordGuard(): RequestHandler {\n return (_req: Request, res: Response) => {\n applyDocsSecurityHeaders(res)\n res\n .status(500)\n .send(renderAuthErrorPage('Provide auth configuration to mounted docs'))\n }\n}\n/**\n * Extract password from HTTP Basic Authorization header.\n */\nfunction extractPassword(authHeader: string | string[] | undefined) {\n if (!authHeader) return undefined\n const header = Array.isArray(authHeader) ? authHeader[0] : authHeader\n if (typeof header !== 'string' || !header.startsWith('Basic '))\n return undefined\n const token = header.slice('Basic '.length)\n try {\n const decoded = Buffer.from(token, 'base64').toString('utf8')\n const parts = decoded.split(':')\n parts.shift() // username\n return parts.join(':')\n } catch {\n return undefined\n }\n}\n/**\n * Simple IP allow-list guard. For accurate client IPs behind proxies,\n * configure `app.set('trust proxy', true)` in your Express app.\n */\nexport function createIpAllowListGuard(allowed: string[]): RequestHandler {\n const ranges = allowed\n .map((raw) => raw.trim())\n .filter(Boolean)\n .map(parseIpPattern)\n .filter((r): r is IpRange => r !== null)\n\n return (req: Request, res: Response, next: () => void) => {\n const rawIp =\n req.ip || (req.connection && (req.connection as any).remoteAddress) || ''\n const ip = normalizeIp(rawIp)\n\n if (!ip || !isIpAllowed(ip, ranges)) {\n applyDocsSecurityHeaders(res)\n res\n .status(403)\n .send(\n renderAuthErrorPage(\n 'Access to docs is restricted from this IP address.',\n ),\n )\n return\n }\n\n next()\n }\n}\ntype IpRange =\n | { kind: 'exact'; value: string }\n | { kind: 'cidr'; base: number; mask: number }\n/**\n * Normalize typical Express IP formats, including IPv4-mapped IPv6.\n */\nfunction normalizeIp(ip: string): string {\n if (!ip) return ''\n if (ip.startsWith('::ffff:')) return ip.slice(7)\n if (ip === '::1') return '127.0.0.1'\n return ip\n}\nfunction parseIpPattern(raw: string): IpRange | null {\n if (raw.includes('/')) {\n const cidr = parseCidr(raw)\n if (!cidr) return null\n return { kind: 'cidr', base: cidr.base, mask: cidr.mask }\n }\n\n // Exact string match (IPv4 or IPv6).\n return { kind: 'exact', value: normalizeIp(raw) }\n}\nfunction parseCidr(raw: string): { base: number; mask: number } | null {\n const [baseIp, bitsStr] = raw.split('/')\n const bits = Number(bitsStr)\n if (!Number.isInteger(bits) || bits < 0 || bits > 32) return null\n if (net.isIP(baseIp) !== 4) return null // IPv4 CIDR only for simplicity\n\n const baseLong = ipToLong(baseIp)\n if (baseLong == null) return null\n\n const mask = bits === 0 ? 0 : (~0 << (32 - bits)) >>> 0\n return { base: (baseLong & mask) >>> 0, mask }\n}\nfunction ipToLong(ip: string): number | null {\n const parts = ip.split('.').map((n) => Number(n))\n if (parts.length !== 4) return null\n if (parts.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) return null\n return (\n ((parts[0] << 24) >>> 0) +\n ((parts[1] << 16) >>> 0) +\n ((parts[2] << 8) >>> 0) +\n parts[3]\n )\n}\nfunction isIpAllowed(ip: string, ranges: IpRange[]): boolean {\n const ipv4 = net.isIP(ip) === 4 ? ipToLong(ip) : null\n\n for (const r of ranges) {\n if (r.kind === 'exact') {\n if (ip === r.value) return true\n } else if (r.kind === 'cidr' && ipv4 != null) {\n if ((ipv4 & r.mask) === r.base) return true\n }\n }\n\n return false\n}\nfunction renderAuthErrorPage(message: string) {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>RRRoutes docs locked</title>\n <style>\n body { margin:0; font-family: system-ui, -apple-system, Segoe UI, sans-serif; background: #0f172a; color: #e2e8f0; display:flex; align-items:center; justify-content:center; min-height:100vh; }\n .card { padding:32px; border:1px solid #1e293b; border-radius:12px; max-width:420px; background: rgba(15,23,42,0.8); box-shadow:0 15px 45px rgba(0,0,0,0.35); }\n h1 { margin:0 0 12px; font-size:22px; }\n p { margin:0; line-height:1.5; color:#cbd5e1; }\n code { background: rgba(226,232,240,0.1); padding: 2px 4px; border-radius: 4px; }\n </style>\n</head>\n<body>\n <div class=\"card\">\n <h1>Docs locked</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\nexport function applyDocsSecurityHeaders(res: Response) {\n res.setHeader('X-Content-Type-Options', 'nosniff')\n res.setHeader('Referrer-Policy', 'same-origin')\n res.setHeader('X-Frame-Options', 'SAMEORIGIN')\n res.setHeader('Cache-Control', 'no-store')\n res.setHeader(\n 'Strict-Transport-Security',\n 'max-age=31536000; includeSubDomains',\n )\n}\n","import {\n FinalizedRegistry,\n MergeAugmentedCollections,\n finalize,\n resource,\n} from '@emeryld/rrroutes-contract'\nimport { cacheLeaves } from './types.cacheLog.js'\nimport { endpointLeaves } from './types.endpoint.js'\nimport { logLeaves } from './types.log.js'\nimport { presetLeaves } from './types.preset.js'\nimport { requestLogLeaves } from './types.requestLog.js'\nimport { socketLeaves } from './types.socket.js'\n\ntype AllLeaves = readonly [\n ...MergeAugmentedCollections<\n '',\n undefined,\n readonly [\n MergeAugmentedCollections<\n '/__rrroutes',\n undefined,\n readonly [\n typeof endpointLeaves,\n typeof requestLogLeaves,\n typeof logLeaves,\n typeof cacheLeaves,\n typeof presetLeaves,\n typeof socketLeaves,\n ]\n >,\n ]\n >,\n]\n\nconst allLeaves: AllLeaves = resource()\n .sub(\n resource('/__rrroutes')\n .sub(\n endpointLeaves,\n requestLogLeaves,\n logLeaves,\n cacheLeaves,\n presetLeaves,\n socketLeaves,\n )\n .done(),\n )\n .done()\n\nexport const leaves: FinalizedRegistry<typeof allLeaves> = finalize(allLeaves)\n","// types.cacheLog.ts\n\nimport { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n paginationSchema,\n} from './types.base'\n\nexport const CACHE_OPERATIONS = ['hit', 'miss', 'set', 'delete'] as const\nexport type CacheOperation = (typeof CACHE_OPERATIONS)[number]\n\nconst operationEnum = z.enum(CACHE_OPERATIONS)\n\nexport const cacheTraceSchema = z.object({\n id: z.string(),\n timestamp: z.number(),\n operation: operationEnum,\n key: z.string(),\n size: z.number().optional(),\n durationMs: z.number().optional(),\n groupId: z.string().optional(),\n type: z.string().optional(), // 'redis', 'dataloader', etc.\n})\n\nexport const cacheLogSchema = baseEntitySchema.extend({\n value: z.any().nullable(),\n size: z.number().optional(),\n operation: operationEnum.optional(),\n\n lastSet: z.number().nullable(),\n lastHit: z.number().nullable(),\n lastMiss: z.number().nullable(),\n lastDelete: z.number().nullable(),\n})\n\nexport const cacheTraceQuerySchema = baseQuerySchema.extend({\n operationsInclude: operationEnum.array().optional(),\n operationsExclude: operationEnum.array().optional(),\n keys: z.array(z.string()).optional(),\n keySearch: z.string().optional(),\n})\n\nexport type CacheTraceType = z.infer<typeof cacheTraceSchema>\nexport type CacheTraceQuery = z.infer<typeof cacheTraceQuerySchema>\n\nexport type CacheLogType = z.infer<typeof cacheLogSchema>\n\nexport const cacheLogQuerySchema = baseQuerySchema.extend({\n operationsInclude: operationEnum.array().optional(),\n operationsExclude: operationEnum.array().optional(),\n keys: z.array(z.string()).optional(),\n keySearch: z.string().optional(),\n})\n\nexport type CacheLogsFilter = z.infer<typeof cacheLogQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const cacheSummarySchema = z.object({\n key: z.string(),\n lastSetAt: z.number().nullable(),\n lastHitAt: z.number().nullable(),\n lastMissAt: z.number().nullable(),\n totalHits: z.number(),\n totalMisses: z.number(),\n totalSets: z.number(),\n // Latest known size for this key, based on recent logs with a size value.\n sizeBytes: z.number().optional(),\n})\n\nexport type CacheSummaryType = z.infer<typeof cacheSummarySchema>\n\n//\n// NEW: “current view” insights schemas\n//\n\n// Per-key, current-state metrics.\nexport const cacheKeyInsightSchema = z.object({\n key: z.string(),\n\n // Current state\n currentSizeBytes: z.number().nullable(),\n lastSetAt: z.number().nullable(),\n lastDeleteAt: z.number().nullable(),\n lastHitAt: z.number().nullable(),\n lastMissAt: z.number().nullable(),\n lastActivityAt: z.number().nullable(),\n\n // Totals in the selected window (or all time, if no window supplied)\n totalHits: z.number(),\n totalMisses: z.number(),\n totalSets: z.number(),\n totalDeletes: z.number(),\n\n // “Since last set” for this key (based on most recent set in window)\n hitsSinceLastSet: z.number(),\n missesSinceLastSet: z.number(),\n deletesSinceLastSet: z.number(),\n\n // Behaviour between sets in the selected window\n avgTimeBetweenSetsMs: z.number().nullable(),\n avgHitsBetweenSets: z.number().nullable(),\n avgMissesBetweenSets: z.number().nullable(),\n\n // Basic hit/miss rates in the window\n hitRate: z.number(), // 0–100\n missRate: z.number(), // 0–100\n})\n\n// Per-tag aggregation of key insights.\nexport const cacheTagInsightSchema = z.object({\n tag: z.string(),\n\n // Approximate current size for this tag (from current key sizes,\n // e.g. splitting multi-tag keys evenly).\n approxCurrentSizeBytes: z.number().nullable(),\n\n // Totals across all keys with this tag in the selected window\n totalHits: z.number(),\n totalMisses: z.number(),\n totalSets: z.number(),\n totalDeletes: z.number(),\n\n // Behaviour between sets (aggregated / averaged across keys)\n avgTimeBetweenSetsMs: z.number().nullable(),\n avgHitsBetweenSets: z.number().nullable(),\n avgMissesBetweenSets: z.number().nullable(),\n\n hitRate: z.number(), // 0–100\n missRate: z.number(), // 0–100\n})\n\n// Overall response payload for the insights endpoint.\nexport const cacheInsightsSchema = z.object({\n computedAt: z.number(), // epoch ms when these stats were computed\n\n // Optional time window that was applied to logs for this computation\n windowStart: z.number().nullable(),\n windowEnd: z.number().nullable(),\n\n groupBy: z.enum(['key', 'tag', 'both']),\n\n // When groupBy = 'key' or 'both'\n keys: cacheKeyInsightSchema.array().optional(),\n\n // When groupBy = 'tag' or 'both'\n tags: cacheTagInsightSchema.array().optional(),\n})\n\nexport type CacheKeyInsight = z.infer<typeof cacheKeyInsightSchema>\nexport type CacheTagInsight = z.infer<typeof cacheTagInsightSchema>\nexport type CacheInsights = z.infer<typeof cacheInsightsSchema>\n\n// Query for GET /cache/insights\nexport const cacheInsightsQuerySchema = baseQuerySchema.extend({\n /**\n * Restrict to given keys (optional).\n * If omitted, all keys are considered.\n */\n keys: z.array(z.string()).optional(),\n /**\n * How to group results. 'both' returns both per-key and per-tag views.\n */\n groupBy: z.enum(['key', 'tag', 'both']).default('both'),\n})\n\nexport type CacheInsightsFilter = z.infer<typeof cacheInsightsQuerySchema>\n\n//\n// Leaves\n//\n\nexport const cacheLeaves = resource('cache')\n /**\n * Existing logs feed endpoint.\n */\n .get({\n feed: true,\n outputSchema: cacheLogSchema.array(),\n querySchema: cacheLogQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .sub(\n resource(':cacheKey', {}, z.string())\n .get({\n feed: true,\n outputSchema: cacheTraceSchema.array(),\n queryExtensionSchema: paginationSchema,\n querySchema: cacheTraceQuerySchema,\n outputMetaSchema: feedMeta,\n })\n .done(),\n resource('insights')\n .get({\n outputSchema: cacheInsightsSchema,\n querySchema: cacheInsightsQuerySchema,\n })\n .done(),\n resource('clear')\n .post({\n outputSchema: z.object({ success: z.boolean() }),\n querySchema: cacheLogQuerySchema,\n })\n .done(),\n )\n .done()\n","import z from 'zod'\n\nexport const METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const\nexport type MethodType = (typeof METHODS)[number]\nexport const methodSchema = z.enum(METHODS)\n\nexport const baseEntitySchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n groupId: z.string().optional(),\n tags: z.string().array().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n})\n\nexport const baseQuerySchema = z.object({\n beforeDate: z.string().optional(),\n afterDate: z.string().optional(),\n orderBy: z.enum(['timestamp', 'duration', 'level', 'path']).optional(),\n orderDirection: z.enum(['asc', 'desc']).optional(),\n searchQuery: z.string().optional(),\n groupsInclude: z.string().array().optional(),\n groupsExclude: z.string().array().optional(),\n tagsInclude: z.string().array().optional(),\n tagsExclude: z.string().array().optional(),\n})\n\nexport const paginationSchema = z.object({\n cursor: z.string().optional(),\n pageSize: z.coerce.number().optional(),\n})\n\nexport const feedMeta = z.object({\n totalCount: z.number().optional(),\n nextCursor: z.string().optional(),\n})\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z, { ZodType } from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n methodSchema,\n paginationSchema,\n} from './types.base'\nimport { requestSchema } from './types.requestLog'\n\nexport const nodeKind = [\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'date',\n 'array',\n 'enum',\n 'literal',\n 'union',\n 'record',\n 'tuple',\n 'unknown',\n 'any',\n] as const\n\nexport type SerializableSchema = {\n kind: (typeof nodeKind)[number]\n optional?: boolean\n nullable?: boolean\n description?: string\n\n // object\n properties?: Record<string, SerializableSchema>\n // array\n element?: SerializableSchema\n // union\n union?: SerializableSchema[]\n // literal\n literal?: unknown\n // enum\n enumValues?: string[]\n}\n\n// The Zod schema\nexport const serializableSchemaSchema: ZodType<\n SerializableSchema,\n SerializableSchema\n> = z.lazy(() =>\n z.object({\n kind: z.enum(nodeKind),\n\n optional: z.boolean().optional(),\n nullable: z.boolean().optional(),\n description: z.string().optional(),\n\n // object\n properties: z\n .record(z.string(), serializableSchemaSchema) // Record<string, SerializableSchemaNode>\n .optional(),\n\n // array\n element: serializableSchemaSchema.optional(),\n\n // union\n union: z.array(serializableSchemaSchema).optional(),\n\n // literal\n literal: z.unknown().optional(),\n\n // enum\n enumValues: z.array(z.string()).optional(),\n }),\n)\n\nexport const STABILITIES = [\n 'experimental',\n 'beta',\n 'stable',\n 'deprecated',\n 'unknown',\n] as const\nconst stabilityEnum = z.enum(STABILITIES)\nexport const endpointSchema = baseEntitySchema.extend({\n method: methodSchema,\n path: z.string(),\n contract: z.object({\n body: serializableSchemaSchema.optional(),\n query: serializableSchemaSchema.optional(),\n output: serializableSchemaSchema.optional(),\n params: serializableSchemaSchema.optional(),\n bodyFiles: z\n .array(z.object({ name: z.string(), maxCount: z.number() }))\n .optional(),\n }),\n feed: z.boolean().optional(),\n summary: z.string().optional(),\n stability: stabilityEnum,\n hidden: z.boolean().optional(),\n meta: z.record(z.string(), z.string()),\n implemented: z.boolean().optional(),\n})\n\nexport type EndpointType = z.output<typeof endpointSchema>\n\nexport const endpointFilterSchema = baseQuerySchema.extend({\n methodsInclude: methodSchema.array().optional(),\n methodsExclude: methodSchema.array().optional(),\n path: z.string().optional(),\n stabilityInclude: stabilityEnum.array().optional(),\n stabilityExclude: stabilityEnum.array().optional(),\n})\n\nexport type RoutesFilter = z.infer<typeof endpointFilterSchema> &\n z.infer<typeof paginationSchema>\n\nexport const endpointSchemaWithStats = endpointSchema.extend({\n // Related by groupId. Just use the existing feed endpoints with filter: groupId=?\n requests: z.array(requestSchema),\n // Summary stats: return with the feed?\n volumeTS: z.array(\n z.object({\n timestamp: z.number(),\n count: z.number(),\n }),\n ),\n averageDurationMs: z.number(),\n successRate: z.number(),\n // Add id as query param to the existing feed endpoints? This way \"requests\" field can also be only Ids\n latestErrors: z.array(requestSchema).optional(),\n})\n\nexport type EndpointDetailData = z.infer<typeof endpointSchemaWithStats>\nexport const endpointLeaves = resource('endpoints')\n .get({\n feed: true,\n querySchema: endpointFilterSchema,\n outputSchema: endpointSchema.array(),\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .sub(\n resource(':endpointId', undefined, z.string())\n .get({\n outputSchema: endpointSchemaWithStats,\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n methodSchema,\n paginationSchema,\n} from './types.base'\nimport { cacheTraceSchema } from './types.cacheLog'\nimport { logSchema } from './types.log'\n\nexport const requestSchema = baseEntitySchema.extend({\n status: z.number(),\n body: z.any().optional(),\n fullUrl: z.string(),\n path: z.string(),\n method: methodSchema,\n query: z.record(z.string(), z.any()).optional(),\n params: z.record(z.string(), z.any()).optional(),\n output: z.any().optional(),\n headers: z.record(z.string(), z.any()).optional(),\n error: z.string().optional(),\n durationMs: z.number(),\n ip: z.string().optional(),\n userAgent: z.string().optional(),\n requestSize: z.number().optional(),\n responseSize: z.number().optional(),\n})\n\nexport type RequestLogType = z.infer<typeof requestSchema>\n\nexport const requestQuerySchema = baseQuerySchema.extend({\n methodsInclude: methodSchema.array().optional(),\n methodsExclude: methodSchema.array().optional(),\n statusesInclude: z.coerce.number().array().optional(),\n statusesExclude: z.coerce.number().array().optional(),\n path: z.string().optional(),\n endpointKeysInclude: z.string().array().optional(),\n endpointKeysExclude: z.string().array().optional(),\n})\n\nexport type HistoryFilter = z.infer<typeof requestQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const requestLogLeaves = resource('requests')\n .get({\n feed: true,\n outputSchema: requestSchema.array(),\n querySchema: requestQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .sub(\n resource(':requestId', undefined, z.string())\n .get({\n outputSchema: requestSchema.extend({\n // Related by groupId\n // Do I just use the existing feed endpoints with filter: groupId=?\n logs: z.array(logSchema),\n caches: z.array(cacheTraceSchema),\n }),\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n paginationSchema,\n} from './types.base'\n\nconst levelSchema = z.string()\nexport const logSchema = baseEntitySchema.extend({\n level: levelSchema,\n meta: z.any().optional(),\n})\n\nexport type LogType = z.infer<typeof logSchema>\nexport const logQuerySchema = baseQuerySchema.extend({\n levelsInclude: levelSchema.array().optional(),\n levelsExclude: levelSchema.array().optional(),\n})\n\nexport type ApplicationLogsFilter = z.infer<typeof logQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const logLeaves = resource('logs')\n .get({\n feed: true,\n outputSchema: logSchema.array(),\n querySchema: logQuerySchema,\n outputMetaSchema: feedMeta.extend({\n levels: levelSchema.array().optional(),\n }),\n queryExtensionSchema: paginationSchema,\n })\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n methodSchema,\n paginationSchema,\n} from './types.base'\n\nconst presetSchema = baseEntitySchema.extend({\n operations: z.array(\n z.object({\n name: z.string(),\n description: z.string().optional(),\n stepNumber: z.number(),\n endpointId: z.string().optional(),\n method: methodSchema,\n path: z.string(),\n body: z.json().optional(),\n extraHeaders: z.record(z.string(), z.any()).optional(),\n query: z.record(z.string(), z.any()).optional(),\n }),\n ),\n})\nexport type PresetType = z.infer<typeof presetSchema>\n\nconst presetQuerySchema = baseQuerySchema.extend({\n nameInclude: z.string().optional(),\n nameExclude: z.string().optional(),\n})\nexport type PresetsFilter = z.infer<typeof presetQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const presetLeaves = resource('presets')\n .get({\n feed: true,\n querySchema: presetQuerySchema,\n outputMetaSchema: feedMeta,\n outputSchema: presetSchema.array(),\n queryExtensionSchema: paginationSchema,\n })\n .post({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .put({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\n\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n paginationSchema,\n} from './types.base.js'\n\n//\n// Entity schema – logged socket event\n//\nexport const socketEventDirectionSchema = z.enum([\n 'incoming', // client -> server\n 'outgoing', // server -> single socket\n 'outgoing-broadcast', // server -> rooms / multiple sockets\n])\n\nexport const socketEventSchema = baseEntitySchema.extend({\n // event name\n name: z.string(),\n\n // arbitrary payload\n message: z.any().optional(),\n\n // \"server\" or socket id\n origin: z.union([z.literal('server'), z.string()]),\n\n // \"incoming\" | \"outgoing\" | \"broadcast\"\n direction: z.enum(['incoming', 'outgoing', 'broadcast']),\n // for incoming/outgoing direct events\n socketId: z.string().optional(),\n\n // for broadcast events\n rooms: z.array(z.string()).optional(),\n except: z.array(z.string()).optional(),\n})\n\nexport type SocketEventType = z.infer<typeof socketEventSchema>\n\n//\n// Query schema – filters for the socket events feed\n//\n\nexport const socketEventQuerySchema = baseQuerySchema.extend({\n // Exact event name match (single value for now)\n eventName: z.string().optional(),\n roomsInclude: z.array(z.string()).optional(),\n roomsExclude: z.array(z.string()).optional(),\n})\n\nexport type SocketEventsFilter = z.infer<typeof socketEventQuerySchema> &\n z.infer<typeof paginationSchema>\n\n//\n// POST body – emit a socket event\n//\n\nexport const socketEmitSchema = z.object({\n eventName: z.string(),\n // JSON payload for the event\n message: z.json().optional(),\n // Target room IDs. Use null for broadcast.\n toRoomId: z.array(z.string()).nullable(),\n})\n\nexport type SocketEmitBody = z.infer<typeof socketEmitSchema>\n\n//\n// POST response – result of emitting an event\n//\n\nexport const socketEmitResultSchema = z.object({\n success: z.boolean(),\n eventId: z.string().optional(),\n})\n\nexport type SocketEmitResult = z.infer<typeof socketEmitResultSchema>\n\n//\n// Leaves – GET feed + POST emit\n//\n\nexport const socketLeaves = resource('sockets')\n .get({\n feed: true,\n outputSchema: socketEventSchema.array(),\n querySchema: socketEventQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .post({\n bodySchema: socketEmitSchema,\n outputSchema: socketEmitResultSchema,\n })\n .done()\n"],"mappings":"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","names":["path","renderLeafDocsHTML","resource","z","z","z","resource","z","resource","z","resource","z","z","resource","z","resource","z","resource","resource","z","z","resource","resource","z","z","resource","resource","renderLeafDocsHTML"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/docs/LeafDocsPage.tsx","../src/docs/serializer.ts","../src/docs/schemaIntrospection.ts","../src/docs/docs.ts","../src/web/utils/security.ts","../src/web/v2/types/types.ts","../src/web/v2/types/types.cacheLog.ts","../src/web/v2/types/types.base.ts","../src/web/v2/types/types.endpoint.ts","../src/web/v2/types/types.requestLog.ts","../src/web/v2/types/types.log.ts","../src/web/v2/types/types.preset.ts","../src/web/v2/types/types.scheduling.ts","../src/web/v2/types/types.socket.ts"],"sourcesContent":["// index.ts\n\nimport { randomBytes } from 'crypto'\nimport type { RequestHandler, Router } from 'express'\nimport { static as expressStatic } from 'express'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { renderLeafDocsHTML } from './docs/docs.js'\nimport {\n applyDocsSecurityHeaders,\n createCookieGuard,\n createIpAllowListGuard,\n createMissingPasswordGuard,\n createPasswordGuard,\n} from './web/utils/security.js'\n\nexport type DocsAuthOptions = {\n enabled?: boolean\n password?: string\n realm?: string\n allowedIps?: string[]\n cookieName?: string\n cookieSecret?: string\n guardMiddleware?: RequestHandler\n csp?: boolean\n}\n\nexport type DocsThemeConfig = Partial<{\n bg: string\n surface: string\n primary: string\n secondary: string\n success: string\n warning: string\n error: string\n textPrimary: string\n}>\n\nexport type MountDocsArgs = {\n router: Router\n auth: DocsAuthOptions\n theme?: DocsThemeConfig\n}\n\nfunction resolvePublicDir() {\n const moduleDir =\n typeof __dirname !== 'undefined'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url))\n const fromModule = path.resolve(moduleDir, '../public')\n if (fs.existsSync(fromModule)) return fromModule\n\n // When running from source (ts-node), fall back to the built output path.\n const fallback = path.resolve(moduleDir, '../dist/public')\n if (fs.existsSync(fallback)) return fallback\n\n return fromModule // fallback; express static will 404 if missing\n}\n\nexport function mountRRRoutesDocs({\n router,\n auth = {},\n theme,\n}: MountDocsArgs): string {\n const docsPath = '/__rrroutes/docs'\n\n const publicDir = resolvePublicDir()\n const assetsDir = path.join(publicDir, 'assets')\n\n const cspEnabled = auth.csp !== false\n const authEnabled = auth.enabled !== false\n const docsPassword = auth.password\n const authRealm = auth.realm || 'RRRoutes Docs'\n const allowedIps = auth.allowedIps ?? []\n const cookieName = auth.cookieName\n const cookieSecret = auth?.cookieSecret\n const customGuard = auth?.guardMiddleware\n\n const ipGuard =\n allowedIps.length > 0 ? createIpAllowListGuard(allowedIps) : undefined\n\n const authGuard: RequestHandler = !authEnabled\n ? (_req, _res, next) => next()\n : customGuard\n ? customGuard\n : cookieName\n ? createCookieGuard(cookieName, cookieSecret)\n : docsPassword\n ? createPasswordGuard(docsPassword, authRealm)\n : createMissingPasswordGuard()\n\n // Protect docs HTML, static assets, and webhook feeds with IP guard (if any) + auth guard.\n ;[docsPath, `${docsPath}/assets`, `__rrroutes/`].forEach((p) => {\n if (ipGuard) router.use(p, ipGuard)\n router.use(p, authGuard)\n })\n\n router.use(\n `${docsPath}/assets`,\n expressStatic(assetsDir, { immutable: true, maxAge: '365d' }),\n )\n\n const docsRoutePaths = [docsPath, `${docsPath}/`, `${docsPath}/*id`]\n\n router.get(docsRoutePaths, (_req, res) => {\n const nonce = cspEnabled ? randomBytes(16).toString('base64') : undefined\n\n const html = renderLeafDocsHTML({\n cspNonce: nonce,\n assetBasePath: `${docsPath}/assets`,\n docsBasePath: `${docsPath}`,\n theme,\n })\n\n applyDocsSecurityHeaders(res)\n\n if (cspEnabled && nonce) {\n res.setHeader(\n 'Content-Security-Policy',\n [\n \"default-src 'self'\",\n `script-src 'self' 'nonce-${nonce}'`,\n `style-src 'self' 'nonce-${nonce}'`,\n \"img-src 'self' data:\",\n \"connect-src 'self'\",\n \"font-src 'self'\",\n \"frame-ancestors 'self'\",\n \"object-src 'none'\",\n \"base-uri 'self'\",\n ].join('; '),\n )\n }\n\n res.send(html)\n })\n\n return docsPath\n}\n\nexport { renderLeafDocsHTML } from './docs/docs.js'\nexport { introspectSchema } from './docs/schemaIntrospection.js'\nexport { serializeLeaf } from './docs/serializer.js'\nexport type { SerializedLeaf as SerializableLeaf } from './docs/serializer.js'\nexport { leaves as requiredRoutes } from './web/utils/types.js'\n\nexport type {\n CacheLogsFilter as RRRCacheLogsFilter,\n CacheLogType as RRRCacheLogType,\n CacheTraceQuery as RRRCacheTraceQuery,\n CacheTraceType as RRRCacheTraceType,\n} from './web/v2/types/types.cacheLog.js'\nexport type {\n EndpointDetailData as RRREndpointDetailData,\n RoutesFilter as RRREndpointFilter,\n EndpointType as RRREndpointType,\n} from './web/v2/types/types.endpoint.js'\nexport type {\n ApplicationLogsFilter as RRRLogFilter,\n LogType as RRRLogType,\n} from './web/v2/types/types.log.js'\nexport type {\n PresetsFilter as RRRPresetsFilter,\n PresetType as RRRPresetType,\n} from './web/v2/types/types.preset.js'\nexport type {\n HistoryFilter as RRRRequestLogFilter,\n RequestLogType as RRRRequestLogType,\n} from './web/v2/types/types.requestLog.js'\nexport type {\n SocketEmitBody as RRRSocketEmitBody,\n SocketEmitResult as RRRSocketEmitResult,\n SocketEventsFilter as RRRSocketEventsFilter,\n SocketEventType as RRRSocketEventType,\n} from './web/v2/types/types.socket.js'\n\nexport type {\n SchedulableHandlerType as RRRSchedulableHandlerType,\n SchedulingFilter as RRRSchedulingQuery,\n SchedulingType as RRRSchedulingType,\n} from './web/v2/types/types.scheduling.js'\n","// LeafDocsPage.tsx\n\nimport type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract'\nimport type { ReactElement } from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { serializeLeaf } from './serializer.js'\n\nexport type DocsThemeConfig = Partial<{\n bg: string\n surface: string\n primary: string\n secondary: string\n success: string\n warning: string\n error: string\n textPrimary: string\n}>\n\nexport interface RenderOptions {\n /** CSP nonce applied to data + script tags. */\n cspNonce?: string\n /** Base URL where static assets are served (e.g. `/__rrroutes/docs/assets`). */\n assetBasePath?: string\n /** Root path where the docs are mounted (e.g. `/__rrroutes/docs`). Used for client routing. */\n docsBasePath?: string\n /**\n * Optional theme seed overrides passed to the client.\n * If omitted, the client uses its built-in default docs theme.\n */\n theme?: DocsThemeConfig\n}\n\nconst DEFAULT_ASSET_BASE = '/__rrroutes/docs/assets'\n\nfunction normalizeBase(base: string) {\n if (!base) return DEFAULT_ASSET_BASE\n return base.endsWith('/') ? base.slice(0, -1) : base\n}\n\nfunction normalizeDocsBase(base: string | undefined) {\n if (!base) return ''\n if (base === '/') return '/'\n return base.endsWith('/') && base.length > 1 ? base.slice(0, -1) : base\n}\n\nfunction normalizeBaseUrlSuffix(suffix: string | undefined) {\n if (!suffix) return ''\n const trimmed =\n suffix.endsWith('/') && suffix.length > 1 ? suffix.slice(0, -1) : suffix\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\ntype DocsDocumentProps = {\n assetBase: string\n docsBase: string\n cspNonce?: string\n theme?: DocsThemeConfig\n}\n\nexport const DocsDocument = ({\n assetBase,\n docsBase,\n cspNonce,\n theme,\n}: DocsDocumentProps) => {\n const cssHref = `${assetBase}/docs.css`\n const jsSrc = `${assetBase}/docs.js`\n\n const configJson = serializeConfig({\n docsBasePath: docsBase,\n cspNonce,\n theme,\n })\n\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>API Reference</title>\n <link rel=\"stylesheet\" href={cssHref} />\n </head>\n <body>\n <div id=\"docs-root\"></div>\n <script\n id=\"docs-config\"\n type=\"application/json\"\n nonce={cspNonce}\n dangerouslySetInnerHTML={{ __html: configJson }}\n />\n <script type=\"module\" src={jsSrc} nonce={cspNonce} />\n </body>\n </html>\n )\n}\n\nfunction serializeLeaves(leaves: AnyLeafLowProfile[]) {\n return JSON.stringify(leaves.map(serializeLeaf)).replace(/<\\//g, '<\\\\/')\n}\n\ntype DocsConfig = {\n docsBasePath: string\n baseUrlSuffix?: string\n cspNonce?: string\n theme?: DocsThemeConfig\n}\n\nfunction serializeConfig(config: DocsConfig) {\n return JSON.stringify(config).replace(/<\\//g, '<\\\\/')\n}\n\nexport function createLeafDocsDocument(\n options: RenderOptions = {},\n): ReactElement {\n const assetBase = normalizeBase(options.assetBasePath ?? DEFAULT_ASSET_BASE)\n const docsBase = normalizeDocsBase(options.docsBasePath)\n\n return (\n <DocsDocument\n assetBase={assetBase}\n docsBase={docsBase}\n cspNonce={options.cspNonce}\n theme={options.theme}\n />\n )\n}\n\nexport function renderLeafDocsHTML(options: RenderOptions = {}): string {\n const doc = createLeafDocsDocument(options)\n const html = renderToStaticMarkup(doc)\n return `<!DOCTYPE html>${html}`\n}\n\nexport type SerializableHistoryEntry = {\n id?: string\n timestamp: number\n method: string\n path: string\n fullUrl: string\n params?: Record<string, string>\n query?: Record<string, string>\n body?: string\n output?: string\n status?: number\n durationMs: number\n error?: string\n}\n","// serializer.ts\nimport {\n MethodCfgLowProfile,\n routeSchemaParse,\n type AnyLeafLowProfile,\n} from '@emeryld/rrroutes-contract'\nimport { MethodType } from '../web/v2/types/types.base.js'\nimport type { EndpointType } from '../web/v2/types/types.endpoint.js'\nimport { introspectSchema } from './schemaIntrospection.js'\n\nexport type SerializedLeaf = EndpointType\n\nexport type { SerializableSchemaNode } from './schemaIntrospection.js'\n\nexport function serializeLeaf(leaf: AnyLeafLowProfile): EndpointType {\n const cfg = leaf.cfg\n\n const tags = Array.isArray(cfg.tags) ? cfg.tags.slice() : []\n const stability = (cfg.stability ??\n 'experimental') as EndpointType['stability']\n const now = Date.now()\n\n return {\n id: buildLeafId(leaf),\n name: inferName(cfg, leaf.path),\n description: cfg.description,\n groupId: cfg.docsGroup,\n tags: tags.length > 0 ? tags : undefined,\n createdAt: now,\n updatedAt: now,\n method: leaf.method as MethodType,\n path: leaf.path,\n contract: {\n body: serializeContractSchema(cfg.bodySchema),\n query: serializeContractSchema(cfg.querySchema),\n params: serializeContractSchema(cfg.paramsSchema),\n output: serializeContractSchema(cfg.outputSchema),\n bodyFiles: serializeBodyFiles(cfg),\n },\n feed: cfg.feed ?? undefined,\n summary: cfg.summary,\n stability,\n hidden: cfg.docsHidden,\n meta: serializeMeta(cfg.docsMeta),\n }\n}\n\nfunction serializeContractSchema(schema: MethodCfgLowProfile['bodySchema']) {\n return schema ? introspectSchema(routeSchemaParse(schema)) : undefined\n}\n\nfunction serializeBodyFiles(cfg: MethodCfgLowProfile) {\n if (!Array.isArray(cfg.bodyFiles) || cfg.bodyFiles.length === 0)\n return undefined\n return cfg.bodyFiles.map(({ name, maxCount }) => ({ name, maxCount }))\n}\n\nfunction serializeMeta(meta?: Record<string, unknown>): Record<string, string> {\n if (!meta) return {}\n const entries = Object.entries(meta)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => [\n key,\n typeof value === 'string' ? value : JSON.stringify(value),\n ])\n return Object.fromEntries(entries)\n}\n\nfunction buildLeafId(leaf: AnyLeafLowProfile) {\n return `${leaf.method.toUpperCase()} ${leaf.path}`\n}\n\nfunction inferName(cfg: MethodCfgLowProfile, path: string) {\n return cfg.summary || cfg.description || path\n}\n","// schemaIntrospection.ts\nimport * as z from 'zod'\nimport type { SerializableSchema } from '../web/v2/types/types.endpoint.js'\n\nexport type SerializableSchemaNode = SerializableSchema\n\ntype ZodAny = z.ZodTypeAny\n\n/**\n * Zod 3 uses `schema._def`, Zod 4 uses `schema._zod.def`.\n */\nfunction getDef(schema: unknown): any | undefined {\n if (!schema || typeof schema !== 'object') return undefined\n const anySchema = schema as any\n return anySchema._zod?.def ?? anySchema._def\n}\n\n/**\n * Try to get a human-readable description.\n * Zod 4: use metadata/registry; fallback to internal def.description.\n * Zod 3: only internal def.description exists.\n */\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\n // Zod 4 global registry metadata, if present\n const registry = anyZ.globalRegistry?.get\n ? anyZ.globalRegistry.get(schema)\n : undefined\n if (registry && typeof registry.description === 'string') {\n return registry.description\n }\n\n // Legacy / internal description\n const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\n\n/**\n * Peel off wrappers (effects, optional, nullable, default) and\n * return the inner schema + flags.\n *\n * Supports:\n * - Zod 3: ZodEffects, ZodOptional, ZodNullable, ZodDefault\n * - Zod 4: ZodOptional, ZodNullable, ZodDefault\n */\nfunction unwrap(schema: ZodAny): {\n base: ZodAny\n optional: boolean\n nullable: boolean\n} {\n let s: ZodAny = schema\n let optional = false\n let nullable = false\n\n // Zod 3 only (undefined in Zod 4)\n const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Zod 3: ZodEffects wrapper\n if (ZodEffectsCtor && s instanceof ZodEffectsCtor) {\n const def = getDef(s) || {}\n const sourceType =\n typeof (s as any).sourceType === 'function'\n ? (s as any).sourceType()\n : def.schema\n if (!sourceType) break\n s = sourceType\n continue\n }\n\n // Zod 3 + 4: optional/nullable/default wrappers\n if (s instanceof z.ZodOptional) {\n optional = true\n const def = getDef(s)\n s = (def && def.innerType) || s // innerType exists in both 3 & 4\n continue\n }\n\n if (s instanceof z.ZodNullable) {\n nullable = true\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n if (s instanceof z.ZodDefault) {\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n break\n }\n\n return { base: s, optional, nullable }\n}\n\nexport function introspectSchema(\n schema: ZodAny | undefined,\n): SerializableSchema | undefined {\n if (!schema) return undefined\n\n const { base, optional, nullable } = unwrap(schema)\n const def = getDef(base)\n\n const node: SerializableSchema = {\n kind: inferKind(base),\n optional: optional || undefined,\n nullable: nullable || undefined,\n description: getDescription(base),\n }\n\n // OBJECT\n if (base instanceof z.ZodObject) {\n // Zod 3: _def.shape() (function)\n // Zod 4: .shape getter returns an object\n const rawShape: any =\n (base as any).shape ??\n (def && typeof def.shape === 'function' ? def.shape() : def?.shape)\n\n const shape = typeof rawShape === 'function' ? rawShape() : (rawShape ?? {})\n\n const props: Record<string, SerializableSchema> = {}\n for (const key of Object.keys(shape)) {\n const child = shape[key] as ZodAny\n const childNode = introspectSchema(child)\n if (childNode) props[key] = childNode\n }\n node.properties = props\n }\n\n // ARRAY\n if (base instanceof z.ZodArray) {\n // Zod 3: def.type is inner schema\n // Zod 4: def.element is inner schema\n const inner =\n (def && (def.element as ZodAny)) ||\n (def && (def.type as ZodAny)) ||\n undefined\n if (inner) {\n node.element = introspectSchema(inner)\n }\n }\n\n // UNION\n if (base instanceof z.ZodUnion) {\n const options: ZodAny[] = (def && def.options) || []\n node.union = options\n .map((opt) => introspectSchema(opt))\n .filter(Boolean) as SerializableSchema[]\n }\n\n // EXTENSION\n if (base instanceof z.ZodIntersection) {\n const left: ZodAny = (def && def.left) || undefined\n const right: ZodAny = (def && def.right) || undefined\n if (left && right) {\n node.properties = {\n left: introspectSchema(left) as SerializableSchema,\n right: introspectSchema(right) as SerializableSchema,\n }\n }\n }\n\n // LITERAL\n if (base instanceof z.ZodLiteral) {\n if (def) {\n // Zod 4: def.values (multi-literal)\n if (Array.isArray(def.values)) {\n node.literal =\n def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\n // Zod 3: def.value\n node.literal = def.value\n }\n }\n }\n\n // ENUM\n if (base instanceof z.ZodEnum) {\n if (def) {\n if (Array.isArray(def.values)) {\n // Zod 3\n node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\n // Zod 4: entries is a { key: value } map\n node.enumValues = Object.values(def.entries).map((v: unknown) =>\n String(v),\n )\n }\n }\n }\n\n return node\n}\n\nfunction inferKind(schema: ZodAny): SerializableSchema['kind'] {\n // This path still uses instanceof; it works with Zod 4 Classic\n // (importing from \"zod\"). Anything unknown falls back to \"unknown\".\n if (schema instanceof z.ZodString) return 'string'\n if (schema instanceof z.ZodNumber) return 'number'\n if (schema instanceof z.ZodBoolean) return 'boolean'\n if (schema instanceof z.ZodBigInt) return 'bigint'\n if (schema instanceof z.ZodDate) return 'date'\n if (schema instanceof z.ZodArray) return 'array'\n if (schema instanceof z.ZodObject) return 'object'\n if (schema instanceof z.ZodUnion) return 'union'\n if (schema instanceof z.ZodLiteral) return 'literal'\n if (schema instanceof z.ZodEnum) return 'enum'\n if (schema instanceof z.ZodRecord) return 'record'\n if (schema instanceof z.ZodTuple) return 'tuple'\n if (schema instanceof z.ZodUnknown) return 'unknown'\n if (schema instanceof z.ZodAny) return 'any'\n\n return 'unknown'\n}\n","// renderLeafDocsHTML.ts\nimport {\n renderLeafDocsHTML as LeafDocsPage,\n RenderOptions,\n} from './LeafDocsPage.js'\n\nexport function renderLeafDocsHTML(options: RenderOptions = {}): string {\n return LeafDocsPage(options)\n}\n\nexport { createLeafDocsDocument } from './LeafDocsPage.js'\nexport type { RenderOptions } from './LeafDocsPage.js'\n","import type { Request, RequestHandler, Response } from 'express'\nimport net from 'node:net'\n\n/**\n * HTTP Basic password guard.\n */\nexport function createPasswordGuard(\n password: string,\n realm: string,\n): RequestHandler {\n const trimmed = password.trim()\n return (req: Request, res: Response, next: () => void) => {\n const provided = extractPassword(req.headers.authorization)\n if (provided && provided === trimmed) {\n return next()\n }\n applyDocsSecurityHeaders(res)\n res.setHeader('WWW-Authenticate', `Basic realm=\"${realm}\"`)\n res\n .status(401)\n .send(\n renderAuthErrorPage(\n 'Docs are password protected. Provide the configured password.',\n ),\n )\n }\n}\n/**\n * Cookie-based guard. Requires `req.cookies` to be populated\n * (e.g. via `cookie-parser`).\n */\nexport function createCookieGuard(\n cookieName: string,\n cookieSecret?: string,\n): RequestHandler {\n return (req: Request, res: Response, next: () => void) => {\n const cookies = (req as any).cookies as Record<string, string> | undefined\n const value = cookies?.[cookieName]\n\n const valid = cookieSecret ? value === cookieSecret : Boolean(value)\n\n if (valid) {\n return next()\n }\n\n applyDocsSecurityHeaders(res)\n res\n .status(401)\n .send(\n renderAuthErrorPage(\n 'Docs are protected. You must be authenticated to access this page.',\n ),\n )\n }\n}\n/**\n * When auth is enabled but no password/cookie/custom guard is provided,\n * fail closed.\n */\nexport function createMissingPasswordGuard(): RequestHandler {\n return (_req: Request, res: Response) => {\n applyDocsSecurityHeaders(res)\n res\n .status(500)\n .send(renderAuthErrorPage('Provide auth configuration to mounted docs'))\n }\n}\n/**\n * Extract password from HTTP Basic Authorization header.\n */\nfunction extractPassword(authHeader: string | string[] | undefined) {\n if (!authHeader) return undefined\n const header = Array.isArray(authHeader) ? authHeader[0] : authHeader\n if (typeof header !== 'string' || !header.startsWith('Basic '))\n return undefined\n const token = header.slice('Basic '.length)\n try {\n const decoded = Buffer.from(token, 'base64').toString('utf8')\n const parts = decoded.split(':')\n parts.shift() // username\n return parts.join(':')\n } catch {\n return undefined\n }\n}\n/**\n * Simple IP allow-list guard. For accurate client IPs behind proxies,\n * configure `app.set('trust proxy', true)` in your Express app.\n */\nexport function createIpAllowListGuard(allowed: string[]): RequestHandler {\n const ranges = allowed\n .map((raw) => raw.trim())\n .filter(Boolean)\n .map(parseIpPattern)\n .filter((r): r is IpRange => r !== null)\n\n return (req: Request, res: Response, next: () => void) => {\n const rawIp =\n req.ip || (req.connection && (req.connection as any).remoteAddress) || ''\n const ip = normalizeIp(rawIp)\n\n if (!ip || !isIpAllowed(ip, ranges)) {\n applyDocsSecurityHeaders(res)\n res\n .status(403)\n .send(\n renderAuthErrorPage(\n 'Access to docs is restricted from this IP address.',\n ),\n )\n return\n }\n\n next()\n }\n}\ntype IpRange =\n | { kind: 'exact'; value: string }\n | { kind: 'cidr'; base: number; mask: number }\n/**\n * Normalize typical Express IP formats, including IPv4-mapped IPv6.\n */\nfunction normalizeIp(ip: string): string {\n if (!ip) return ''\n if (ip.startsWith('::ffff:')) return ip.slice(7)\n if (ip === '::1') return '127.0.0.1'\n return ip\n}\nfunction parseIpPattern(raw: string): IpRange | null {\n if (raw.includes('/')) {\n const cidr = parseCidr(raw)\n if (!cidr) return null\n return { kind: 'cidr', base: cidr.base, mask: cidr.mask }\n }\n\n // Exact string match (IPv4 or IPv6).\n return { kind: 'exact', value: normalizeIp(raw) }\n}\nfunction parseCidr(raw: string): { base: number; mask: number } | null {\n const [baseIp, bitsStr] = raw.split('/')\n const bits = Number(bitsStr)\n if (!Number.isInteger(bits) || bits < 0 || bits > 32) return null\n if (net.isIP(baseIp) !== 4) return null // IPv4 CIDR only for simplicity\n\n const baseLong = ipToLong(baseIp)\n if (baseLong == null) return null\n\n const mask = bits === 0 ? 0 : (~0 << (32 - bits)) >>> 0\n return { base: (baseLong & mask) >>> 0, mask }\n}\nfunction ipToLong(ip: string): number | null {\n const parts = ip.split('.').map((n) => Number(n))\n if (parts.length !== 4) return null\n if (parts.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) return null\n return (\n ((parts[0] << 24) >>> 0) +\n ((parts[1] << 16) >>> 0) +\n ((parts[2] << 8) >>> 0) +\n parts[3]\n )\n}\nfunction isIpAllowed(ip: string, ranges: IpRange[]): boolean {\n const ipv4 = net.isIP(ip) === 4 ? ipToLong(ip) : null\n\n for (const r of ranges) {\n if (r.kind === 'exact') {\n if (ip === r.value) return true\n } else if (r.kind === 'cidr' && ipv4 != null) {\n if ((ipv4 & r.mask) === r.base) return true\n }\n }\n\n return false\n}\nfunction renderAuthErrorPage(message: string) {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>RRRoutes docs locked</title>\n <style>\n body { margin:0; font-family: system-ui, -apple-system, Segoe UI, sans-serif; background: #0f172a; color: #e2e8f0; display:flex; align-items:center; justify-content:center; min-height:100vh; }\n .card { padding:32px; border:1px solid #1e293b; border-radius:12px; max-width:420px; background: rgba(15,23,42,0.8); box-shadow:0 15px 45px rgba(0,0,0,0.35); }\n h1 { margin:0 0 12px; font-size:22px; }\n p { margin:0; line-height:1.5; color:#cbd5e1; }\n code { background: rgba(226,232,240,0.1); padding: 2px 4px; border-radius: 4px; }\n </style>\n</head>\n<body>\n <div class=\"card\">\n <h1>Docs locked</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\nexport function applyDocsSecurityHeaders(res: Response) {\n res.setHeader('X-Content-Type-Options', 'nosniff')\n res.setHeader('Referrer-Policy', 'same-origin')\n res.setHeader('X-Frame-Options', 'SAMEORIGIN')\n res.setHeader('Cache-Control', 'no-store')\n res.setHeader(\n 'Strict-Transport-Security',\n 'max-age=31536000; includeSubDomains',\n )\n}\n","import {\n FinalizedRegistry,\n MergeAugmentedCollections,\n finalize,\n resource,\n} from '@emeryld/rrroutes-contract'\nimport { cacheLeaves } from './types.cacheLog.js'\nimport { endpointLeaves } from './types.endpoint.js'\nimport { logLeaves } from './types.log.js'\nimport { presetLeaves } from './types.preset.js'\nimport { requestLogLeaves } from './types.requestLog.js'\nimport { schedulingLeaves } from './types.scheduling.js'\nimport { socketLeaves } from './types.socket.js'\n\ntype AllLeaves = readonly [\n ...MergeAugmentedCollections<\n '',\n undefined,\n readonly [\n MergeAugmentedCollections<\n '/__rrroutes',\n undefined,\n readonly [\n typeof endpointLeaves,\n typeof requestLogLeaves,\n typeof logLeaves,\n typeof cacheLeaves,\n typeof presetLeaves,\n typeof socketLeaves,\n typeof schedulingLeaves,\n ]\n >,\n ]\n >,\n]\n\nconst allLeaves: AllLeaves = resource()\n .sub(\n resource('/__rrroutes')\n .sub(\n endpointLeaves,\n requestLogLeaves,\n logLeaves,\n cacheLeaves,\n presetLeaves,\n socketLeaves,\n schedulingLeaves,\n )\n .done(),\n )\n .done()\n\nexport const leaves: FinalizedRegistry<typeof allLeaves> = finalize(allLeaves)\n","// types.cacheLog.ts\n\nimport { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n paginationSchema,\n} from './types.base'\n\nexport const CACHE_OPERATIONS = ['hit', 'miss', 'set', 'delete'] as const\nexport type CacheOperation = (typeof CACHE_OPERATIONS)[number]\n\nconst operationEnum = z.enum(CACHE_OPERATIONS)\n\nexport const cacheTraceSchema = z.object({\n id: z.string(),\n timestamp: z.number(),\n operation: operationEnum,\n key: z.string(),\n size: z.number().optional(),\n durationMs: z.number().optional(),\n groupId: z.string().optional(),\n type: z.string().optional(), // 'redis', 'dataloader', etc.\n})\n\nexport type CacheTraceType = z.infer<typeof cacheTraceSchema>\n\nexport const cacheTraceQuerySchema = baseQuerySchema\n\nexport type CacheTraceQuery = z.infer<typeof cacheTraceQuerySchema>\n\nexport const cacheLogSchema = baseEntitySchema.extend({\n value: z.any().nullable(),\n size: z.number().optional(),\n setAt: z.number().optional(),\n ttlMs: z.number().optional(),\n})\n\nexport type CacheLogType = z.infer<typeof cacheLogSchema>\n\nexport const cacheLogQuerySchema = baseQuerySchema.extend({\n keysInclude: z.array(z.string()).optional(),\n keysExclude: z.array(z.string()).optional(),\n})\n\nexport type CacheLogsFilter = z.infer<typeof cacheLogQuerySchema> &\n z.infer<typeof paginationSchema>\n//\n// Leaves\n//\nexport const cacheLeaves = resource('cache')\n /**\n * Existing logs feed endpoint.\n */\n .get({\n feed: true,\n outputSchema: cacheLogSchema.array(),\n querySchema: cacheLogQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .sub(\n resource(':cacheKey', {}, z.string())\n .get({\n feed: true,\n outputSchema: cacheTraceSchema.array(),\n queryExtensionSchema: paginationSchema,\n querySchema: cacheTraceQuerySchema,\n outputMetaSchema: feedMeta,\n })\n .done(),\n resource('clear')\n .post({\n outputSchema: z.object({ success: z.boolean() }),\n querySchema: cacheLogQuerySchema,\n })\n .done(),\n )\n .done()\n","import z from 'zod'\n\nexport const METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const\nexport type MethodType = (typeof METHODS)[number]\nexport const methodSchema = z.enum(METHODS)\n\nexport const baseEntitySchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n groupId: z.string().optional(),\n tags: z.string().array().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n})\n\nexport const baseQuerySchema = z.object({\n beforeDate: z.string().optional(),\n afterDate: z.string().optional(),\n orderBy: z.string().optional(),\n orderDirection: z.enum(['asc', 'desc']).optional(),\n searchQuery: z.string().optional(),\n groupsInclude: z.string().array().optional(),\n groupsExclude: z.string().array().optional(),\n tagsInclude: z.string().array().optional(),\n tagsExclude: z.string().array().optional(),\n})\n\nexport const paginationSchema = z.object({\n cursor: z.string().optional(),\n pageSize: z.coerce.number().optional(),\n})\n\nexport const feedMeta = z.object({\n totalCount: z.number().optional(),\n nextCursor: z.string().optional(),\n})\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z, { ZodType } from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n methodSchema,\n paginationSchema,\n} from './types.base'\nimport { requestSchema } from './types.requestLog'\n\nexport const nodeKind = [\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'date',\n 'array',\n 'enum',\n 'literal',\n 'union',\n 'record',\n 'tuple',\n 'unknown',\n 'any',\n] as const\n\nexport type SerializableSchema = {\n kind: (typeof nodeKind)[number]\n optional?: boolean\n nullable?: boolean\n description?: string\n\n // object\n properties?: Record<string, SerializableSchema>\n // array\n element?: SerializableSchema\n // union\n union?: SerializableSchema[]\n // literal\n literal?: unknown\n // enum\n enumValues?: string[]\n}\n\n// The Zod schema\nexport const serializableSchemaSchema: ZodType<\n SerializableSchema,\n SerializableSchema\n> = z.lazy(() =>\n z.object({\n kind: z.enum(nodeKind),\n\n optional: z.boolean().optional(),\n nullable: z.boolean().optional(),\n description: z.string().optional(),\n\n // object\n properties: z\n .record(z.string(), serializableSchemaSchema) // Record<string, SerializableSchemaNode>\n .optional(),\n\n // array\n element: serializableSchemaSchema.optional(),\n\n // union\n union: z.array(serializableSchemaSchema).optional(),\n\n // literal\n literal: z.unknown().optional(),\n\n // enum\n enumValues: z.array(z.string()).optional(),\n }),\n)\n\nexport const STABILITIES = [\n 'experimental',\n 'beta',\n 'stable',\n 'deprecated',\n 'unknown',\n] as const\nconst stabilityEnum = z.enum(STABILITIES)\nexport const endpointSchema = baseEntitySchema.extend({\n method: methodSchema,\n path: z.string(),\n contract: z.object({\n body: serializableSchemaSchema.optional(),\n query: serializableSchemaSchema.optional(),\n output: serializableSchemaSchema.optional(),\n params: serializableSchemaSchema.optional(),\n bodyFiles: z\n .array(z.object({ name: z.string(), maxCount: z.number() }))\n .optional(),\n }),\n feed: z.boolean().optional(),\n summary: z.string().optional(),\n stability: stabilityEnum,\n hidden: z.boolean().optional(),\n meta: z.record(z.string(), z.string()),\n implemented: z.boolean().optional(),\n})\n\nexport type EndpointType = z.output<typeof endpointSchema>\n\nexport const endpointFilterSchema = baseQuerySchema.extend({\n methodsInclude: methodSchema.array().optional(),\n methodsExclude: methodSchema.array().optional(),\n path: z.string().optional(),\n stabilityInclude: stabilityEnum.array().optional(),\n stabilityExclude: stabilityEnum.array().optional(),\n})\n\nexport type RoutesFilter = z.infer<typeof endpointFilterSchema> &\n z.infer<typeof paginationSchema>\n\nexport const endpointSchemaWithStats = endpointSchema.extend({\n // Related by groupId. Just use the existing feed endpoints with filter: groupId=?\n requests: z.array(requestSchema),\n // Summary stats: return with the feed?\n volumeTS: z.array(\n z.object({\n timestamp: z.number(),\n count: z.number(),\n }),\n ),\n averageDurationMs: z.number(),\n successRate: z.number(),\n // Add id as query param to the existing feed endpoints? This way \"requests\" field can also be only Ids\n latestErrors: z.array(requestSchema).optional(),\n})\n\nexport type EndpointDetailData = z.infer<typeof endpointSchemaWithStats>\nexport const endpointLeaves = resource('endpoints')\n .get({\n feed: true,\n querySchema: endpointFilterSchema,\n outputSchema: endpointSchema.array(),\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .sub(\n resource(':endpointId', undefined, z.string())\n .get({\n outputSchema: endpointSchemaWithStats,\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n methodSchema,\n paginationSchema,\n} from './types.base'\nimport { cacheTraceSchema } from './types.cacheLog'\nimport { logSchema } from './types.log'\n\nexport const requestSchema = baseEntitySchema.extend({\n status: z.number(),\n body: z.any().optional(),\n fullUrl: z.string(),\n path: z.string(),\n method: methodSchema,\n query: z.record(z.string(), z.any()).optional(),\n params: z.record(z.string(), z.any()).optional(),\n output: z.any().optional(),\n headers: z.record(z.string(), z.any()).optional(),\n error: z.string().optional(),\n durationMs: z.number(),\n ip: z.string().optional(),\n userAgent: z.string().optional(),\n requestSize: z.number().optional(),\n responseSize: z.number().optional(),\n})\n\nexport type RequestLogType = z.infer<typeof requestSchema>\n\nexport const requestQuerySchema = baseQuerySchema.extend({\n methodsInclude: methodSchema.array().optional(),\n methodsExclude: methodSchema.array().optional(),\n statusesInclude: z.coerce.number().array().optional(),\n statusesExclude: z.coerce.number().array().optional(),\n path: z.string().optional(),\n endpointKeysInclude: z.string().array().optional(),\n endpointKeysExclude: z.string().array().optional(),\n})\n\nexport type HistoryFilter = z.infer<typeof requestQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const requestLogLeaves = resource('requests')\n .get({\n feed: true,\n outputSchema: requestSchema.array(),\n querySchema: requestQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .sub(\n resource(':requestId', undefined, z.string())\n .get({\n outputSchema: requestSchema.extend({\n // Related by groupId\n // Do I just use the existing feed endpoints with filter: groupId=?\n logs: z.array(logSchema),\n caches: z.array(cacheTraceSchema),\n }),\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n paginationSchema,\n} from './types.base'\n\nconst levelSchema = z.string()\nexport const logSchema = baseEntitySchema.extend({\n level: levelSchema,\n meta: z.any().optional(),\n})\n\nexport type LogType = z.infer<typeof logSchema>\nexport const logQuerySchema = baseQuerySchema.extend({\n levelsInclude: levelSchema.array().optional(),\n levelsExclude: levelSchema.array().optional(),\n})\n\nexport type ApplicationLogsFilter = z.infer<typeof logQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const logLeaves = resource('logs')\n .get({\n feed: true,\n outputSchema: logSchema.array(),\n querySchema: logQuerySchema,\n outputMetaSchema: feedMeta.extend({\n levels: levelSchema.array().optional(),\n }),\n queryExtensionSchema: paginationSchema,\n })\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n methodSchema,\n paginationSchema,\n} from './types.base'\n\nconst presetSchema = baseEntitySchema.extend({\n operations: z.array(\n z.object({\n name: z.string(),\n description: z.string().optional(),\n stepNumber: z.number(),\n endpointId: z.string().optional(),\n method: methodSchema,\n path: z.string(),\n body: z.json().optional(),\n extraHeaders: z.record(z.string(), z.any()).optional(),\n query: z.record(z.string(), z.any()).optional(),\n }),\n ),\n})\nexport type PresetType = z.infer<typeof presetSchema>\n\nconst presetQuerySchema = baseQuerySchema.extend({\n nameInclude: z.string().optional(),\n nameExclude: z.string().optional(),\n})\nexport type PresetsFilter = z.infer<typeof presetQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const presetLeaves = resource('presets')\n .get({\n feed: true,\n querySchema: presetQuerySchema,\n outputMetaSchema: feedMeta,\n outputSchema: presetSchema.array(),\n queryExtensionSchema: paginationSchema,\n })\n .post({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .put({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .done()\n","// types.cacheLog.ts\n\nimport { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n paginationSchema,\n} from './types.base'\n\nexport const schedulingSchema = baseEntitySchema.extend({\n scheduledAt: z.number().optional(),\n startedAt: z.number().optional(),\n completedAt: z.number().optional(),\n status: z.string(),\n})\n\nexport const schedulingQuerySchema = baseQuerySchema.extend({\n status: z.string().array().optional(),\n})\n\nexport type SchedulingType = z.infer<typeof schedulingSchema>\nexport type SchedulingFilter = z.infer<typeof schedulingQuerySchema>\n\nexport const schedulableHandler = z.object({\n name: z.string(),\n payload: z.string(),\n})\n\nexport type SchedulableHandlerType = z.infer<typeof schedulableHandler>\n\n//\n// Leaves\n//\nexport const schedulingLeaves = resource('schedulings')\n .get({\n feed: true,\n outputSchema: schedulingSchema.array(),\n querySchema: schedulingQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .sub(\n resource('handlers')\n .get({\n feed: true,\n outputSchema: schedulableHandler.array(),\n querySchema: z.object({ name: z.string().optional() }),\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\n\nimport {\n baseEntitySchema,\n baseQuerySchema,\n feedMeta,\n paginationSchema,\n} from './types.base.js'\n\n//\n// Entity schema – logged socket event\n//\nexport const socketEventDirectionSchema = z.enum([\n 'incoming', // client -> server\n 'outgoing', // server -> single socket\n 'outgoing-broadcast', // server -> rooms / multiple sockets\n])\n\nexport const socketEventSchema = baseEntitySchema.extend({\n // event name\n name: z.string(),\n\n // arbitrary payload\n message: z.any().optional(),\n\n // \"server\" or socket id\n origin: z.union([z.literal('server'), z.string()]),\n\n // \"incoming\" | \"outgoing\" | \"broadcast\"\n direction: z.enum(['incoming', 'outgoing', 'broadcast']),\n // for incoming/outgoing direct events\n socketId: z.string().optional(),\n\n // for broadcast events\n rooms: z.array(z.string()).optional(),\n except: z.array(z.string()).optional(),\n})\n\nexport type SocketEventType = z.infer<typeof socketEventSchema>\n\n//\n// Query schema – filters for the socket events feed\n//\n\nexport const socketEventQuerySchema = baseQuerySchema.extend({\n // Exact event name match (single value for now)\n eventName: z.string().optional(),\n roomsInclude: z.array(z.string()).optional(),\n roomsExclude: z.array(z.string()).optional(),\n})\n\nexport type SocketEventsFilter = z.infer<typeof socketEventQuerySchema> &\n z.infer<typeof paginationSchema>\n\n//\n// POST body – emit a socket event\n//\n\nexport const socketEmitSchema = z.object({\n eventName: z.string(),\n // JSON payload for the event\n message: z.json().optional(),\n // Target room IDs. Use null for broadcast.\n toRoomId: z.array(z.string()).nullable(),\n})\n\nexport type SocketEmitBody = z.infer<typeof socketEmitSchema>\n\n//\n// POST response – result of emitting an event\n//\n\nexport const socketEmitResultSchema = z.object({\n success: z.boolean(),\n eventId: z.string().optional(),\n})\n\nexport type SocketEmitResult = z.infer<typeof socketEmitResultSchema>\n\n//\n// Leaves – GET feed + POST emit\n//\n\nexport const socketLeaves = resource('sockets')\n .get({\n feed: true,\n outputSchema: socketEventSchema.array(),\n querySchema: socketEventQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\n })\n .post({\n bodySchema: socketEmitSchema,\n outputSchema: socketEmitResultSchema,\n })\n .done()\n"],"mappings":"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","names":["path","renderLeafDocsHTML","resource","z","z","z","resource","z","resource","z","resource","z","z","resource","z","resource","z","resource","resource","z","z","resource","resource","z","z","resource","resource","z","z","resource","resource","renderLeafDocsHTML"]}