@emeryld/rrroutes-openapi 2.6.2 → 2.6.3

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 (79) hide show
  1. package/dist/index.cjs +1 -0
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.mjs +1 -0
  4. package/dist/index.mjs.map +1 -1
  5. package/dist/public/assets/Add.js +1 -0
  6. package/dist/public/assets/Autocomplete.js +1 -0
  7. package/dist/public/assets/BaseFilterBar.js +1 -0
  8. package/dist/public/assets/BentoGrid.js +1 -0
  9. package/dist/public/assets/CacheLogsPage.js +1 -0
  10. package/dist/public/assets/DeleteOutline.js +1 -0
  11. package/dist/public/assets/DiffPage.js +7 -0
  12. package/dist/public/assets/Download.js +1 -0
  13. package/dist/public/assets/EndpointDetailPage.js +1 -0
  14. package/dist/public/assets/EndpointDetailPanel.js +1 -0
  15. package/dist/public/assets/EndpointPlaygroundPage.js +1 -0
  16. package/dist/public/assets/ExpandLess.js +1 -0
  17. package/dist/public/assets/ExportButton.js +2 -0
  18. package/dist/public/assets/FlowBuilderPage.js +20 -0
  19. package/dist/public/assets/HistoryPage.js +1 -0
  20. package/dist/public/assets/LogsPage.js +1 -0
  21. package/dist/public/assets/PageContainer.js +3 -0
  22. package/dist/public/assets/PlayArrow.js +1 -0
  23. package/dist/public/assets/PresetsPage.js +4 -0
  24. package/dist/public/assets/RoutesPage.js +1 -0
  25. package/dist/public/assets/SchedulingPage.js +1 -0
  26. package/dist/public/assets/SchemaTreeView.js +1 -0
  27. package/dist/public/assets/SettingsPage.js +1 -0
  28. package/dist/public/assets/SocketsPage.js +1 -0
  29. package/dist/public/assets/docs.css +1 -1
  30. package/dist/public/assets/docs.js +95 -177
  31. package/dist/public/assets/filterTypes.js +1 -0
  32. package/dist/public/assets/getValidReactChildren.js +1 -0
  33. package/dist/public/assets/kvRowAdapters.js +1 -0
  34. package/dist/public/assets/schemaDefaults.js +1 -0
  35. package/dist/public/assets/useEndpointOptions.js +1 -0
  36. package/dist/public/assets/useQueryState.js +1 -0
  37. package/dist/public/assets/vendor-recharts.js +99 -0
  38. package/dist/public/assets/vendor-xyflow.js +15 -0
  39. package/dist/web/v2/AppShell.d.ts +1 -3
  40. package/dist/web/v2/components/diff/DiffViewer.d.ts +7 -0
  41. package/dist/web/v2/components/diff/RequestDiffSelector.d.ts +15 -0
  42. package/dist/web/v2/components/diff/SchemaDiffViewer.d.ts +7 -0
  43. package/dist/web/v2/components/feedback/CopyAsMenu.d.ts +10 -0
  44. package/dist/web/v2/components/feedback/CopySnackbar.d.ts +1 -0
  45. package/dist/web/v2/components/flows/FlowCanvas.d.ts +13 -0
  46. package/dist/web/v2/components/flows/FlowNodeEditor.d.ts +8 -0
  47. package/dist/web/v2/components/flows/FlowRunProgress.d.ts +7 -0
  48. package/dist/web/v2/components/flows/FlowVariablePanel.d.ts +7 -0
  49. package/dist/web/v2/components/flows/nodes/ConditionNode.d.ts +7 -0
  50. package/dist/web/v2/components/flows/nodes/DelayNode.d.ts +7 -0
  51. package/dist/web/v2/components/flows/nodes/ExtractNode.d.ts +8 -0
  52. package/dist/web/v2/components/flows/nodes/RequestNode.d.ts +10 -0
  53. package/dist/web/v2/components/layout/ActivityBar.d.ts +1 -0
  54. package/dist/web/v2/components/layout/BentoGrid.d.ts +17 -0
  55. package/dist/web/v2/components/layout/ContentArea.d.ts +1 -0
  56. package/dist/web/v2/components/layout/PanelRegistry.d.ts +17 -0
  57. package/dist/web/v2/components/request/LastRunPanel.d.ts +5 -0
  58. package/dist/web/v2/components/request/TimingBreakdown.d.ts +11 -0
  59. package/dist/web/v2/components/requests/timeline/TimelinePhaseBar.d.ts +13 -0
  60. package/dist/web/v2/components/requests/timeline/TimelineWaterfall.d.ts +12 -0
  61. package/dist/web/v2/hooks/useLeafEndpoint.d.ts +2 -2
  62. package/dist/web/v2/pages/DiffPage.d.ts +1 -0
  63. package/dist/web/v2/pages/FlowBuilderPage.d.ts +1 -0
  64. package/dist/web/v2/stores/flowStore.d.ts +70 -0
  65. package/dist/web/v2/stores/layoutStore.d.ts +13 -0
  66. package/dist/web/v2/stores/playgroundSettingsStore.d.ts +10 -0
  67. package/dist/web/v2/stores/snackbarStore.d.ts +17 -0
  68. package/dist/web/v2/types/types.cacheLog.d.ts +135 -49
  69. package/dist/web/v2/types/types.endpoint.d.ts +195 -139
  70. package/dist/web/v2/types/types.log.d.ts +48 -19
  71. package/dist/web/v2/types/types.preset.d.ts +168 -84
  72. package/dist/web/v2/types/types.requestLog.d.ts +135 -90
  73. package/dist/web/v2/types/types.scheduling.d.ts +87 -37
  74. package/dist/web/v2/types/types.socket.d.ts +69 -33
  75. package/dist/web/v2/utils/codeGeneration.d.ts +12 -0
  76. package/dist/web/v2/utils/diffUtils.d.ts +11 -0
  77. package/dist/web/v2/utils/flowRunner.d.ts +17 -0
  78. package/dist/web/v2/utils/templateResolver.d.ts +4 -0
  79. package/package.json +15 -12
@@ -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.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 ScheduleHandlerBodyType as RRRScheduleHandlerBodyType,\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\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\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\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 const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\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 const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\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 if (s instanceof z.ZodOptional) {\n optional = true\n const def = getDef(s)\n s = (def && def.innerType) || s\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\nfunction mergeProps(\n a: Record<string, SerializableSchema> | undefined,\n b: Record<string, SerializableSchema> | undefined,\n): Record<string, SerializableSchema> | undefined {\n if (!a && !b) return undefined\n return { ...(a ?? {}), ...(b ?? {}) }\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 // INTERSECTION (merge object intersections into a direct object)\n if (base instanceof z.ZodIntersection) {\n const left: ZodAny | undefined = def?.left\n const right: ZodAny | undefined = def?.right\n\n const leftNode = left ? introspectSchema(left) : undefined\n const rightNode = right ? introspectSchema(right) : undefined\n\n const leftIsObj = leftNode?.kind === 'object' && !!leftNode.properties\n const rightIsObj = rightNode?.kind === 'object' && !!rightNode.properties\n\n if (leftIsObj && rightIsObj) {\n node.kind = 'object'\n node.description =\n node.description ?? leftNode.description ?? rightNode.description\n node.properties = mergeProps(leftNode.properties, rightNode.properties)\n return node\n }\n\n // Fallback: preserve legacy left/right representation for non-object intersections\n if (leftNode && rightNode) {\n node.properties = {\n left: leftNode,\n right: rightNode,\n }\n }\n return node\n }\n\n // OBJECT\n if (base instanceof z.ZodObject) {\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 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 // LITERAL\n if (base instanceof z.ZodLiteral) {\n if (def) {\n if (Array.isArray(def.values)) {\n node.literal =\n def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\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 node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\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 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 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 '/__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\nconst allLeaves: AllLeaves = resource('/__rrroutes')\n .sub(\n endpointLeaves,\n requestLogLeaves,\n logLeaves,\n cacheLeaves,\n presetLeaves,\n socketLeaves,\n schedulingLeaves,\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 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\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 ttlMs: z.number().optional(),\n type: z.string().optional(), // 'redis', 'dataloader', etc.\n})\n\nexport type CacheTraceType = z.infer<typeof cacheTraceSchema>\n\nexport const cacheTraceQuerySchema = cacheLogQuerySchema.extend({\n operationsInclude: z.array(operationEnum).optional(),\n operationsExclude: z.array(operationEnum).optional(),\n})\n\nexport type CacheTraceQuery = z.infer<typeof cacheTraceQuerySchema> &\n z.infer<typeof paginationSchema>\n\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('/clear')\n .post({\n outputSchema: z.object({ success: z.boolean() }),\n querySchema: cacheLogQuerySchema,\n })\n .done(),\n resource('/trace')\n .get({\n feed: true,\n outputSchema: cacheTraceSchema.array(),\n querySchema: cacheTraceQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\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 extraRequestQuery = z.object({\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 ExtraRequestQuery = z.infer<typeof extraRequestQuery>\nexport const requestQuerySchema = baseQuerySchema.extend(\n extraRequestQuery.shape,\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(),\n startedAt: z.number().optional(),\n completedAt: z.number().optional(),\n status: z.string(),\n})\n\nexport const schedulingQuerySchema = baseQuerySchema.extend({\n statusesInclude: z.string().array().optional(),\n statusesExclude: z.string().array().optional(),\n})\n\nexport type SchedulingType = z.infer<typeof schedulingSchema>\nexport type SchedulingFilter = z.infer<typeof schedulingQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const schedulableHandler = z.object({\n name: z.string(),\n payload: z.string(),\n})\n\nexport type SchedulableHandlerType = z.infer<typeof schedulableHandler>\n\nexport const scheduleHandlerBodySchema = z.object({\n name: z.string(),\n payload: z.any(),\n runAt: z.coerce.date(),\n})\n\nexport type ScheduleHandlerBodyType = z.infer<typeof scheduleHandlerBodySchema>\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 .post({\n bodySchema: scheduleHandlerBodySchema,\n outputSchema: z.object({ success: z.boolean() }),\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"]}
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 ScheduleHandlerBodyType as RRRScheduleHandlerBodyType,\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\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\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\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 const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\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 const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\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 if (s instanceof z.ZodOptional) {\n optional = true\n const def = getDef(s)\n s = (def && def.innerType) || s\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\nfunction mergeProps(\n a: Record<string, SerializableSchema> | undefined,\n b: Record<string, SerializableSchema> | undefined,\n): Record<string, SerializableSchema> | undefined {\n if (!a && !b) return undefined\n return { ...(a ?? {}), ...(b ?? {}) }\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 // INTERSECTION (merge object intersections into a direct object)\n if (base instanceof z.ZodIntersection) {\n const left: ZodAny | undefined = def?.left\n const right: ZodAny | undefined = def?.right\n\n const leftNode = left ? introspectSchema(left) : undefined\n const rightNode = right ? introspectSchema(right) : undefined\n\n const leftIsObj = leftNode?.kind === 'object' && !!leftNode.properties\n const rightIsObj = rightNode?.kind === 'object' && !!rightNode.properties\n\n if (leftIsObj && rightIsObj) {\n node.kind = 'object'\n node.description =\n node.description ?? leftNode.description ?? rightNode.description\n node.properties = mergeProps(leftNode.properties, rightNode.properties)\n return node\n }\n\n // Fallback: preserve legacy left/right representation for non-object intersections\n if (leftNode && rightNode) {\n node.properties = {\n left: leftNode,\n right: rightNode,\n }\n }\n return node\n }\n\n // OBJECT\n if (base instanceof z.ZodObject) {\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 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 // LITERAL\n if (base instanceof z.ZodLiteral) {\n if (def) {\n if (Array.isArray(def.values)) {\n node.literal =\n def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\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 node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\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 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 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 '/__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\nconst allLeaves: AllLeaves = resource('/__rrroutes')\n .sub(\n endpointLeaves,\n requestLogLeaves,\n logLeaves,\n cacheLeaves,\n presetLeaves,\n socketLeaves,\n schedulingLeaves,\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 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\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 ttlMs: z.number().optional(),\n type: z.string().optional(), // 'redis', 'dataloader', etc.\n})\n\nexport type CacheTraceType = z.infer<typeof cacheTraceSchema>\n\nexport const cacheTraceQuerySchema = cacheLogQuerySchema.extend({\n operationsInclude: z.array(operationEnum).optional(),\n operationsExclude: z.array(operationEnum).optional(),\n})\n\nexport type CacheTraceQuery = z.infer<typeof cacheTraceQuerySchema> &\n z.infer<typeof paginationSchema>\n\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('/clear')\n .post({\n outputSchema: z.object({ success: z.boolean() }),\n querySchema: cacheLogQuerySchema,\n })\n .done(),\n resource('/trace')\n .get({\n feed: true,\n outputSchema: cacheTraceSchema.array(),\n querySchema: cacheTraceQuerySchema,\n outputMetaSchema: feedMeta,\n queryExtensionSchema: paginationSchema,\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 example?: unknown\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 example: z.unknown().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 extraRequestQuery = z.object({\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 ExtraRequestQuery = z.infer<typeof extraRequestQuery>\nexport const requestQuerySchema = baseQuerySchema.extend(\n extraRequestQuery.shape,\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(),\n startedAt: z.number().optional(),\n completedAt: z.number().optional(),\n status: z.string(),\n})\n\nexport const schedulingQuerySchema = baseQuerySchema.extend({\n statusesInclude: z.string().array().optional(),\n statusesExclude: z.string().array().optional(),\n})\n\nexport type SchedulingType = z.infer<typeof schedulingSchema>\nexport type SchedulingFilter = z.infer<typeof schedulingQuerySchema> &\n z.infer<typeof paginationSchema>\n\nexport const schedulableHandler = z.object({\n name: z.string(),\n payload: z.string(),\n})\n\nexport type SchedulableHandlerType = z.infer<typeof schedulableHandler>\n\nexport const scheduleHandlerBodySchema = z.object({\n name: z.string(),\n payload: z.any(),\n runAt: z.coerce.date(),\n})\n\nexport type ScheduleHandlerBodyType = z.infer<typeof scheduleHandlerBodySchema>\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 .post({\n bodySchema: scheduleHandlerBodySchema,\n outputSchema: z.object({ success: z.boolean() }),\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"]}
@@ -0,0 +1 @@
1
+ import{j as o}from"./vendor-xyflow.js";import{R as t}from"./docs.js";const h=t(o.jsx("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}));export{h as A};
@@ -0,0 +1 @@
1
+ import{h as b,m as Ge}from"./vendor-recharts.js";import{A as Ft,f as xe,i as ce,o as Ct,a as ut}from"./PageContainer.js";import{ba as Vt,K as ct,bb as Ue,bc as Ht,I as wt,J as Rt,U as Dt,M as Ke,N as Tt,O as E,W as de,bd as zt,L as dt,b1 as Mt,be as Nt,j as jt,a1 as Et}from"./docs.js";import{j as x}from"./vendor-xyflow.js";function Wt(o){const r=b.useRef({});return b.useEffect(()=>{r.current=o}),r.current}function $t({array1:o,array2:r,parser:p=d=>d}){return o&&r&&o.length===r.length&&o.every((d,C)=>p(d)===p(r[C]))}function St(o){return o.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}function Bt(o={}){const{ignoreAccents:r=!0,ignoreCase:p=!0,limit:d,matchFrom:C="any",stringify:w,trim:L=!1}=o;return(R,{inputValue:W,getOptionLabel:F})=>{let S=L?W.trim():W;p&&(S=S.toLowerCase()),r&&(S=St(S));const B=S?R.filter(Y=>{let D=(w||F)(Y);return p&&(D=D.toLowerCase()),r&&(D=St(D)),C==="start"?D.startsWith(S):D.includes(S)}):R;return typeof d=="number"?B.slice(0,d):B}}const Ut=Bt(),At=5,Gt=o=>{var r;return o.current!==null&&((r=o.current.parentElement)==null?void 0:r.contains(document.activeElement))},Kt=[];function Lt(o,r,p,d){if(r||o==null||d)return"";const C=p(o);return typeof C=="string"?C:""}function qt(o){const{unstable_isActiveElementInListbox:r=Gt,unstable_classNamePrefix:p="Mui",autoComplete:d=!1,autoHighlight:C=!1,autoSelect:w=!1,blurOnSelect:L=!1,clearOnBlur:R=!o.freeSolo,clearOnEscape:W=!1,componentName:F="useAutocomplete",defaultValue:S=o.multiple?Kt:null,disableClearable:B=!1,disableCloseOnSelect:Y=!1,disabled:D,disabledItemsFocusable:ke=!1,disableListWrap:ve=!1,filterOptions:gt=Ut,filterSelectedOptions:qe=!1,freeSolo:Z=!1,getOptionDisabled:U,getOptionKey:we,getOptionLabel:_e=t=>t.label??t,groupBy:se,handleHomeEndKeys:Je=!o.freeSolo,id:ht,includeInputInList:Ie=!1,inputValue:Re,isOptionEqualToValue:ae=(t,e)=>t===e,multiple:u=!1,onChange:Qe,onClose:Xe,onHighlightChange:De,onInputChange:M,onOpen:Te,open:bt,openOnFocus:mt=!1,options:xt,readOnly:K=!1,renderValue:k,selectOnFocus:Ye=!o.freeSolo,value:Me}=o,T=Vt(ht);let I=_e;I=t=>{const e=_e(t);return typeof e!="string"?String(e):e};const ye=b.useRef(!1),Pe=b.useRef(!0),y=b.useRef(null),N=b.useRef(null),[Oe,It]=b.useState(null),[v,ie]=b.useState(-1),Ze=C?0:-1,$=b.useRef(Ze),yt=b.useRef(Lt(S??Me,u,I)).current,[s,et]=ct({controlled:Me,default:S,name:F}),[f,q]=ct({controlled:Re,default:yt,name:F,state:"inputValue"}),[fe,Ne]=b.useState(!1),ge=b.useCallback((t,e,n)=>{if(!(u?s.length<e.length:e!==null)&&!R)return;const i=Lt(e,u,I,k);f!==i&&(q(i),M&&M(t,i,n))},[I,f,u,M,q,R,s,k]),[_,le]=ct({controlled:bt,default:!1,name:F,state:"open"}),[Pt,he]=b.useState(!0),Ee=!u&&s!=null&&f===I(s),A=_&&!K,g=A?gt(xt.filter(t=>!(qe&&(u?s:[s]).some(e=>e!==null&&ae(t,e)))),{inputValue:Ee&&Pt?"":f,getOptionLabel:I}):[],V=Wt({filteredOptions:g,value:s,inputValue:f});b.useEffect(()=>{const t=s!==V.value;fe&&!t||Z&&!t||ge(null,s,"reset")},[s,ge,fe,V.value,Z]);const Fe=_&&g.length>0&&!K,G=Ue(t=>{if(t===-1)y.current.focus();else{const e=k?"data-item-index":"data-tag-index";Oe.querySelector(`[${e}="${t}"]`).focus()}});b.useEffect(()=>{u&&v>s.length-1&&(ie(-1),G(-1))},[s,u,v,G]);function tt(t,e){if(!N.current||t<0||t>=g.length)return-1;let n=t;for(;;){const a=N.current.querySelector(`[data-option-index="${n}"]`),i=ke?!1:!a||a.disabled||a.getAttribute("aria-disabled")==="true";if(a&&a.hasAttribute("tabindex")&&!i)return n;if(e==="next"?n=(n+1)%g.length:n=(n-1+g.length)%g.length,n===t)return-1}}const J=Ue(({event:t,index:e,reason:n})=>{if($.current=e,e===-1?y.current.removeAttribute("aria-activedescendant"):y.current.setAttribute("aria-activedescendant",`${T}-option-${e}`),De&&["mouse","keyboard","touch"].includes(n)&&De(t,e===-1?null:g[e],n),!N.current)return;const a=N.current.querySelector(`[role="option"].${p}-focused`);a&&(a.classList.remove(`${p}-focused`),a.classList.remove(`${p}-focusVisible`));let i=N.current;if(N.current.getAttribute("role")!=="listbox"&&(i=N.current.parentElement.querySelector('[role="listbox"]')),!i)return;if(e===-1){i.scrollTop=0;return}const O=N.current.querySelector(`[data-option-index="${e}"]`);if(O&&(O.classList.add(`${p}-focused`),n==="keyboard"&&O.classList.add(`${p}-focusVisible`),i.scrollHeight>i.clientHeight&&n!=="mouse"&&n!=="touch")){const h=O,j=i.clientHeight+i.scrollTop,je=h.offsetTop+h.offsetHeight;je>j?i.scrollTop=je-i.clientHeight:h.offsetTop-h.offsetHeight*(se?1.3:0)<i.scrollTop&&(i.scrollTop=h.offsetTop-h.offsetHeight*(se?1.3:0))}}),H=Ue(({event:t,diff:e,direction:n="next",reason:a})=>{if(!A)return;const O=tt((()=>{const h=g.length-1;if(e==="reset")return Ze;if(e==="start")return 0;if(e==="end")return h;const j=$.current+e;return j<0?j===-1&&Ie?-1:ve&&$.current!==-1||Math.abs(e)>1?0:h:j>h?j===h+1&&Ie?-1:ve||Math.abs(e)>1?h:0:j})(),n);if(J({index:O,reason:a,event:t}),d&&e!=="reset")if(O===-1)y.current.value=f;else{const h=I(g[O]);y.current.value=h,h.toLowerCase().indexOf(f.toLowerCase())===0&&f.length>0&&y.current.setSelectionRange(f.length,h.length)}}),Ve=!$t({array1:V.filteredOptions,array2:g,parser:I}),ot=()=>{const t=(e,n)=>{const a=e?I(e):"",i=n?I(n):"";return a===i};if($.current!==-1&&!$t({array1:V.filteredOptions,array2:g,parser:I})&&V.inputValue===f&&(u?s.length===V.value.length&&V.value.every((e,n)=>I(s[n])===I(e)):t(V.value,s))){const e=V.filteredOptions[$.current];if(e)return g.findIndex(n=>I(n)===I(e))}return-1},Ce=b.useCallback(()=>{if(!A)return;const t=ot();if(t!==-1){$.current=t;return}const e=u?s[0]:s;if(g.length===0||e==null){H({diff:"reset"});return}if(N.current){if(e!=null){const n=g[$.current];if(u&&n&&s.findIndex(i=>ae(n,i))!==-1)return;const a=g.findIndex(i=>ae(i,e));a===-1?H({diff:"reset"}):J({index:a});return}if($.current>=g.length-1){J({index:g.length-1});return}J({index:$.current})}},[g.length,u?!1:s,H,J,A,f,u]),ee=Ue(t=>{Ht(N,t),t&&Ce()});b.useEffect(()=>{(Ve||A&&!Y)&&Ce()},[Ce,Ve,A,Y]);const Q=t=>{_||(le(!0),he(!0),Te&&Te(t))},pe=(t,e)=>{_&&(le(!1),Xe&&Xe(t,e))},z=(t,e,n,a)=>{if(u){if(s.length===e.length&&s.every((i,O)=>i===e[O]))return}else if(s===e)return;Qe&&Qe(t,e,n,a),et(e)},X=b.useRef(!1),te=(t,e,n="selectOption",a="options")=>{let i=n,O=e;if(u){O=Array.isArray(s)?s.slice():[];const h=O.findIndex(j=>ae(e,j));h===-1?O.push(e):a!=="freeSolo"&&(O.splice(h,1),i="removeOption")}ge(t,O,i),z(t,O,i,{option:e}),!Y&&(!t||!t.ctrlKey&&!t.metaKey)&&pe(t,i),(L===!0||L==="touch"&&X.current||L==="mouse"&&!X.current)&&y.current.blur()};function nt(t,e){if(t===-1)return-1;let n=t;for(;;){if(e==="next"&&n===s.length||e==="previous"&&n===-1)return-1;const a=k?"data-item-index":"data-tag-index",i=Oe.querySelector(`[${a}="${n}"]`);if(!i||!i.hasAttribute("tabindex")||i.disabled||i.getAttribute("aria-disabled")==="true")n+=e==="next"?1:-1;else return n}}const ue=(t,e)=>{if(!u)return;f===""&&pe(t,"toggleInput");let n=v;v===-1&&e==="previous"?(n=s.length-1,Z&&f!==""&&(q(""),M&&M(t,"","reset"))):(n+=e==="next"?1:-1,n<0&&(n=0),n===s.length&&(n=-1)),n=nt(n,e),ie(n),G(n)},He=t=>{ye.current=!0,q(""),M&&M(t,"","clear"),z(t,u?[]:null,"clear")},rt=t=>e=>{if(t.onKeyDown&&t.onKeyDown(e),!e.defaultMuiPrevented&&(v!==-1&&!["ArrowLeft","ArrowRight"].includes(e.key)&&(ie(-1),G(-1)),e.which!==229))switch(e.key){case"Home":A&&Je&&(e.preventDefault(),H({diff:"start",direction:"next",reason:"keyboard",event:e}));break;case"End":A&&Je&&(e.preventDefault(),H({diff:"end",direction:"previous",reason:"keyboard",event:e}));break;case"PageUp":e.preventDefault(),H({diff:-At,direction:"previous",reason:"keyboard",event:e}),Q(e);break;case"PageDown":e.preventDefault(),H({diff:At,direction:"next",reason:"keyboard",event:e}),Q(e);break;case"ArrowDown":e.preventDefault(),H({diff:1,direction:"next",reason:"keyboard",event:e}),Q(e);break;case"ArrowUp":e.preventDefault(),H({diff:-1,direction:"previous",reason:"keyboard",event:e}),Q(e);break;case"ArrowLeft":{const n=y.current;if(!(n&&n.selectionStart===0&&n.selectionEnd===0))return;!u&&k&&s!=null?(Z&&f!==""&&(q(""),M&&M(e,"","reset")),ie(0),G(0)):ue(e,"previous");break}case"ArrowRight":!u&&k?(ie(-1),G(-1)):ue(e,"next");break;case"Enter":if($.current!==-1&&A){const n=g[$.current],a=U?U(n):!1;if(e.preventDefault(),a)return;te(e,n,"selectOption"),d&&y.current.setSelectionRange(y.current.value.length,y.current.value.length)}else Z&&f!==""&&Ee===!1&&(u&&e.preventDefault(),te(e,f,"createOption","freeSolo"));break;case"Escape":A?(e.preventDefault(),e.stopPropagation(),pe(e,"escape")):W&&(f!==""||u&&s.length>0||k)&&(e.preventDefault(),e.stopPropagation(),He(e));break;case"Backspace":if(u&&!K&&f===""&&s.length>0){const n=v===-1?s.length-1:v,a=s.slice();a.splice(n,1),z(e,a,"removeOption",{option:s[n]})}!u&&k&&!K&&f===""&&z(e,null,"removeOption",{option:s});break;case"Delete":if(u&&!K&&f===""&&s.length>0&&v!==-1){const n=v,a=s.slice();a.splice(n,1),z(e,a,"removeOption",{option:s[n]})}!u&&k&&!K&&f===""&&z(e,null,"removeOption",{option:s});break}},be=t=>{Ne(!0),v!==-1&&(ie(-1),G(-1)),mt&&!ye.current&&Q(t)},me=t=>{if(r(N)){y.current.focus();return}Ne(!1),Pe.current=!0,ye.current=!1,w&&$.current!==-1&&A?te(t,g[$.current],"blur"):w&&Z&&f!==""?te(t,f,"blur","freeSolo"):R&&ge(t,s,"blur"),pe(t,"blur")},$e=t=>{const e=t.target.value;f!==e&&(q(e),he(!1),M&&M(t,e,"input")),e===""?!B&&!u&&!k&&z(t,null,"clear"):Q(t)},st=t=>{const e=Number(t.currentTarget.getAttribute("data-option-index"));$.current!==e&&J({event:t,index:e,reason:"mouse"})},at=t=>{J({event:t,index:Number(t.currentTarget.getAttribute("data-option-index")),reason:"touch"}),X.current=!0},it=t=>{const e=Number(t.currentTarget.getAttribute("data-option-index"));te(t,g[e],"selectOption"),X.current=!1},lt=t=>e=>{const n=s.slice();n.splice(t,1),z(e,n,"removeOption",{option:s[t]})},Se=t=>{z(t,null,"removeOption",{option:s})},m=t=>{_?pe(t,"toggleInput"):Q(t)},P=t=>{t.currentTarget.contains(t.target)&&t.target.getAttribute("id")!==T&&t.preventDefault()},oe=t=>{t.currentTarget.contains(t.target)&&(y.current.focus(),Ye&&Pe.current&&y.current.selectionEnd-y.current.selectionStart===0&&y.current.select(),Pe.current=!1)},pt=t=>{!D&&(f===""||!_)&&m(t)};let Ae=Z&&f.length>0;Ae=Ae||(u?s.length>0:s!==null);let ze=g;return se&&(ze=g.reduce((t,e,n)=>{const a=se(e);return t.length>0&&t[t.length-1].group===a?t[t.length-1].options.push(e):t.push({key:n,index:n,group:a,options:[e]}),t},[])),D&&fe&&me(),{getRootProps:(t={})=>({...t,onKeyDown:rt(t),onMouseDown:P,onClick:oe}),getInputLabelProps:()=>({id:`${T}-label`,htmlFor:T}),getInputProps:()=>({id:T,value:f,onBlur:me,onFocus:be,onChange:$e,onMouseDown:pt,"aria-activedescendant":A?"":null,"aria-autocomplete":d?"both":"list","aria-controls":Fe?`${T}-listbox`:void 0,"aria-expanded":Fe,autoComplete:"off",ref:y,autoCapitalize:"none",spellCheck:"false",role:"combobox",disabled:D}),getClearProps:()=>({tabIndex:-1,type:"button",onClick:He}),getItemProps:({index:t=0}={})=>({...u&&{key:t},...k?{"data-item-index":t}:{"data-tag-index":t},tabIndex:-1,...!K&&{onDelete:u?lt(t):Se}}),getPopupIndicatorProps:()=>({tabIndex:-1,type:"button",onClick:m}),getTagProps:({index:t})=>({key:t,"data-tag-index":t,tabIndex:-1,...!K&&{onDelete:lt(t)}}),getListboxProps:()=>({role:"listbox",id:`${T}-listbox`,"aria-labelledby":`${T}-label`,"aria-multiselectable":u||void 0,ref:ee,onMouseDown:t=>{t.preventDefault()}}),getOptionProps:({index:t,option:e})=>{const n=(u?s:[s]).some(i=>i!=null&&ae(e,i)),a=U?U(e):!1;return{key:(we==null?void 0:we(e))??I(e),tabIndex:-1,role:"option",id:`${T}-option-${t}`,onMouseMove:st,onClick:it,onTouchStart:at,"data-option-index":t,"aria-disabled":a,"aria-selected":n}},id:T,inputValue:f,value:s,dirty:Ae,expanded:A&&Oe,popupOpen:A,focused:fe||v!==-1,anchorEl:Oe,setAnchorEl:It,focusedItem:v,focusedTag:v,groupedOptions:ze}}function _t(o){return wt("MuiListSubheader",o)}Rt("MuiListSubheader",["root","colorPrimary","colorInherit","gutters","inset","sticky"]);const Jt=o=>{const{classes:r,color:p,disableGutters:d,inset:C,disableSticky:w}=o,L={root:["root",p!=="default"&&`color${Ke(p)}`,!d&&"gutters",C&&"inset",!w&&"sticky"]};return Tt(L,_t,r)},Qt=E("li",{name:"MuiListSubheader",slot:"Root",overridesResolver:(o,r)=>{const{ownerState:p}=o;return[r.root,p.color!=="default"&&r[`color${Ke(p.color)}`],!p.disableGutters&&r.gutters,p.inset&&r.inset,!p.disableSticky&&r.sticky]}})(de(({theme:o})=>({boxSizing:"border-box",lineHeight:"48px",listStyle:"none",color:(o.vars||o).palette.text.secondary,fontFamily:o.typography.fontFamily,fontWeight:o.typography.fontWeightMedium,fontSize:o.typography.pxToRem(14),variants:[{props:{color:"primary"},style:{color:(o.vars||o).palette.primary.main}},{props:{color:"inherit"},style:{color:"inherit"}},{props:({ownerState:r})=>!r.disableGutters,style:{paddingLeft:16,paddingRight:16}},{props:({ownerState:r})=>r.inset,style:{paddingLeft:72}},{props:({ownerState:r})=>!r.disableSticky,style:{position:"sticky",top:0,zIndex:1,backgroundColor:(o.vars||o).palette.background.paper}}]}))),ft=b.forwardRef(function(r,p){const d=Dt({props:r,name:"MuiListSubheader"}),{className:C,color:w="default",component:L="li",disableGutters:R=!1,disableSticky:W=!1,inset:F=!1,...S}=d,B={...d,color:w,component:L,disableGutters:R,disableSticky:W,inset:F},Y=Jt(B);return x.jsx(Qt,{as:L,className:Ge(Y.root,C),ref:p,ownerState:B,...S})});ft&&(ft.muiSkipListHighlight=!0);function Xt(o){return wt("MuiAutocomplete",o)}const l=Rt("MuiAutocomplete",["root","expanded","fullWidth","focused","focusVisible","tag","tagSizeSmall","tagSizeMedium","hasPopupIcon","hasClearIcon","inputRoot","input","inputFocused","endAdornment","clearIndicator","popupIndicator","popupIndicatorOpen","popper","popperDisablePortal","paper","listbox","loading","noOptions","option","groupLabel","groupUl"]);var kt,vt;const Yt=o=>{const{classes:r,disablePortal:p,expanded:d,focused:C,fullWidth:w,hasClearIcon:L,hasPopupIcon:R,inputFocused:W,popupOpen:F,size:S}=o,B={root:["root",d&&"expanded",C&&"focused",w&&"fullWidth",L&&"hasClearIcon",R&&"hasPopupIcon"],inputRoot:["inputRoot"],input:["input",W&&"inputFocused"],tag:["tag",`tagSize${Ke(S)}`],endAdornment:["endAdornment"],clearIndicator:["clearIndicator"],popupIndicator:["popupIndicator",F&&"popupIndicatorOpen"],popper:["popper",p&&"popperDisablePortal"],paper:["paper"],listbox:["listbox"],loading:["loading"],noOptions:["noOptions"],option:["option"],groupLabel:["groupLabel"],groupUl:["groupUl"]};return Tt(B,Xt,r)},Zt=E("div",{name:"MuiAutocomplete",slot:"Root",overridesResolver:(o,r)=>{const{ownerState:p}=o,{fullWidth:d,hasClearIcon:C,hasPopupIcon:w,inputFocused:L,size:R}=p;return[{[`& .${l.tag}`]:r.tag},{[`& .${l.tag}`]:r[`tagSize${Ke(R)}`]},{[`& .${l.inputRoot}`]:r.inputRoot},{[`& .${l.input}`]:r.input},{[`& .${l.input}`]:L&&r.inputFocused},r.root,d&&r.fullWidth,w&&r.hasPopupIcon,C&&r.hasClearIcon]}})({[`&.${l.focused} .${l.clearIndicator}`]:{visibility:"visible"},"@media (pointer: fine)":{[`&:hover .${l.clearIndicator}`]:{visibility:"visible"}},[`& .${l.tag}`]:{margin:3,maxWidth:"calc(100% - 6px)"},[`& .${l.inputRoot}`]:{[`.${l.hasPopupIcon}&, .${l.hasClearIcon}&`]:{paddingRight:30},[`.${l.hasPopupIcon}.${l.hasClearIcon}&`]:{paddingRight:56},[`& .${l.input}`]:{width:0,minWidth:30}},[`& .${ut.root}`]:{paddingBottom:1,"& .MuiInput-input":{padding:"4px 4px 4px 0px"}},[`& .${ut.root}.${ce.sizeSmall}`]:{[`& .${ut.input}`]:{padding:"2px 4px 3px 0"}},[`& .${Ct.root}`]:{padding:9,[`.${l.hasPopupIcon}&, .${l.hasClearIcon}&`]:{paddingRight:39},[`.${l.hasPopupIcon}.${l.hasClearIcon}&`]:{paddingRight:65},[`& .${l.input}`]:{padding:"7.5px 4px 7.5px 5px"},[`& .${l.endAdornment}`]:{right:9}},[`& .${Ct.root}.${ce.sizeSmall}`]:{paddingTop:6,paddingBottom:6,paddingLeft:6,[`& .${l.input}`]:{padding:"2.5px 4px 2.5px 8px"}},[`& .${xe.root}`]:{paddingTop:19,paddingLeft:8,[`.${l.hasPopupIcon}&, .${l.hasClearIcon}&`]:{paddingRight:39},[`.${l.hasPopupIcon}.${l.hasClearIcon}&`]:{paddingRight:65},[`& .${xe.input}`]:{padding:"7px 4px"},[`& .${l.endAdornment}`]:{right:9}},[`& .${xe.root}.${ce.sizeSmall}`]:{paddingBottom:1,[`& .${xe.input}`]:{padding:"2.5px 4px"}},[`& .${ce.hiddenLabel}`]:{paddingTop:8},[`& .${xe.root}.${ce.hiddenLabel}`]:{paddingTop:0,paddingBottom:0,[`& .${l.input}`]:{paddingTop:16,paddingBottom:17}},[`& .${xe.root}.${ce.hiddenLabel}.${ce.sizeSmall}`]:{[`& .${l.input}`]:{paddingTop:8,paddingBottom:9}},[`& .${l.input}`]:{flexGrow:1,textOverflow:"ellipsis",opacity:0},variants:[{props:{fullWidth:!0},style:{width:"100%"}},{props:{size:"small"},style:{[`& .${l.tag}`]:{margin:2,maxWidth:"calc(100% - 4px)"}}},{props:{inputFocused:!0},style:{[`& .${l.input}`]:{opacity:1}}},{props:{multiple:!0},style:{[`& .${l.inputRoot}`]:{flexWrap:"wrap"}}}]}),eo=E("div",{name:"MuiAutocomplete",slot:"EndAdornment"})({position:"absolute",right:0,top:"50%",transform:"translate(0, -50%)"}),to=E(Et,{name:"MuiAutocomplete",slot:"ClearIndicator"})({marginRight:-2,padding:4,visibility:"hidden"}),oo=E(Et,{name:"MuiAutocomplete",slot:"PopupIndicator",overridesResolver:(o,r)=>{const{ownerState:p}=o;return[r.popupIndicator,p.popupOpen&&r.popupIndicatorOpen]}})({padding:2,marginRight:-2,variants:[{props:{popupOpen:!0},style:{transform:"rotate(180deg)"}}]}),no=E(Nt,{name:"MuiAutocomplete",slot:"Popper",overridesResolver:(o,r)=>{const{ownerState:p}=o;return[{[`& .${l.option}`]:r.option},r.popper,p.disablePortal&&r.popperDisablePortal]}})(de(({theme:o})=>({zIndex:(o.vars||o).zIndex.modal,variants:[{props:{disablePortal:!0},style:{position:"absolute"}}]}))),ro=E(Mt,{name:"MuiAutocomplete",slot:"Paper"})(de(({theme:o})=>({...o.typography.body1,overflow:"auto"}))),so=E("div",{name:"MuiAutocomplete",slot:"Loading"})(de(({theme:o})=>({color:(o.vars||o).palette.text.secondary,padding:"14px 16px"}))),ao=E("div",{name:"MuiAutocomplete",slot:"NoOptions"})(de(({theme:o})=>({color:(o.vars||o).palette.text.secondary,padding:"14px 16px"}))),io=E("ul",{name:"MuiAutocomplete",slot:"Listbox"})(de(({theme:o})=>({listStyle:"none",margin:0,padding:"8px 0",maxHeight:"40vh",overflow:"auto",position:"relative",[`& .${l.option}`]:{minHeight:48,display:"flex",overflow:"hidden",justifyContent:"flex-start",alignItems:"center",cursor:"pointer",paddingTop:6,boxSizing:"border-box",outline:"0",WebkitTapHighlightColor:"transparent",paddingBottom:6,paddingLeft:16,paddingRight:16,[o.breakpoints.up("sm")]:{minHeight:"auto"},[`&.${l.focused}`]:{backgroundColor:(o.vars||o).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},'&[aria-disabled="true"]':{opacity:(o.vars||o).palette.action.disabledOpacity,pointerEvents:"none"},[`&.${l.focusVisible}`]:{backgroundColor:(o.vars||o).palette.action.focus},'&[aria-selected="true"]':{backgroundColor:o.alpha((o.vars||o).palette.primary.main,(o.vars||o).palette.action.selectedOpacity),[`&.${l.focused}`]:{backgroundColor:o.alpha((o.vars||o).palette.primary.main,`${(o.vars||o).palette.action.selectedOpacity} + ${(o.vars||o).palette.action.hoverOpacity}`),"@media (hover: none)":{backgroundColor:(o.vars||o).palette.action.selected}},[`&.${l.focusVisible}`]:{backgroundColor:o.alpha((o.vars||o).palette.primary.main,`${(o.vars||o).palette.action.selectedOpacity} + ${(o.vars||o).palette.action.focusOpacity}`)}}}}))),lo=E(ft,{name:"MuiAutocomplete",slot:"GroupLabel"})(de(({theme:o})=>({backgroundColor:(o.vars||o).palette.background.paper,top:-8}))),po=E("ul",{name:"MuiAutocomplete",slot:"GroupUl"})({padding:0,[`& .${l.option}`]:{paddingLeft:24}}),ho=b.forwardRef(function(r,p){const d=Dt({props:r,name:"MuiAutocomplete"}),{autoComplete:C=!1,autoHighlight:w=!1,autoSelect:L=!1,blurOnSelect:R=!1,ChipProps:W,className:F,clearIcon:S=kt||(kt=x.jsx(zt,{fontSize:"small"})),clearOnBlur:B=!d.freeSolo,clearOnEscape:Y=!1,clearText:D="Clear",closeText:ke="Close",componentsProps:ve,defaultValue:gt=d.multiple?[]:null,disableClearable:qe=!1,disableCloseOnSelect:Z=!1,disabled:U=!1,disabledItemsFocusable:we=!1,disableListWrap:_e=!1,disablePortal:se=!1,filterOptions:Je,filterSelectedOptions:ht=!1,forcePopupIcon:Ie="auto",freeSolo:Re=!1,fullWidth:ae=!1,getLimitTagsText:u=c=>`+${c}`,getOptionDisabled:Qe,getOptionKey:Xe,getOptionLabel:De,isOptionEqualToValue:M,groupBy:Te,handleHomeEndKeys:bt=!d.freeSolo,id:mt,includeInputInList:xt=!1,inputValue:K,limitTags:k=-1,ListboxComponent:Ye,ListboxProps:Me,loading:T=!1,loadingText:I="Loading…",multiple:ye=!1,noOptionsText:Pe="No options",onChange:y,onClose:N,onHighlightChange:Oe,onInputChange:It,onOpen:v,open:ie,openOnFocus:Ze=!1,openText:$="Open",options:yt,PaperComponent:s,PopperComponent:et,popupIcon:f=vt||(vt=x.jsx(Ft,{})),readOnly:q=!1,renderGroup:fe,renderInput:Ne,renderOption:ge,renderTags:_,renderValue:le,selectOnFocus:Pt=!d.freeSolo,size:he="medium",slots:Ee={},slotProps:A={},value:g,...V}=d,{getRootProps:Fe,getInputProps:G,getInputLabelProps:tt,getPopupIndicatorProps:J,getClearProps:H,getItemProps:Ve,getListboxProps:ot,getOptionProps:Ce,value:ee,dirty:Q,expanded:pe,id:z,popupOpen:X,focused:te,focusedItem:nt,anchorEl:ue,setAnchorEl:He,inputValue:rt,groupedOptions:be}=qt({...d,componentName:"Autocomplete"}),me=!qe&&!U&&Q&&!q,$e=(!Re||Ie===!0)&&Ie!==!1,{onMouseDown:st}=G(),{ref:at,...it}=ot(),Se=De||(c=>c.label??c),m={...d,disablePortal:se,expanded:pe,focused:te,fullWidth:ae,getOptionLabel:Se,hasClearIcon:me,hasPopupIcon:$e,inputFocused:nt===-1,popupOpen:X,size:he},P=Yt(m),oe={slots:{paper:s,popper:et,...Ee},slotProps:{chip:W,listbox:Me,...ve,...A}},[pt,Ae]=dt("listbox",{elementType:io,externalForwardedProps:oe,ownerState:m,className:P.listbox,additionalProps:it,ref:at}),[ze,t]=dt("paper",{elementType:Mt,externalForwardedProps:oe,ownerState:m,className:P.paper}),[e,n]=dt("popper",{elementType:Nt,externalForwardedProps:oe,ownerState:m,className:P.popper,additionalProps:{disablePortal:se,style:{width:ue?ue.clientWidth:null},role:"presentation",anchorEl:ue,open:X}});let a;const i=c=>({className:P.tag,disabled:U,...Ve(c)});if(ye?ee.length>0&&(_?a=_(ee,i,m):le?a=le(ee,i,m):a=ee.map((c,ne)=>{const{key:re,...Le}=i({index:ne});return x.jsx(jt,{label:Se(c),size:he,...Le,...oe.slotProps.chip},re)})):le&&ee!=null&&(a=le(ee,i,m)),k>-1&&Array.isArray(a)){const c=a.length-k;!te&&c>0&&(a=a.splice(0,k),a.push(x.jsx("span",{className:P.tag,children:u(c)},a.length)))}const h=fe||(c=>x.jsxs("li",{children:[x.jsx(lo,{className:P.groupLabel,ownerState:m,component:"div",children:c.group}),x.jsx(po,{className:P.groupUl,ownerState:m,children:c.children})]},c.key)),je=ge||((c,ne)=>{const{key:re,...Le}=c;return x.jsx("li",{...Le,children:Se(ne)},re)}),Ot=(c,ne)=>{const re=Ce({option:c,index:ne});return je({...re,className:P.option},c,{selected:re["aria-selected"],index:ne,inputValue:rt},m)},We=oe.slotProps.clearIndicator,Be=oe.slotProps.popupIndicator;return x.jsxs(b.Fragment,{children:[x.jsx(Zt,{ref:p,className:Ge(P.root,F),ownerState:m,...Fe(V),children:Ne({id:z,disabled:U,fullWidth:d.fullWidth??!0,size:he==="small"?"small":void 0,InputLabelProps:tt(),InputProps:{ref:He,className:P.inputRoot,startAdornment:a,onMouseDown:c=>{c.target===c.currentTarget&&st(c)},...(me||$e)&&{endAdornment:x.jsxs(eo,{className:P.endAdornment,ownerState:m,children:[me?x.jsx(to,{...H(),"aria-label":D,title:D,ownerState:m,...We,className:Ge(P.clearIndicator,We==null?void 0:We.className),children:S}):null,$e?x.jsx(oo,{...J(),disabled:U,"aria-label":X?ke:$,title:X?ke:$,ownerState:m,...Be,className:Ge(P.popupIndicator,Be==null?void 0:Be.className),children:f}):null]})}},inputProps:{className:P.input,disabled:U,readOnly:q,...G()}})}),ue?x.jsx(no,{as:e,...n,children:x.jsxs(ro,{as:ze,...t,children:[T&&be.length===0?x.jsx(so,{className:P.loading,ownerState:m,children:I}):null,be.length===0&&!Re&&!T?x.jsx(ao,{className:P.noOptions,ownerState:m,role:"presentation",onMouseDown:c=>{c.preventDefault()},children:Pe}):null,be.length>0?x.jsx(pt,{as:Ye,...Ae,children:be.map((c,ne)=>Te?h({key:c.key,group:c.group,children:c.options.map((re,Le)=>Ot(re,c.index+Le))}):Ot(c,ne))}):null]})}):null]})});export{ho as A};
@@ -0,0 +1 @@
1
+ import{j as t}from"./vendor-xyflow.js";import{I as B,J as U,U as $,T as G,M as S,N as K,O as V,W as H,R as I,a1 as F,j as _,h as Q,C as J,S as v,G as A,E as X,a3 as T,Z,k as q}from"./docs.js";import{R as Y}from"./useQueryState.js";import{h,m as ee}from"./vendor-recharts.js";import{u as te,F as ne,T as b}from"./PageContainer.js";import{A as se}from"./Autocomplete.js";function oe(e){return B("MuiInputAdornment",e)}const P=U("MuiInputAdornment",["root","filled","standard","outlined","positionStart","positionEnd","disablePointerEvents","hiddenLabel","sizeSmall"]);var w;const re=(e,n)=>{const{ownerState:s}=e;return[n.root,n[`position${S(s.position)}`],s.disablePointerEvents===!0&&n.disablePointerEvents,n[s.variant]]},ae=e=>{const{classes:n,disablePointerEvents:s,hiddenLabel:r,position:a,size:i,variant:l}=e,u={root:["root",s&&"disablePointerEvents",a&&`position${S(a)}`,l,r&&"hiddenLabel",i&&`size${S(i)}`]};return K(u,oe,n)},ie=V("div",{name:"MuiInputAdornment",slot:"Root",overridesResolver:re})(H(({theme:e})=>({display:"flex",maxHeight:"2em",alignItems:"center",whiteSpace:"nowrap",color:(e.vars||e).palette.action.active,variants:[{props:{variant:"filled"},style:{[`&.${P.positionStart}&:not(.${P.hiddenLabel})`]:{marginTop:16}}},{props:{position:"start"},style:{marginRight:8}},{props:{position:"end"},style:{marginLeft:8}},{props:{disablePointerEvents:!0},style:{pointerEvents:"none"}}]}))),N=h.forwardRef(function(n,s){const r=$({props:n,name:"MuiInputAdornment"}),{children:a,className:i,component:l="div",disablePointerEvents:u=!1,disableTypography:p=!1,position:f,variant:C,...d}=r,m=te()||{};let x=C;C&&m.variant,m&&!x&&(x=m.variant);const y={...r,hiddenLabel:m.hiddenLabel,size:m.size,disablePointerEvents:u,position:f,variant:x},g=ae(y);return t.jsx(ne.Provider,{value:null,children:t.jsx(ie,{as:l,ownerState:y,className:ee(g.root,i),ref:s,...d,children:typeof a=="string"&&!p?t.jsx(G,{color:"textSecondary",children:a}):t.jsxs(h.Fragment,{children:[f==="start"?w||(w=t.jsx("span",{className:"notranslate","aria-hidden":!0,children:"​"})):null,a]})})})}),le=I(t.jsx("path",{d:"M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39c.51-.66.04-1.61-.79-1.61H5.04c-.83 0-1.3.95-.79 1.61"})),de=I(t.jsx("path",{d:"M19.79 5.61C20.3 4.95 19.83 4 19 4H6.83l7.97 7.97zM2.81 2.81 1.39 4.22 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-2.17l5.78 5.78 1.41-1.41z"})),ce=new Set(["INPUT","TEXTAREA","SELECT"]);function ue({searchInputRef:e}){h.useEffect(()=>{const n=s=>{var a;if(s.defaultPrevented||s.key!=="/"||s.metaKey||s.ctrlKey||s.altKey)return;const r=s.target;r&&ce.has(r.tagName)||(s.preventDefault(),(a=e==null?void 0:e.current)==null||a.focus())};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[e])}const pe=I(t.jsx("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})),me=I(t.jsx("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"}));function xe({value:e,onChange:n,placeholder:s="Search...",onSubmit:r,textFieldProps:a,inputRef:i}){const l=p=>{n(p.target.value)},u=p=>{p.key==="Enter"&&(r==null||r())};return t.jsx(b,{value:e,onChange:l,placeholder:s,onKeyDown:u,fullWidth:!0,inputRef:i,InputProps:{startAdornment:t.jsx(N,{position:"start",children:t.jsx(me,{fontSize:"small"})}),endAdornment:e?t.jsx(N,{position:"end",children:t.jsx(F,{size:"small",onClick:()=>n(""),"aria-label":"Clear search input",children:t.jsx(pe,{fontSize:"small"})})}):void 0},...a})}function k({options:e,selection:n,onChange:s,placeholder:r,label:a}){return t.jsx(se,{multiple:!0,freeSolo:!0,options:e,value:n,onChange:(i,l)=>s(l),renderValue:(i,l)=>i.map((u,p)=>t.jsx(_,{size:"small",label:u,...l({index:p})})),sx:{flex:1},renderInput:i=>t.jsx(b,{...i,label:a,placeholder:r,size:"small"})})}function ve({value:e,onChange:n,children:s,tagOptions:r,groupOptions:a,onRefresh:i,refreshing:l=!1,searchOnly:u=!1}){const p=Q(),[f,C]=h.useState(!1),[d,m]=h.useState("include"),x=h.useRef(null);ue({searchInputRef:x});const y=o=>{n({...e,pageSize:o})},g=(o,j)=>{n({...e,[o]:he(j)})},M=e.searchQuery??"",c=d==="exclude",O=d==="include"?e.tagsInclude:e.tagsExclude,R=d==="include"?e.groupsInclude:e.groupsExclude,z=o=>{n({...e,tagsInclude:d==="include"?o:e.tagsInclude,tagsExclude:d==="exclude"?o:e.tagsExclude})},W=()=>m(o=>o==="include"?"exclude":"include"),E=c?{opacity:.5}:void 0;return t.jsx(J,{title:"Filters",bgcolor:c?q(p.palette.error.main,.08):void 0,children:t.jsxs(v,{spacing:2,children:[t.jsxs(v,{direction:{xs:"column",md:"row"},spacing:2,children:[t.jsx(A,{sx:{flex:1,minWidth:0,...E},children:t.jsx(xe,{value:M,onChange:o=>g("searchQuery",o),placeholder:"Search",inputRef:x,textFieldProps:{disabled:c}})}),!u&&t.jsxs(t.Fragment,{children:[t.jsx(F,{onClick:()=>C(o=>!o),sx:{transform:f?"rotate(180deg)":"rotate(0deg)",transition:"transform 150ms ease"},"aria-label":"Toggle advanced filters",children:t.jsx(X,{})}),t.jsx(T,{variant:c?"contained":"outlined",color:c?"error":"primary",onClick:W,startIcon:c?t.jsx(de,{}):t.jsx(le,{}),sx:{minWidth:140},children:c?"Exclude mode":"Include mode"})]}),i?t.jsx(T,{variant:"outlined",color:"primary",onClick:i,startIcon:t.jsx(Y,{sx:l?{animation:"spin 0.9s linear infinite","@keyframes spin":{from:{transform:"rotate(0deg)"},to:{transform:"rotate(360deg)"}}}:void 0}),disabled:l,sx:{minWidth:140},children:"Refresh"}):null]}),t.jsxs(Z,{in:f,timeout:"auto",unmountOnExit:!0,children:[t.jsxs(v,{direction:{xs:"column",md:"row"},spacing:2,alignItems:{xs:"stretch",md:"flex-start"},sx:E,children:[t.jsx(b,{label:"After",type:"datetime-local",value:D(e.afterDate),onChange:o=>g("afterDate",L(o.target.value)),size:"small",fullWidth:!0,slotProps:{inputLabel:{shrink:!0}},sx:{flex:2},disabled:c}),t.jsx(b,{label:"Before",type:"datetime-local",value:D(e.beforeDate),onChange:o=>g("beforeDate",L(o.target.value)),size:"small",fullWidth:!0,slotProps:{inputLabel:{shrink:!0}},sx:{flex:2},disabled:c}),t.jsx(b,{label:"Page size",type:"number",value:e.pageSize??"",onChange:o=>{const j=Number(o.target.value);y(Number.isNaN(j)||j<=0?void 0:j)},size:"small",fullWidth:!0,slotProps:{inputLabel:{shrink:!0}},sx:{flex:1},disabled:c})]}),t.jsxs(v,{spacing:2,sx:{mt:2,flex:1},children:[t.jsx(k,{options:r??[],selection:O??[],label:`Tags (${d})`,placeholder:"Add tags",onChange:z}),t.jsx(k,{options:a??[],selection:R??[],label:`Groups (${d})`,placeholder:"Add groups",onChange:z})]})]}),s?t.jsx(A,{sx:{borderTop:"1px solid",borderColor:"divider",pt:2},children:s(d,E)}):null]})})}function D(e){if(!e)return"";const n=new Date(e);if(Number.isNaN(n.getTime()))return e;const s=n.getTimezoneOffset();return new Date(n.getTime()-s*60*1e3).toISOString().slice(0,16)}function L(e){if(!e)return;const n=new Date(e);return Number.isNaN(n.getTime())?e:n.toISOString()}function he(e){if(!(typeof e=="string"&&e.trim()==="")&&!(Array.isArray(e)&&e.length===0))return e}export{ve as B};
@@ -0,0 +1 @@
1
+ import{j as t}from"./vendor-xyflow.js";import{E as W}from"./ExpandLess.js";import{S as E,G as k,ak as P,E as B,T as D,aW as A,a9 as $,a1 as G}from"./docs.js";import{h as n}from"./vendor-recharts.js";const M=n.createContext({collapsed:[],toggleCollapse:()=>{},cardCount:1,dragging:!1}),T=n.createContext(0);function N({onResize:o,onDragStart:l,onDragEnd:i}){const s=n.useRef(!1),d=n.useRef(0),w=n.useCallback(r=>{r.preventDefault(),s.current=!0,d.current=r.clientX,document.body.style.cursor="col-resize",document.body.style.userSelect="none",l();const u=p=>{if(!s.current)return;const h=p.clientX-d.current;d.current=p.clientX,o(h)},f=()=>{s.current=!1,document.body.style.cursor="",document.body.style.userSelect="",i(),window.removeEventListener("pointermove",u),window.removeEventListener("pointerup",f)};window.addEventListener("pointermove",u),window.addEventListener("pointerup",f)},[o,l,i]);return t.jsx(k,{onPointerDown:w,sx:{width:"6px",flexShrink:0,cursor:"col-resize",position:"relative",zIndex:1,"&::after":{content:'""',position:"absolute",top:"20%",bottom:"20%",left:"50%",transform:"translateX(-50%)",width:"2px",borderRadius:"1px",bgcolor:"divider"},"&:hover::after, &:active::after":{bgcolor:"primary.main"}}})}function q({children:o}){return t.jsx(E,{spacing:2,children:o})}const L=5;function F({sizes:o,children:l}){const i=Array.isArray(l)?l.filter(e=>e!=null):[l],s=i.length,[d,w]=n.useState(()=>{const e=o??i.map(()=>1),c=e.reduce((a,m)=>a+m,0)||1;return e.map(a=>a/c*100)}),[r,u]=n.useState(()=>i.map(()=>!1)),[f,p]=n.useState(!1),h=n.useRef(null),x=n.useCallback(e=>{u(c=>{const a=[...c];return a[e]=!c[e],a})},[]),j=n.useCallback(()=>p(!0),[]),v=n.useCallback(()=>p(!1),[]),X=n.useCallback((e,c)=>{const a=h.current;if(!a)return;const m=a.offsetWidth;if(m<=0)return;const z=c/m*100;w(y=>{const g=[...y];let C=e,b=e+1;for(;C>=0&&r[C];)C--;for(;b<s&&r[b];)b++;if(C<0||b>=s)return y;const I=g[C]+z,R=g[b]-z;return I<L||R<L?y:(g[C]=I,g[b]=R,g)})},[s,r]),H={collapsed:r,toggleCollapse:x,cardCount:s,dragging:f},S=[];for(let e=0;e<i.length;e++){if(e>0){const a=r[e-1],m=r[e];if(!(a||m)){const y=e-1;S.push(t.jsx(N,{onResize:g=>X(y,g),onDragStart:j,onDragEnd:v},`handle-${e}`))}}const c=r[e];S.push(t.jsx(T.Provider,{value:e,children:t.jsx(k,{sx:{flex:c?s>1?"0 0 36px":void 0:`${d[e]} 0 0%`,minWidth:c&&s>1?"36px":"60px",overflow:"hidden"},children:i[e]})},`card-${e}`))}return t.jsx(M.Provider,{value:H,children:t.jsx(k,{ref:h,sx:{display:"flex",gap:0,width:"100%"},children:S})})}function J({title:o,actions:l,children:i}){const{collapsed:s,toggleCollapse:d,cardCount:w,dragging:r}=n.useContext(M),u=n.useContext(T),f=s[u]??!1,p=w>1,h=f&&p,x=f&&!p,j=n.useCallback(()=>{d(u)},[u,d]);return h?t.jsxs(P,{onClick:j,sx:{height:"100%",cursor:"pointer",bgcolor:"background.paper",border:"none",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",py:2,overflow:"hidden","&:hover":{bgcolor:"action.hover"}},children:[t.jsx(B,{fontSize:"small",sx:{mb:1,color:"text.secondary",transform:"rotate(-90deg)"}}),o&&t.jsx(D,{variant:"caption",sx:{writingMode:"vertical-rl",textOrientation:"mixed",whiteSpace:"nowrap",color:"text.secondary"},children:o})]}):t.jsx(P,{sx:{height:"100%",bgcolor:"background.paper",border:"none",display:"flex",flexDirection:"column"},children:t.jsxs(A,{sx:{flex:1,display:"flex",flexDirection:"column",...x?{pb:"16px !important"}:{}},children:[(o||l)&&t.jsxs(E,{direction:"row",alignItems:"center",justifyContent:"space-between",spacing:1,sx:{mb:x?0:1},children:[t.jsxs(E,{direction:"row",alignItems:"center",spacing:.5,sx:{cursor:"pointer",userSelect:"none"},onClick:j,children:[t.jsx($,{title:x?"Expand":"Collapse",children:t.jsx(G,{size:"small",onClick:v=>{v.stopPropagation(),j()},sx:{p:.25},children:x?t.jsx(B,{fontSize:"small"}):t.jsx(W,{fontSize:"small"})})}),o&&t.jsx(D,{variant:"subtitle1",component:"h2",children:o})]}),l&&!x&&t.jsx(k,{onClick:v=>v.stopPropagation(),children:l})]}),!x&&t.jsx(k,{sx:{flex:1,pointerEvents:r?"none":"auto"},children:i})]})})}export{q as B,F as a,J as b};
@@ -0,0 +1 @@
1
+ import{j as e}from"./vendor-xyflow.js";import{P as me}from"./PageContainer.js";import{B as fe,a as ae,b as N}from"./BentoGrid.js";import{h as d,B as A,C as L,X as v,Y as z,T,q as D,P as xe,v as ge,w as ye,z as be,L as Q,t as se,D as je,S as ke}from"./vendor-recharts.js";import{S as F,aI as Se,aJ as Te,x as q,b as B,e as V,aK as re,h as oe,k as ne,C as W,B as X,D as P,aL as C,z as Y,aB as le,d as ce,aM as Ce,aN as Le,v as ue,aO as ve,a3 as ze,aP as Fe,aQ as J,aR as De,aS as ie,aA as Ee,aT as Ke,aU as Ae,aV as U}from"./docs.js";import{u as G}from"./useQueryState.js";import{D as Z}from"./filterTypes.js";import{B as ee}from"./BaseFilterBar.js";import"./ExpandLess.js";import"./Autocomplete.js";function Pe({groups:o,onGroupSelect:a}){return e.jsx(F,{spacing:2,children:e.jsx(Se,{columns:Te,items:o,onRowClick:s=>a(s.groupId),sortBy:"lastSeen",sortDirection:"desc"})})}const Me={...Z,searchQuery:"",orderBy:"timestamp",orderDirection:"desc",pageSize:200};function $e(){const[o,a]=G("cacheGroupFilters",Me),{openCacheGroup:s}=q(),i=B("GET /__rrroutes/cache",{cursorQueryKey:"cursor",splitPageSize:500,splitPageSizeParam:"pageSize",getNextPageCursor(x){return x.meta.nextCursor}}),{data:r,isLoading:n,error:h,refetch:m,isFetching:p}=i.useEndpoint({query:o}),b=V(r,{reverse:!1}),f=d.useMemo(()=>re(b),[b]),l=d.useCallback(x=>{x&&s(x)},[s]),c=oe(),j=ne(c.palette.divider,.4),g=d.useMemo(()=>we(f),[f]),E=e.jsx(W,{title:"Cache groups",children:e.jsx(Pe,{groups:f.groupSummaries,onGroupSelect:l})}),S=e.jsxs(F,{spacing:3,children:[e.jsx(X,{stats:g.cards}),e.jsx(P,{charts:[{title:"Top groups by key count",chart:e.jsxs(A,{data:f.topGroupsByKeyCount,children:[e.jsx(L,{stroke:j,strokeDasharray:"3 3"}),e.jsx(v,{dataKey:"label",axisLine:!1,tickLine:!1,tick:{fill:c.palette.text.secondary,fontSize:12}}),e.jsx(z,{allowDecimals:!1,axisLine:!1,tickLine:!1,tick:{fill:c.palette.text.secondary,fontSize:12}}),e.jsx(T,{formatter:x=>[`${x}`,"keys"]}),e.jsx(D,{dataKey:"count",fill:c.palette.primary.main})]})},{title:"Top groups by payload",chart:e.jsxs(A,{data:f.topGroupsBySize,layout:"vertical",children:[e.jsx(L,{stroke:j,strokeDasharray:"3 3"}),e.jsx(v,{type:"number",axisLine:!1,tickLine:!1,tick:{fill:c.palette.text.secondary,fontSize:12},tickFormatter:x=>C(Number(x))}),e.jsx(z,{type:"category",dataKey:"label",width:140,axisLine:!1,tickLine:!1,tick:{fill:c.palette.text.secondary,fontSize:12}}),e.jsx(T,{formatter:x=>[C(Number(x)),"payload"]}),e.jsx(D,{dataKey:"size",fill:c.palette.secondary.main})]})}]})]});return e.jsxs(F,{spacing:3,children:[e.jsx(ee,{value:o,onChange:a,onRefresh:m,refreshing:p}),e.jsx(Y,{initialTab:"Table view",tabs:{"Table view":E,Insights:S}})]})}function we(o){const{groupSummaries:a,totalKeys:s,totalSize:i,expiredKeys:r}=o,n=a.filter(l=>typeof l.avgTtl=="number"),h=n.length?n.reduce((l,c)=>l+(c.avgTtl??0),0)/n.length:void 0,m=a.length?s/a.length:void 0,p=a.length?i/a.length:void 0,b=a.filter(l=>(l.expiredCount??0)>0).length,f=a.reduce((l,c)=>l?c.count>l.count?c:l:c,null);return{cards:[{label:"Groups",value:a.length,detail:`${s} keys`},{label:"Keys per group",value:m?m.toFixed(1):"—",detail:f?`${f.groupId??"Ungrouped"} has ${f.count} keys`:"Awaiting data"},{label:"Avg TTL (group)",value:h?le(h):"—",detail:`${n.length} groups with TTL`},{label:"Avg payload (group)",value:p?C(p):"—",detail:`Total ${C(i)}`},{label:"Groups with expired keys",value:b,detail:`${r} expired keys`}]}}const _e={...Z,searchQuery:"",orderBy:"timestamp",orderDirection:"desc",pageSize:200};function Re(){const[o,a]=G("cacheKeyFilters",_e),{openCacheKeyDetail:s}=q(),i=B("GET /__rrroutes/cache",{cursorQueryKey:"cursor",splitPageSize:500,splitPageSizeParam:"pageSize",getNextPageCursor(k){return k.meta.nextCursor}}),r=B("POST /__rrroutes/cache/clear"),{data:n,isLoading:h,error:m,refetch:p,isFetching:b,fetchNextPage:f,hasNextPage:l,isFetchingNextPage:c}=i.useEndpoint({query:o}),j=V(n,{reverse:!1}),g=ce(m,{messageFallback:"Failed to load cache keys.",refetch:p}),E=d.useMemo(()=>re(j),[j]),S=d.useMemo(()=>Ce(j),[j]),x=d.useMemo(()=>Le(j),[j]),K=d.useMemo(()=>Ge(E,S,x),[E,S,x]),[O,M]=d.useState(!1),$=d.useCallback(async k=>{M(!0);try{await r.fetch({query:{...Be(o),...k}},void 0),await p()}catch(H){console.error("Failed to clear cache",H)}finally{M(!1)}},[o,r,p]),w=e.jsx(ze,{variant:"outlined",color:"error",size:"small",onClick:()=>$(),disabled:O||h,children:"Clear cache"});return e.jsxs(F,{spacing:3,children:[e.jsx(ee,{value:o,onChange:a,onRefresh:p,refreshing:b}),e.jsx(Y,{initialTab:"Table view",tabs:{"Table view":e.jsx(W,{title:"Cache keys",actions:w,children:e.jsx(ue,{items:j,endpoint:{data:n,fetchNextPage:f,hasNextPage:l,isFetchingNextPage:c},columns:ve,query:o,setQuery:a,onRowClick:k=>s(k.name??k.id),stateHandler:{isLoading:h,loading:{variant:"table"},emptyFallback:{title:"No cache keys",description:"Adjust filters to surface recent cache activity."},error:g}})}),Insights:e.jsxs(F,{spacing:3,children:[e.jsx(X,{stats:K.stats}),e.jsx(P,{charts:[{title:"TTL distribution",subText:"Key-level TTL buckets",chart:e.jsxs(A,{data:K.ttlHistogram,children:[e.jsx(L,{strokeDasharray:"3 3"}),e.jsx(v,{dataKey:"label",axisLine:!1,tickLine:!1}),e.jsx(z,{allowDecimals:!1,axisLine:!1,tickLine:!1}),e.jsx(T,{formatter:k=>[`${k}`,"keys"]}),e.jsx(D,{dataKey:"count",fill:"#1e88e5"})]})},{title:"Payload distribution",subText:"Bucketed by size range",chart:e.jsxs(A,{data:K.sizeHistogram,children:[e.jsx(L,{strokeDasharray:"3 3"}),e.jsx(v,{dataKey:"label",axisLine:!1,tickLine:!1}),e.jsx(z,{allowDecimals:!1,axisLine:!1,tickLine:!1}),e.jsx(T,{formatter:k=>[`${k}`,"keys"]}),e.jsx(D,{dataKey:"count",fill:"#42a5f5"})]})}]})]})}})]})}function Be(o){const{cursor:a,pageSize:s,...i}=o;return i}function Ge(o,a,s){const{totalKeys:i,totalSize:r,ttlCount:n,ttlSum:h,expiredKeys:m,groupSummaries:p}=o,b=i?n/i*100:0,f=i?m/i*100:0,l=i?r/i:void 0,c=n?h/n:void 0;return{stats:[{label:"Total keys",value:i,detail:`${p.length} groups`},{label:"Keys with TTL",value:n,detail:`${b.toFixed(1)}% of keys`},{label:"Average TTL",value:c!=null?le(c):"—",detail:`${n} TTL samples`},{label:"Expired keys",value:m,detail:`${f.toFixed(1)}% of keys`},{label:"Average payload",value:l!=null?C(l):"—",detail:`Total ${C(r)} across keys`}],ttlHistogram:a,sizeHistogram:s}}const Ie={...Z,searchQuery:"",orderBy:"timestamp",orderDirection:"desc",pageSize:200},Oe={operations:Ae};function He(){const[o,a]=G("cacheTraceFilters",Ie),[s,i]=G("cacheTraceExtras",Oe),{openCacheTraceDetail:r}=q(),n=d.useMemo(()=>({cursorQueryKey:"cursor",splitPageSize:500,splitPageSizeParam:"pageSize",getNextPageCursor(t){return t.meta.nextCursor}}),[]),h=B("GET /__rrroutes/cache/trace",n),m=d.useMemo(()=>{const t=[],u=[];for(const[R,te]of Object.entries(s.operations))te==="include"&&t.push(R),te==="exclude"&&u.push(R);return{...o,...t.length?{operationsInclude:t}:{},...u.length?{operationsExclude:u}:{}}},[o,s]),p=h.useEndpoint({query:m}),{data:b,isLoading:f,error:l,refetch:c,isFetching:j}=p,g=V(b,{reverse:!1}),E=ce(l,{messageFallback:"Failed to load cache traces.",refetch:c}),S=d.useMemo(()=>Ne(g),[g]),x=d.useMemo(()=>Qe(S.operationCounts),[S.operationCounts]),K=d.useMemo(()=>Ue(g),[g]),O=d.useMemo(()=>qe(g),[g]),M=d.useMemo(()=>Ve(g),[g]),$=d.useMemo(()=>We(g),[g]),w=$.reduce((t,u)=>u.total>t.total?u:t,{hour:0,hourLabel:"00",total:0}),k=d.useCallback(t=>{i(u=>({...u,operations:{...u.operations,[t]:Fe(u.operations[t])}}))},[]),H=d.useCallback(t=>{r(t)},[r]),y=oe(),_=ne(y.palette.divider,.4),de=S.operationCounts.hit,he=S.operationCounts.miss,pe=de+he;return e.jsxs(F,{spacing:3,children:[e.jsx(ee,{value:o,onChange:a,onRefresh:c,refreshing:j,children:()=>e.jsx(F,{direction:"row",spacing:1,flexWrap:"wrap",children:J.map(t=>e.jsx(De,{operation:t,state:s.operations[t],onClick:()=>k(t)},t))})}),e.jsx(Y,{initialTab:"Table view",tabs:{"Table view":e.jsx(W,{title:"Trace entries",children:e.jsx(ue,{items:g,endpoint:p,columns:Ke,query:o,setQuery:a,onRowClick:H,stateHandler:{isLoading:f,loading:{variant:"table"},emptyFallback:{title:"No cache traces",description:"Adjust filters to view additional trace events."},error:E}})}),Insights:e.jsxs(F,{spacing:3,children:[e.jsx(X,{stats:S.cards}),e.jsx(P,{charts:[{title:"Operation mix",chart:e.jsxs(xe,{children:[e.jsx(ge,{data:x,dataKey:"value",nameKey:"name",innerRadius:48,outerRadius:74,paddingAngle:2,label:({name:t,percent:u})=>`${t} · ${u?(u*100).toFixed(0):"-"}%`,children:x.map(t=>e.jsx(ye,{fill:ie[t.name]},`cell-${t.name}`))}),e.jsx(T,{formatter:t=>[`${t}`,"ops"]})]})},{title:"Hit / miss trend",subText:K.length?`${pe} total operations`:"No hit/miss data available",chart:e.jsxs(be,{data:K,children:[e.jsx(L,{stroke:_,strokeDasharray:"3 3"}),e.jsx(v,{dataKey:"timestamp",type:"number",domain:["dataMin","dataMax"],tickFormatter:t=>new Date(t).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",hour12:!1}),tick:{fill:y.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1}),e.jsx(z,{allowDecimals:!1,tick:{fill:y.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1}),e.jsx(T,{labelFormatter:t=>Ee(t),formatter:(t,u)=>[`${t}`,String(u)]}),e.jsx(Q,{}),e.jsx(se,{type:"monotone",dataKey:"hits",stroke:y.palette.primary.main,strokeWidth:2,dot:!1}),e.jsx(se,{type:"monotone",dataKey:"misses",stroke:y.palette.error.main,strokeWidth:2,dot:!1})]})}]}),e.jsx(P,{charts:[{title:"Duration by operation",chart:e.jsxs(A,{data:O,children:[e.jsx(L,{stroke:_,strokeDasharray:"3 3"}),e.jsx(v,{dataKey:"operation",tick:{fill:y.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1}),e.jsx(z,{allowDecimals:!1,tick:{fill:y.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1,tickFormatter:t=>`${Math.round(t)} ms`}),e.jsx(T,{formatter:t=>[`${t} ms`,"Duration"]}),e.jsx(Q,{}),e.jsx(D,{dataKey:"avg",stackId:"a",fill:y.palette.primary.main}),e.jsx(D,{dataKey:"p95",stackId:"a",fill:y.palette.secondary.main})]})},{title:"Size vs. duration",chart:e.jsxs(je,{children:[e.jsx(L,{stroke:_,strokeDasharray:"3 3"}),e.jsx(v,{dataKey:"size",name:"Size",tickFormatter:t=>C(Number(t)),tick:{fill:y.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1}),e.jsx(z,{dataKey:"duration",name:"Duration",tick:{fill:y.palette.text.secondary,fontSize:12},tickFormatter:t=>`${Math.round(t)} ms`,axisLine:!1,tickLine:!1}),e.jsx(T,{cursor:{strokeDasharray:"3 3"},formatter:(t,u)=>u==="duration"?[`${t?Math.round(Number(t)):"-"} ms`,"Duration"]:[C(Number(t)),"Size"]}),Object.entries(ie).map(([t,u])=>e.jsx(ke,{name:t,data:M.filter(R=>R.operation===t),fill:u},t))]})}]}),e.jsx(P,{charts:[{title:"Activity by hour",subText:`Peak hour: ${String(w.hour).padStart(2,"0")}:00 with ${w.total} events.`,chart:e.jsxs(A,{data:$,children:[e.jsx(L,{stroke:_,strokeDasharray:"3 3"}),e.jsx(v,{dataKey:"hourLabel",tick:{fill:y.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1}),e.jsx(z,{allowDecimals:!1,tick:{fill:y.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1}),e.jsx(T,{formatter:t=>[`${t}`,"events"]}),e.jsx(Q,{}),e.jsx(D,{dataKey:"total",fill:y.palette.primary.main})]})}]})]})}})]})}function Ne(o){const a={hit:0,miss:0,set:0,delete:0},s=[];let i=0;o.forEach(l=>{a[l.operation]+=1,typeof l.durationMs=="number"&&s.push(l.durationMs),typeof l.size=="number"&&(i+=l.size)});const r=a.hit,n=a.miss,h=r+n?r/(r+n)*100:null,m=s.length?s.reduce((l,c)=>l+c,0)/s.length:null,p=I(s,95),b=I(s,99);return{cards:[{label:"Hit rate",value:h!=null?`${h.toFixed(1)}%`:"n/a",detail:`${r} hits · ${n} misses`},{label:"Average duration",value:m!=null?`${U(m)} ms`:"—",detail:`P95 ${p?`${U(p)} ms`:"—"}`},{label:"P99 duration",value:b?`${U(b)} ms`:"—",detail:`${s.length} recorded ops`},{label:"Data volume",value:C(i),detail:`${o.length} trace events`}],operationCounts:a}}function Qe(o){return J.map(a=>({name:a,value:o[a]??0}))}function Ue(o){const s=new Map;return o.forEach(i=>{const r=Math.floor((i.timestamp??0)/3e5)*3e5,n=s.get(r)??{hits:0,misses:0};i.operation==="hit"&&(n.hits+=1),i.operation==="miss"&&(n.misses+=1),s.set(r,n)}),Array.from(s.entries()).sort((i,r)=>i[0]-r[0]).map(([i,{hits:r,misses:n}])=>({timestamp:i,hits:r,misses:n}))}function qe(o){const a={hit:[],miss:[],set:[],delete:[]};return o.forEach(s=>{typeof s.durationMs=="number"&&a[s.operation].push(s.durationMs)}),J.map(s=>{const i=a[s],r=i.length===0?0:i.reduce((n,h)=>n+h,0)/i.length;return{operation:s,avg:r,p95:I(i,95)??r,p99:I(i,99)??r}})}function Ve(o){return o.filter(a=>typeof a.size=="number"&&typeof a.durationMs=="number"&&a.size>0).map(a=>({size:a.size??0,duration:a.durationMs??0,operation:a.operation})).slice(-150)}function We(o){const a=Array.from({length:24},(s,i)=>({hour:i,hourLabel:String(i).padStart(2,"0"),total:0}));return o.forEach(s=>{const i=new Date(s.timestamp),r=a[i.getHours()];r&&(r.total+=1)}),a}function I(o,a){if(!o.length)return null;const s=[...o].sort((h,m)=>h-m),i=a/100*(s.length-1),r=Math.floor(i),n=i-r;return r+1>=s.length?s[r]:s[r]+n*(s[r+1]-s[r])}function ot(){return e.jsx(me,{title:"Cache Logs",subtitle:"Inspect cache keys and trace data generated by running requests.",children:e.jsxs(fe,{children:[e.jsxs(ae,{sizes:[6,6],children:[e.jsx(N,{title:"Keys",children:e.jsx(Re,{})}),e.jsx(N,{title:"Groups",children:e.jsx($e,{})})]}),e.jsx(ae,{children:e.jsx(N,{title:"Trace",children:e.jsx(He,{})})})]})})}export{ot as default};
@@ -0,0 +1 @@
1
+ import{j as t}from"./vendor-xyflow.js";import{R as o}from"./docs.js";const s=o(t.jsx("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z"}));export{s as D};
@@ -0,0 +1,7 @@
1
+ import{j as d}from"./vendor-xyflow.js";import{h as C}from"./vendor-recharts.js";import{h as J,S,T as I,b1 as W,G as T,k as q,H as $,Y as N,b as E,e as H,z as _}from"./docs.js";import{A as F}from"./Autocomplete.js";import{T as V,P as G}from"./PageContainer.js";class D{diff(e,n,t={}){let l;typeof t=="function"?(l=t,t={}):"callback"in t&&(l=t.callback);const s=this.castInput(e,t),r=this.castInput(n,t),u=this.removeEmpty(this.tokenize(s,t)),i=this.removeEmpty(this.tokenize(r,t));return this.diffWithOptionsObj(u,i,t,l)}diffWithOptionsObj(e,n,t,l){var s;const r=p=>{if(p=this.postProcess(p,t),l){setTimeout(function(){l(p)},0);return}else return p},u=n.length,i=e.length;let h=1,c=u+i;t.maxEditLength!=null&&(c=Math.min(c,t.maxEditLength));const y=(s=t.timeout)!==null&&s!==void 0?s:1/0,x=Date.now()+y,a=[{oldPos:-1,lastComponent:void 0}];let f=this.extractCommon(a[0],n,e,0,t);if(a[0].oldPos+1>=i&&f+1>=u)return r(this.buildValues(a[0].lastComponent,n,e));let m=-1/0,g=1/0;const w=()=>{for(let p=Math.max(m,-h);p<=Math.min(g,h);p+=2){let P;const L=a[p-1],v=a[p+1];L&&(a[p-1]=void 0);let z=!1;if(v){const R=v.oldPos-p;z=v&&0<=R&&R<u}const b=L&&L.oldPos+1<i;if(!z&&!b){a[p]=void 0;continue}if(!b||z&&L.oldPos<v.oldPos?P=this.addToPath(v,!0,!1,0,t):P=this.addToPath(L,!1,!0,1,t),f=this.extractCommon(P,n,e,p,t),P.oldPos+1>=i&&f+1>=u)return r(this.buildValues(P.lastComponent,n,e))||!0;a[p]=P,P.oldPos+1>=i&&(g=Math.min(g,p-1)),f+1>=u&&(m=Math.max(m,p+1))}h++};if(l)(function p(){setTimeout(function(){if(h>c||Date.now()>x)return l(void 0);w()||p()},0)})();else for(;h<=c&&Date.now()<=x;){const p=w();if(p)return p}}addToPath(e,n,t,l,s){const r=e.lastComponent;return r&&!s.oneChangePerToken&&r.added===n&&r.removed===t?{oldPos:e.oldPos+l,lastComponent:{count:r.count+1,added:n,removed:t,previousComponent:r.previousComponent}}:{oldPos:e.oldPos+l,lastComponent:{count:1,added:n,removed:t,previousComponent:r}}}extractCommon(e,n,t,l,s){const r=n.length,u=t.length;let i=e.oldPos,h=i-l,c=0;for(;h+1<r&&i+1<u&&this.equals(t[i+1],n[h+1],s);)h++,i++,c++,s.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:!1,removed:!1});return c&&!s.oneChangePerToken&&(e.lastComponent={count:c,previousComponent:e.lastComponent,added:!1,removed:!1}),e.oldPos=i,h}equals(e,n,t){return t.comparator?t.comparator(e,n):e===n||!!t.ignoreCase&&e.toLowerCase()===n.toLowerCase()}removeEmpty(e){const n=[];for(let t=0;t<e.length;t++)e[t]&&n.push(e[t]);return n}castInput(e,n){return e}tokenize(e,n){return Array.from(e)}join(e){return e.join("")}postProcess(e,n){return e}get useLongestToken(){return!1}buildValues(e,n,t){const l=[];let s;for(;e;)l.push(e),s=e.previousComponent,delete e.previousComponent,e=s;l.reverse();const r=l.length;let u=0,i=0,h=0;for(;u<r;u++){const c=l[u];if(c.removed)c.value=this.join(t.slice(h,h+c.count)),h+=c.count;else{if(!c.added&&this.useLongestToken){let y=n.slice(i,i+c.count);y=y.map(function(x,a){const f=t[h+a];return f.length>x.length?f:x}),c.value=this.join(y)}else c.value=this.join(n.slice(i,i+c.count));i+=c.count,c.added||(h+=c.count)}}return l}}class K extends D{constructor(){super(...arguments),this.tokenize=B}equals(e,n,t){return t.ignoreWhitespace?((!t.newlineIsToken||!e.includes(`
2
+ `))&&(e=e.trim()),(!t.newlineIsToken||!n.includes(`
3
+ `))&&(n=n.trim())):t.ignoreNewlineAtEof&&!t.newlineIsToken&&(e.endsWith(`
4
+ `)&&(e=e.slice(0,-1)),n.endsWith(`
5
+ `)&&(n=n.slice(0,-1))),super.equals(e,n,t)}}new K;function B(o,e){e.stripTrailingCr&&(o=o.replace(/\r\n/g,`
6
+ `));const n=[],t=o.split(/(\n|\r\n)/);t[t.length-1]||t.pop();for(let l=0;l<t.length;l++){const s=t[l];l%2&&!e.newlineIsToken?n[n.length-1]+=s:n.push(s)}return n}class Q extends D{constructor(){super(...arguments),this.tokenize=B}get useLongestToken(){return!0}castInput(e,n){const{undefinedReplacement:t,stringifyReplacer:l=(s,r)=>typeof r>"u"?t:r}=n;return typeof e=="string"?e:JSON.stringify(O(e,null,null,l),null," ")}equals(e,n,t){return super.equals(e.replace(/,([\r\n])/g,"$1"),n.replace(/,([\r\n])/g,"$1"),t)}}const U=new Q;function Y(o,e,n){return U.diff(o,e,n)}function O(o,e,n,t,l){e=e||[],n=n||[],t&&(o=t(l===void 0?"":l,o));let s;for(s=0;s<e.length;s+=1)if(e[s]===o)return n[s];let r;if(Object.prototype.toString.call(o)==="[object Array]"){for(e.push(o),r=new Array(o.length),n.push(r),s=0;s<o.length;s+=1)r[s]=O(o[s],e,n,t,String(s));return e.pop(),n.pop(),r}if(o&&o.toJSON&&(o=o.toJSON()),typeof o=="object"&&o!==null){e.push(o),r={},n.push(r);const u=[];let i;for(i in o)Object.prototype.hasOwnProperty.call(o,i)&&u.push(i);for(u.sort(),s=0;s<u.length;s+=1)i=u[s],r[i]=O(o[i],e,n,t,i);e.pop(),n.pop()}else r=o;return r}function X(o,e){const n=typeof o=="string"?o:JSON.stringify(o,null,2)??"",t=typeof e=="string"?e:JSON.stringify(e,null,2)??"";return Y(n,t)}function j({left:o,right:e,title:n}){const t=J(),l=X(o,e),s=C.useRef(null),r=C.useRef(null),u=C.useRef(!1),i=C.useCallback(a=>()=>{if(u.current)return;u.current=!0;const f=a==="left"?s.current:r.current,m=a==="left"?r.current:s.current;f&&m&&(m.scrollTop=f.scrollTop,m.scrollLeft=f.scrollLeft),u.current=!1},[]),h=[],c=[];for(const a of l){const f=a.value.replace(/\n$/,"").split(`
7
+ `);if(a.added)for(const m of f)h.push({text:"",type:"unchanged"}),c.push({text:m,type:"added"});else if(a.removed)for(const m of f)h.push({text:m,type:"removed"}),c.push({text:"",type:"unchanged"});else for(const m of f)h.push({text:m,type:"unchanged"}),c.push({text:m,type:"unchanged"})}const y=a=>{switch(a){case"added":return q(t.palette.success.main,.15);case"removed":return q(t.palette.error.main,.15);default:return"transparent"}},x=(a,f,m,g)=>d.jsxs(W,{sx:{flex:1,minWidth:0,overflow:"hidden",backgroundColor:q(t.palette.background.paper,.5),backdropFilter:"blur(14px)",border:`1px solid ${q("#ffffff",.07)}`},children:[d.jsx(T,{sx:{px:2,py:1,borderBottom:`1px solid ${q("#ffffff",.07)}`},children:d.jsx(I,{variant:"subtitle2",color:"text.secondary",children:g})}),d.jsx(T,{ref:f,onScroll:m,sx:{overflow:"auto",maxHeight:500,p:1},children:a.map((w,p)=>d.jsx(T,{sx:{backgroundColor:y(w.type),px:1.5,py:.25,fontFamily:'"Fira Code", "JetBrains Mono", monospace',fontSize:"0.8rem",lineHeight:1.7,whiteSpace:"pre",minHeight:"1.7em",borderRadius:.5},children:w.text},p))})]});return d.jsxs(S,{spacing:1.5,children:[n&&d.jsx(I,{variant:"h6",color:"text.primary",children:n}),d.jsxs(S,{direction:"row",spacing:2,sx:{width:"100%"},children:[x(h,s,i("left"),"Left"),x(c,r,i("right"),"Right")]})]})}function M(o){return new Date(o).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}function A({requests:o,value:e,onChange:n,label:t="Select request"}){const l=C.useMemo(()=>o.find(s=>s.id===e)??null,[o,e]);return d.jsx(F,{options:o,value:l,onChange:(s,r)=>n((r==null?void 0:r.id)??null),getOptionLabel:s=>`${s.method.toUpperCase()} ${s.path} ${s.status} ${M(s.createdAt)}`,filterOptions:(s,r)=>{const u=r.inputValue.toLowerCase();return u?s.filter(i=>i.method.toLowerCase().includes(u)||i.path.toLowerCase().includes(u)||String(i.status).includes(u)):s},isOptionEqualToValue:(s,r)=>s.id===r.id,renderOption:(s,r)=>{const{key:u,...i}=s;return d.jsx("li",{...i,children:d.jsxs(S,{direction:"row",spacing:1,alignItems:"center",sx:{width:"100%",py:.5},children:[d.jsx($,{method:r.method}),d.jsx(I,{variant:"body2",sx:{flex:1,fontFamily:'"Fira Code", "JetBrains Mono", monospace',fontSize:"0.8rem"},noWrap:!0,children:r.path}),d.jsx(N,{status:r.status}),d.jsx(I,{variant:"caption",color:"text.secondary",noWrap:!0,sx:{minWidth:100,textAlign:"right"},children:M(r.createdAt)})]})},u)},renderInput:s=>d.jsx(V,{...s,label:t,size:"small"}),sx:{minWidth:300}})}function se(){const[o,e]=C.useState(null),[n,t]=C.useState(null),l=C.useMemo(()=>({cursorQueryKey:"cursor",getNextPageCursor(g){return g.meta.nextCursor}}),[]),s=E("GET /__rrroutes/requests",l),{data:r}=s.useEndpoint({query:{}}),u=H(r,{reverse:!0}),i=C.useMemo(()=>u.map(g=>({id:g.id,method:g.method,path:g.path,status:g.status,createdAt:g.createdAt})),[u]),h=E("GET /__rrroutes/requests/:requestId",{enabled:!!o}),c=E("GET /__rrroutes/requests/:requestId",{enabled:!!n}),{data:y}=h.useEndpoint({params:{requestId:o??void 0}}),{data:x}=c.useEndpoint({params:{requestId:n??void 0}}),a=y==null?void 0:y.out,f=x==null?void 0:x.out,m=!!(a&&f);return d.jsx(G,{title:"Diff",subtitle:"Compare two requests side by side.",children:d.jsxs(S,{spacing:3,children:[d.jsxs(S,{direction:{xs:"column",sm:"row"},spacing:2,children:[d.jsx(T,{sx:{flex:1},children:d.jsx(A,{requests:i,value:o,onChange:e,label:"Left request"})}),d.jsx(T,{sx:{flex:1},children:d.jsx(A,{requests:i,value:n,onChange:t,label:"Right request"})})]}),m?d.jsx(_,{initialTab:"Headers",tabs:{Headers:d.jsx(j,{left:a.headers,right:f.headers,title:"Headers"}),Params:d.jsx(j,{left:a.params,right:f.params,title:"Params"}),Body:d.jsx(j,{left:a.body,right:f.body,title:"Body"}),Response:d.jsx(j,{left:a.output,right:f.output,title:"Response"}),Timing:d.jsx(j,{left:{durationMs:a.durationMs,status:a.status,requestSize:a.requestSize,responseSize:a.responseSize},right:{durationMs:f.durationMs,status:f.status,requestSize:f.requestSize,responseSize:f.responseSize},title:"Timing"})}}):d.jsx(I,{variant:"body2",color:"text.secondary",children:"Select two requests above to compare them."})]})})}export{se as default};
@@ -0,0 +1 @@
1
+ import{j as o}from"./vendor-xyflow.js";import{R as t}from"./docs.js";const a=t(o.jsx("path",{d:"M5 20h14v-2H5zM19 9h-4V3H9v6H5l7 7z"}));export{a as D};
@@ -0,0 +1 @@
1
+ import{j as o}from"./vendor-xyflow.js";import{h as n}from"./vendor-recharts.js";import{E as O}from"./EndpointDetailPanel.js";import{u as _,n as D,a as R,o as U,p as x,q as w,r as L,s as P,S as b,C as $}from"./docs.js";import{P as A,T as N}from"./PageContainer.js";import{u as Y,a as M}from"./useEndpointOptions.js";import{A as Q}from"./Autocomplete.js";import"./SchemaTreeView.js";import"./ExpandLess.js";import"./getValidReactChildren.js";import"./filterTypes.js";function V(){const p=_(),{endpointId:h}=D(),s=h?decodeURIComponent(h):"",[i]=R(),d=i.get(U),[k,y]=n.useState(()=>x(d));n.useEffect(()=>{const e=x(d);y(t=>t===e?t:e)},[d]);const[v,f]=n.useState(s);n.useEffect(()=>{f(s)},[s]);const[I,g]=n.useState(""),{options:E,isLoading:T}=Y(I),r=n.useMemo(()=>w(s),[s]),c=(r==null?void 0:r.display)??s??"",{data:u}=M(c),l=n.useMemo(()=>{const e=[...E],t=a=>{a&&(e.some(m=>m.value===a.value)||e.push(a))};return t(r),t(u?L(u):void 0),e},[E,r,u]),S=i.get(P);n.useEffect(()=>{if(S==="playgroundMax"){const e=new URLSearchParams(i);e.delete(P);const t=c?`/playground/${encodeURIComponent(c)}`:"/playground",a=e.toString();p(a?`${t}?${a}`:t,{replace:!0})}},[S,p,i,c]);const C=n.useCallback(e=>{const t=i.toString(),a=`/routes/${encodeURIComponent(e)}`;p(t?`${a}?${t}`:a)},[p,i]),j=(e,t)=>{if(!t)return;const a=l.find(m=>m.value===t);a&&C(a.value)};return o.jsx(A,{title:"Endpoint details",subtitle:"Inspect endpoint contracts, history, and metrics.",children:o.jsxs(b,{spacing:3,children:[o.jsx($,{title:"Endpoint",children:o.jsx(b,{spacing:2,children:o.jsx(Q,{freeSolo:!0,options:l.map(e=>e.value),value:c,inputValue:v,loading:T,onChange:j,onInputChange:(e,t,a)=>{f(t),a==="input"&&g(t),(a==="clear"||a==="reset"&&t==="")&&g("")},getOptionLabel:e=>{const t=l.find(a=>a.value===e);return t?t.display:e},renderInput:e=>o.jsx(N,{...e,label:"Switch endpoint",placeholder:"GET /v1/example",helperText:"Search by method and path"})})})}),o.jsx(O,{endpointId:s})]})})}export{V as default};
@@ -0,0 +1 @@
1
+ import{j as e}from"./vendor-xyflow.js";import{h as v,A as L,C as R,X as w,Y as D,T as M,x as C}from"./vendor-recharts.js";import{b as S,t as T,d as E,e as A,C as F,S as o,T as c,v as B,w as z,H,j as N,x as _,y as G,z as I,h as P,B as Y,D as K,G as O}from"./docs.js";import{S as h}from"./SchemaTreeView.js";import{D as Q}from"./filterTypes.js";function $({method:t,path:r,onSelectRequest:i,onRequestsChange:a}){const[u,l]=v.useState(()=>({...Q,pageSize:10})),s=S("GET /__rrroutes/requests",{cursorQueryKey:"cursor",getNextPageCursor(g){var x;return(x=g.meta)==null?void 0:x.nextCursor},enabled:!!(t&&r)}).useEndpoint({query:{...u,endpointKeysInclude:r&&t?[T(t,r,!0)]:[]}}),{data:f,isLoading:j,error:y,refetch:n,isFetchingNextPage:m}=s,q=E(y,{messageFallback:"Failed to load requests.",refetch:n}),b=A(f,{reverse:!1});v.useEffect(()=>{a==null||a(b)},[b,a]);const k=(g,x)=>{i(g,x)};return e.jsx(F,{title:"Requests feed",children:e.jsx(o,{spacing:2,children:r&&t?e.jsx(B,{items:b,columns:z,query:u,stateHandler:{emptyFallback:{title:"No requests",description:"This endpoint has not received any requests yet."},error:q,isLoading:j,loading:{variant:"table"}},endpoint:s,setQuery:l,onRowClick:k}):e.jsx(c,{variant:"body2",color:"text.secondary",children:"Endpoint identifier missing."})})})}function U({endpoint:t}){return e.jsxs(o,{spacing:1,children:[e.jsxs(o,{direction:"row",spacing:1.5,alignItems:"center",flexWrap:"wrap",useFlexGap:!0,children:[e.jsx(H,{method:t.method}),e.jsx(c,{variant:"h6",sx:{fontFamily:"monospace",color:"text.primary"},children:t.path}),e.jsx(N,{label:t.stability,size:"small",color:"secondary",sx:{textTransform:"capitalize"}})]}),t.summary&&e.jsx(c,{variant:"body2",color:"text.secondary",children:t.summary})]})}function re({endpointId:t,showHeader:r=!0}){const{openRequestDetail:i}=_(),a=S("GET /__rrroutes/endpoints/:endpointId",{enabled:!!t}),u=v.useMemo(()=>{if(t==null)return;if(t.indexOf(" ")===-1)return t;const[n,m]=t.split(" ");return T(n,m,!0)},[t]),{data:l,isLoading:d,error:s,refetch:f}=a.useEndpoint({params:{endpointId:u}}),j=E(s,{messageFallback:"Unable to load endpoint.",refetch:f}),y=l==null?void 0:l.out;return e.jsx(e.Fragment,{children:e.jsx(G,{loading:{variant:"full"},emptyFallback:t?{title:"Endpoint not found",description:"This endpoint may have been removed."}:{title:"Select an endpoint",description:"Choose an endpoint from the list to inspect its contract and metrics."},data:y,error:j,isLoading:d,children:n=>e.jsxs(o,{spacing:1,children:[r&&e.jsx(U,{endpoint:n}),e.jsx(I,{initialTab:"Request",tabs:{Request:e.jsx(V,{endpoint:n}),Response:e.jsx(W,{endpoint:n}),Meta:e.jsx(X,{endpoint:n}),Metrics:e.jsx(J,{endpoint:n,onSelectRequest:m=>i({requestId:m.id,allowReplay:!0}),onRequestsChange:()=>{}})}})]})})})}function V({endpoint:t}){return e.jsxs(o,{spacing:2.5,children:[e.jsx(h,{title:"Body",schema:t.contract.body}),e.jsx(h,{title:"Params",schema:t.contract.params}),e.jsx(h,{title:"Query",schema:t.contract.query})]})}function W({endpoint:t}){return e.jsx(h,{title:"Response",schema:t.contract.output})}function X({endpoint:t}){const r=Object.entries(t.meta||{});return e.jsxs(o,{spacing:2,children:[e.jsx(p,{label:"Feed",value:t.feed?"Yes":"No"}),e.jsx(p,{label:"Implemented",value:t.implemented?"Yes":"No"}),e.jsx(p,{label:"Hidden",value:t.hidden?"Yes":"No"}),r.length>0&&e.jsxs(O,{children:[e.jsx(c,{variant:"subtitle2",gutterBottom:!0,children:"Metadata"}),e.jsx(o,{spacing:1,children:r.map(([i,a])=>e.jsx(p,{label:i,value:a},i))})]})]})}function J({endpoint:t,onSelectRequest:r,onRequestsChange:i}){var d;const a=P(),u=typeof t.successRate=="number"?`${Math.round(t.successRate*100)}%`:"—",l=t.averageDurationMs?`${Math.round(t.averageDurationMs)} ms`:"—";return e.jsxs(o,{spacing:3,children:[e.jsx(Y,{stats:[{label:"Avg duration",value:l},{label:"Success rate",value:u}]}),e.jsx(K,{charts:[{title:"Request volume",chart:e.jsxs(L,{data:t.volumeTS.map(s=>({...s,date:new Date(s.timestamp)})),children:[e.jsx(R,{stroke:"rgba(255,255,255,0.1)",strokeDasharray:"3 3"}),e.jsx(w,{dataKey:"date",tickFormatter:s=>new Date(s).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}),tick:{fill:a.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1}),e.jsx(D,{tick:{fill:a.palette.text.secondary,fontSize:12},axisLine:!1,tickLine:!1,allowDecimals:!1}),e.jsx(M,{labelFormatter:s=>new Date(s).toLocaleString(),formatter:s=>[`${s} requests`,"Volume"],contentStyle:{backgroundColor:a.palette.background.paper,borderColor:a.palette.divider}}),e.jsx(C,{type:"monotone",dataKey:"count",stroke:a.palette.primary.main,fill:a.palette.primary.main,fillOpacity:.22,strokeWidth:2})]})}]}),(d=t.latestErrors)!=null&&d.length?e.jsx(F,{title:"Latest error request IDs",children:e.jsx(o,{spacing:.5,children:t.latestErrors.map(s=>e.jsx(c,{variant:"body2",sx:{fontFamily:"monospace"},children:s.id},s.id))})}):null,e.jsx($,{method:t.method,path:t.path,onSelectRequest:r,onRequestsChange:i})]})}function p({label:t,value:r}){return e.jsxs(o,{direction:"row",spacing:1,justifyContent:"space-between",children:[e.jsx(c,{variant:"body2",color:"text.secondary",children:t}),e.jsx(c,{variant:"body2",sx:{fontFamily:"monospace",color:"text.primary"},children:r})]})}export{re as E};