@emeryld/rrroutes-openapi 2.3.2 → 2.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/LeafDocsPage.d.ts +3 -5
- package/dist/docs/docs.d.ts +1 -2
- package/dist/docs/schemaIntrospection.d.ts +3 -12
- package/dist/docs/serializer.d.ts +4 -19
- package/dist/index.cjs +78 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -23
- package/dist/index.mjs +78 -61
- package/dist/index.mjs.map +1 -1
- package/dist/public/assets/docs.css +1 -0
- package/dist/public/assets/docs.js +51 -139
- package/dist/web/main.d.ts +1 -1
- package/dist/web/utils/types.d.ts +2 -2
- package/dist/web/v2/endpoints/EndpointList.d.ts +1 -1
- package/dist/web/v2/endpoints/EndpointsPage.d.ts +3 -0
- package/dist/web/v2/types/types.cacheLog.d.ts +56 -54
- package/dist/web/v2/types/types.endpoint.d.ts +39 -30
- package/dist/web/v2/types/types.log.d.ts +4 -4
- package/dist/web/v2/types/types.preset.d.ts +14 -14
- package/dist/web/v2/types/types.requestLog.d.ts +23 -13
- package/package.json +5 -4
- package/dist/web/v2/stores/endpointsStore.d.ts +0 -20
- package/dist/web/v2/stores/logsStore.d.ts +0 -5
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract';
|
|
2
1
|
import type { ReactElement } from 'react';
|
|
3
2
|
export interface RenderOptions {
|
|
4
3
|
/** CSP nonce applied to data + script tags. */
|
|
@@ -9,14 +8,13 @@ export interface RenderOptions {
|
|
|
9
8
|
docsBasePath?: string;
|
|
10
9
|
}
|
|
11
10
|
type DocsDocumentProps = {
|
|
12
|
-
leavesJson: string;
|
|
13
11
|
assetBase: string;
|
|
14
12
|
docsBase: string;
|
|
15
13
|
cspNonce?: string;
|
|
16
14
|
};
|
|
17
|
-
export declare const DocsDocument: ({
|
|
18
|
-
export declare function createLeafDocsDocument(
|
|
19
|
-
export declare function renderLeafDocsHTML(
|
|
15
|
+
export declare const DocsDocument: ({ assetBase, docsBase, cspNonce, }: DocsDocumentProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare function createLeafDocsDocument(options?: RenderOptions): ReactElement;
|
|
17
|
+
export declare function renderLeafDocsHTML(options?: RenderOptions): string;
|
|
20
18
|
export type SerializableHistoryEntry = {
|
|
21
19
|
id?: string;
|
|
22
20
|
timestamp: number;
|
package/dist/docs/docs.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract';
|
|
2
1
|
import { RenderOptions } from './LeafDocsPage.js';
|
|
3
|
-
export declare function renderLeafDocsHTML(
|
|
2
|
+
export declare function renderLeafDocsHTML(options?: RenderOptions): string;
|
|
4
3
|
export { createLeafDocsDocument } from './LeafDocsPage.js';
|
|
5
4
|
export type { RenderOptions } from './LeafDocsPage.js';
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
import * as z from 'zod';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
optional?: boolean;
|
|
5
|
-
nullable?: boolean;
|
|
6
|
-
description?: string;
|
|
7
|
-
properties?: Record<string, SerializableSchemaNode>;
|
|
8
|
-
element?: SerializableSchemaNode;
|
|
9
|
-
union?: SerializableSchemaNode[];
|
|
10
|
-
literal?: unknown;
|
|
11
|
-
enumValues?: string[];
|
|
12
|
-
};
|
|
2
|
+
import type { SerializableSchema } from '../web/v2/types/types.endpoint.js';
|
|
3
|
+
export type SerializableSchemaNode = SerializableSchema;
|
|
13
4
|
type ZodAny = z.ZodTypeAny;
|
|
14
|
-
export declare function introspectSchema(schema: ZodAny | undefined):
|
|
5
|
+
export declare function introspectSchema(schema: ZodAny | undefined): SerializableSchema | undefined;
|
|
15
6
|
export {};
|
|
@@ -1,20 +1,5 @@
|
|
|
1
|
-
import { type AnyLeafLowProfile
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
type SerializableMethodCfg = Pick<MethodCfg, 'description' | 'summary' | 'docsGroup' | 'tags' | 'deprecated' | 'stability' | 'feed' | 'docsMeta'> & {
|
|
5
|
-
hasBody: boolean;
|
|
6
|
-
hasQuery: boolean;
|
|
7
|
-
hasParams: boolean;
|
|
8
|
-
hasOutput: boolean;
|
|
9
|
-
bodySchema?: SerializableSchemaNode;
|
|
10
|
-
querySchema?: SerializableSchemaNode;
|
|
11
|
-
paramsSchema?: SerializableSchemaNode;
|
|
12
|
-
outputSchema?: SerializableSchemaNode;
|
|
13
|
-
};
|
|
14
|
-
export type SerializedLeaf = {
|
|
15
|
-
method: MethodType;
|
|
16
|
-
path: string;
|
|
17
|
-
cfg: SerializableMethodCfg;
|
|
18
|
-
};
|
|
1
|
+
import { type AnyLeafLowProfile } from '@emeryld/rrroutes-contract';
|
|
2
|
+
import type { Endpoint } from '../web/v2/types/types.endpoint.js';
|
|
3
|
+
export type SerializedLeaf = Endpoint;
|
|
19
4
|
export type { SerializableSchemaNode } from './schemaIntrospection.js';
|
|
20
|
-
export declare function serializeLeaf(leaf: AnyLeafLowProfile):
|
|
5
|
+
export declare function serializeLeaf(leaf: AnyLeafLowProfile): Endpoint;
|
package/dist/index.cjs
CHANGED
|
@@ -178,30 +178,54 @@ function inferKind(schema) {
|
|
|
178
178
|
function serializeLeaf(leaf) {
|
|
179
179
|
const cfg = leaf.cfg;
|
|
180
180
|
const tags = Array.isArray(cfg.tags) ? cfg.tags.slice() : [];
|
|
181
|
+
const stability = cfg.stability ?? "experimental";
|
|
182
|
+
const now = Date.now();
|
|
181
183
|
return {
|
|
184
|
+
id: buildLeafId(leaf),
|
|
185
|
+
name: inferName(cfg, leaf.path),
|
|
186
|
+
description: cfg.description,
|
|
187
|
+
groupId: cfg.docsGroup,
|
|
188
|
+
tags: tags.length > 0 ? tags : void 0,
|
|
189
|
+
createdAt: now,
|
|
190
|
+
updatedAt: now,
|
|
182
191
|
method: leaf.method,
|
|
183
|
-
// 'get' | 'post' | ...
|
|
184
192
|
path: leaf.path,
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
hasOutput: !!cfg.outputSchema,
|
|
198
|
-
bodySchema: cfg.bodySchema ? introspectSchema((0, import_rrroutes_contract.routeSchemaParse)(cfg.bodySchema)) : void 0,
|
|
199
|
-
querySchema: cfg.querySchema ? introspectSchema((0, import_rrroutes_contract.routeSchemaParse)(cfg.querySchema)) : void 0,
|
|
200
|
-
paramsSchema: cfg.paramsSchema ? introspectSchema((0, import_rrroutes_contract.routeSchemaParse)(cfg.paramsSchema)) : void 0,
|
|
201
|
-
outputSchema: cfg.outputSchema ? introspectSchema((0, import_rrroutes_contract.routeSchemaParse)(cfg.outputSchema)) : void 0
|
|
202
|
-
}
|
|
193
|
+
contract: {
|
|
194
|
+
body: serializeContractSchema(cfg.bodySchema),
|
|
195
|
+
query: serializeContractSchema(cfg.querySchema),
|
|
196
|
+
params: serializeContractSchema(cfg.paramsSchema),
|
|
197
|
+
output: serializeContractSchema(cfg.outputSchema),
|
|
198
|
+
bodyFiles: serializeBodyFiles(cfg)
|
|
199
|
+
},
|
|
200
|
+
feed: cfg.feed ?? void 0,
|
|
201
|
+
summary: cfg.summary,
|
|
202
|
+
stability,
|
|
203
|
+
hidden: cfg.docsHidden,
|
|
204
|
+
meta: serializeMeta(cfg.docsMeta)
|
|
203
205
|
};
|
|
204
206
|
}
|
|
207
|
+
function serializeContractSchema(schema) {
|
|
208
|
+
return schema ? introspectSchema((0, import_rrroutes_contract.routeSchemaParse)(schema)) : void 0;
|
|
209
|
+
}
|
|
210
|
+
function serializeBodyFiles(cfg) {
|
|
211
|
+
if (!Array.isArray(cfg.bodyFiles) || cfg.bodyFiles.length === 0)
|
|
212
|
+
return void 0;
|
|
213
|
+
return cfg.bodyFiles.map(({ name, maxCount }) => ({ name, maxCount }));
|
|
214
|
+
}
|
|
215
|
+
function serializeMeta(meta) {
|
|
216
|
+
if (!meta) return {};
|
|
217
|
+
const entries = Object.entries(meta).filter(([, value]) => value !== void 0 && value !== null).map(([key, value]) => [
|
|
218
|
+
key,
|
|
219
|
+
typeof value === "string" ? value : JSON.stringify(value)
|
|
220
|
+
]);
|
|
221
|
+
return Object.fromEntries(entries);
|
|
222
|
+
}
|
|
223
|
+
function buildLeafId(leaf) {
|
|
224
|
+
return `${leaf.method.toUpperCase()} ${leaf.path}`;
|
|
225
|
+
}
|
|
226
|
+
function inferName(cfg, path2) {
|
|
227
|
+
return cfg.summary || cfg.description || path2;
|
|
228
|
+
}
|
|
205
229
|
|
|
206
230
|
// src/docs/LeafDocsPage.tsx
|
|
207
231
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -216,7 +240,6 @@ function normalizeDocsBase(base) {
|
|
|
216
240
|
return base.endsWith("/") && base.length > 1 ? base.slice(0, -1) : base;
|
|
217
241
|
}
|
|
218
242
|
var DocsDocument = ({
|
|
219
|
-
leavesJson,
|
|
220
243
|
assetBase,
|
|
221
244
|
docsBase,
|
|
222
245
|
cspNonce
|
|
@@ -224,7 +247,8 @@ var DocsDocument = ({
|
|
|
224
247
|
const cssHref = `${assetBase}/docs.css`;
|
|
225
248
|
const jsSrc = `${assetBase}/docs.js`;
|
|
226
249
|
const configJson = serializeConfig({
|
|
227
|
-
docsBasePath: docsBase
|
|
250
|
+
docsBasePath: docsBase,
|
|
251
|
+
cspNonce
|
|
228
252
|
});
|
|
229
253
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("html", { lang: "en", children: [
|
|
230
254
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("head", { children: [
|
|
@@ -235,15 +259,6 @@ var DocsDocument = ({
|
|
|
235
259
|
] }),
|
|
236
260
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("body", { children: [
|
|
237
261
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { id: "docs-root" }),
|
|
238
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
239
|
-
"script",
|
|
240
|
-
{
|
|
241
|
-
id: "leaf-data",
|
|
242
|
-
type: "application/json",
|
|
243
|
-
nonce: cspNonce,
|
|
244
|
-
dangerouslySetInnerHTML: { __html: leavesJson }
|
|
245
|
-
}
|
|
246
|
-
),
|
|
247
262
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
248
263
|
"script",
|
|
249
264
|
{
|
|
@@ -257,35 +272,30 @@ var DocsDocument = ({
|
|
|
257
272
|
] })
|
|
258
273
|
] });
|
|
259
274
|
};
|
|
260
|
-
function serializeLeaves(leaves2) {
|
|
261
|
-
return JSON.stringify(leaves2.map(serializeLeaf)).replace(/<\//g, "<\\/");
|
|
262
|
-
}
|
|
263
275
|
function serializeConfig(config) {
|
|
264
276
|
return JSON.stringify(config).replace(/<\//g, "<\\/");
|
|
265
277
|
}
|
|
266
|
-
function createLeafDocsDocument(
|
|
278
|
+
function createLeafDocsDocument(options = {}) {
|
|
267
279
|
const assetBase = normalizeBase(options.assetBasePath ?? DEFAULT_ASSET_BASE);
|
|
268
|
-
const leavesJson = serializeLeaves(leaves2);
|
|
269
280
|
const docsBase = normalizeDocsBase(options.docsBasePath);
|
|
270
281
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
271
282
|
DocsDocument,
|
|
272
283
|
{
|
|
273
|
-
leavesJson,
|
|
274
284
|
assetBase,
|
|
275
285
|
docsBase,
|
|
276
286
|
cspNonce: options.cspNonce
|
|
277
287
|
}
|
|
278
288
|
);
|
|
279
289
|
}
|
|
280
|
-
function renderLeafDocsHTML(
|
|
281
|
-
const doc = createLeafDocsDocument(
|
|
290
|
+
function renderLeafDocsHTML(options = {}) {
|
|
291
|
+
const doc = createLeafDocsDocument(options);
|
|
282
292
|
const html = (0, import_server.renderToStaticMarkup)(doc);
|
|
283
293
|
return `<!DOCTYPE html>${html}`;
|
|
284
294
|
}
|
|
285
295
|
|
|
286
296
|
// src/docs/docs.ts
|
|
287
|
-
function renderLeafDocsHTML2(
|
|
288
|
-
return renderLeafDocsHTML(
|
|
297
|
+
function renderLeafDocsHTML2(options = {}) {
|
|
298
|
+
return renderLeafDocsHTML(options);
|
|
289
299
|
}
|
|
290
300
|
|
|
291
301
|
// src/web/utils/security.ts
|
|
@@ -486,9 +496,12 @@ var cacheLeaves = (0, import_rrroutes_contract2.resource)("cache").get({
|
|
|
486
496
|
outputMetaSchema: import_zod2.default.object({
|
|
487
497
|
totalCount: import_zod2.default.number().optional()
|
|
488
498
|
})
|
|
489
|
-
}).
|
|
490
|
-
|
|
491
|
-
|
|
499
|
+
}).sub(
|
|
500
|
+
(0, import_rrroutes_contract2.resource)("clear").post({
|
|
501
|
+
outputSchema: import_zod2.default.object({ success: import_zod2.default.boolean() }),
|
|
502
|
+
querySchema: cacheLogQuerySchema
|
|
503
|
+
}).done()
|
|
504
|
+
).done();
|
|
492
505
|
|
|
493
506
|
// src/web/v2/types/types.endpoint.ts
|
|
494
507
|
var import_rrroutes_contract5 = require("@emeryld/rrroutes-contract");
|
|
@@ -530,7 +543,9 @@ var requestSchema = baseEntitySchema.extend({
|
|
|
530
543
|
output: import_zod4.default.any().optional(),
|
|
531
544
|
headers: import_zod4.default.record(import_zod4.default.string(), import_zod4.default.any()).optional(),
|
|
532
545
|
error: import_zod4.default.string().optional(),
|
|
533
|
-
durationMs: import_zod4.default.number()
|
|
546
|
+
durationMs: import_zod4.default.number(),
|
|
547
|
+
ip: import_zod4.default.string().optional(),
|
|
548
|
+
userAgent: import_zod4.default.string().optional()
|
|
534
549
|
});
|
|
535
550
|
var requestQuerySchema = baseQuerySchema.extend({
|
|
536
551
|
methods: import_zod4.default.enum(METHODS).array().default([]),
|
|
@@ -560,10 +575,17 @@ var nodeKind = [
|
|
|
560
575
|
"object",
|
|
561
576
|
"string",
|
|
562
577
|
"number",
|
|
578
|
+
"boolean",
|
|
579
|
+
"bigint",
|
|
580
|
+
"date",
|
|
563
581
|
"array",
|
|
564
582
|
"enum",
|
|
565
583
|
"literal",
|
|
566
|
-
"union"
|
|
584
|
+
"union",
|
|
585
|
+
"record",
|
|
586
|
+
"tuple",
|
|
587
|
+
"unknown",
|
|
588
|
+
"any"
|
|
567
589
|
];
|
|
568
590
|
var serializableSchemaSchema = import_zod5.default.lazy(
|
|
569
591
|
() => import_zod5.default.object({
|
|
@@ -598,13 +620,14 @@ var endpointSchema = baseEntitySchema.extend({
|
|
|
598
620
|
query: serializableSchemaSchema.optional(),
|
|
599
621
|
output: serializableSchemaSchema.optional(),
|
|
600
622
|
params: serializableSchemaSchema.optional(),
|
|
601
|
-
bodyFiles: import_zod5.default.object({ name: import_zod5.default.string(), maxCount: import_zod5.default.number() })
|
|
623
|
+
bodyFiles: import_zod5.default.array(import_zod5.default.object({ name: import_zod5.default.string(), maxCount: import_zod5.default.number() })).optional()
|
|
602
624
|
}),
|
|
603
625
|
feed: import_zod5.default.boolean().optional(),
|
|
604
626
|
summary: import_zod5.default.string().optional(),
|
|
605
627
|
stability: stabilityEnum,
|
|
606
628
|
hidden: import_zod5.default.boolean().optional(),
|
|
607
|
-
meta: import_zod5.default.record(import_zod5.default.string(), import_zod5.default.string())
|
|
629
|
+
meta: import_zod5.default.record(import_zod5.default.string(), import_zod5.default.string()),
|
|
630
|
+
implemented: import_zod5.default.boolean().optional()
|
|
608
631
|
});
|
|
609
632
|
var endpointFilterSchema = baseQuerySchema.extend({
|
|
610
633
|
methods: import_zod5.default.enum(METHODS).array().optional(),
|
|
@@ -664,7 +687,7 @@ var presetLeaves = (0, import_rrroutes_contract6.resource)("presets").get({
|
|
|
664
687
|
outputMetaSchema: import_zod6.default.object({
|
|
665
688
|
totalCount: import_zod6.default.number().optional()
|
|
666
689
|
}),
|
|
667
|
-
outputSchema: presetSchema
|
|
690
|
+
outputSchema: presetSchema.array()
|
|
668
691
|
}).post({
|
|
669
692
|
bodySchema: presetSchema,
|
|
670
693
|
outputSchema: presetSchema
|
|
@@ -675,7 +698,7 @@ var presetLeaves = (0, import_rrroutes_contract6.resource)("presets").get({
|
|
|
675
698
|
|
|
676
699
|
// src/web/utils/types.ts
|
|
677
700
|
var allLeaves = (0, import_rrroutes_contract7.resource)().sub(
|
|
678
|
-
(0, import_rrroutes_contract7.resource)("
|
|
701
|
+
(0, import_rrroutes_contract7.resource)("/__rrroutes").sub(
|
|
679
702
|
endpointLeaves,
|
|
680
703
|
requestLogLeaves,
|
|
681
704
|
logLeaves,
|
|
@@ -696,7 +719,6 @@ function resolvePublicDir() {
|
|
|
696
719
|
}
|
|
697
720
|
function mountRRRoutesDocs({
|
|
698
721
|
router,
|
|
699
|
-
leaves: leaves2,
|
|
700
722
|
auth = {}
|
|
701
723
|
}) {
|
|
702
724
|
const docsPath = "/__rrroutes/docs";
|
|
@@ -723,14 +745,11 @@ function mountRRRoutesDocs({
|
|
|
723
745
|
const docsRoutePaths = [docsPath, `${docsPath}/`, `${docsPath}/*id`];
|
|
724
746
|
router.get(docsRoutePaths, (_req, res) => {
|
|
725
747
|
const nonce = cspEnabled ? (0, import_crypto.randomBytes)(16).toString("base64") : void 0;
|
|
726
|
-
const html = renderLeafDocsHTML2(
|
|
727
|
-
|
|
728
|
-
{
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
docsBasePath: `${docsPath}`
|
|
732
|
-
}
|
|
733
|
-
);
|
|
748
|
+
const html = renderLeafDocsHTML2({
|
|
749
|
+
cspNonce: nonce,
|
|
750
|
+
assetBasePath: `${`${docsPath}/assets`}`,
|
|
751
|
+
docsBasePath: `${docsPath}`
|
|
752
|
+
});
|
|
734
753
|
applyDocsSecurityHeaders(res);
|
|
735
754
|
if (cspEnabled && nonce) {
|
|
736
755
|
res.setHeader(
|
|
@@ -750,9 +769,7 @@ function mountRRRoutesDocs({
|
|
|
750
769
|
}
|
|
751
770
|
res.send(html);
|
|
752
771
|
});
|
|
753
|
-
return
|
|
754
|
-
path: docsPath
|
|
755
|
-
};
|
|
772
|
+
return docsPath;
|
|
756
773
|
}
|
|
757
774
|
// Annotate the CommonJS export names for ESM import in node:
|
|
758
775
|
0 && (module.exports = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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/utils/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"],"sourcesContent":["// index.ts\n\nimport type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract'\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 z from 'zod'\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 /** Turn auth on/off. Enabled by default. */\n enabled?: boolean\n /** Password to require for docs access (HTTP Basic). */\n password?: string\n /** Realm used for the HTTP Basic challenge prompt. */\n realm?: string\n /**\n * Allow list of client IPs for docs access.\n * Supports:\n * - exact IPv4 or IPv6 strings (e.g. \"127.0.0.1\", \"::1\")\n * - IPv4 CIDR (e.g. \"10.0.0.0/8\", \"192.168.1.0/24\")\n */\n allowedIps?: string[]\n /**\n * Name of cookie used for cookie-based docs auth.\n * Requires `cookie-parser` or equivalent to populate `req.cookies`.\n */\n cookieName?: string\n /**\n * Optional exact value required for the cookie.\n * If omitted, the cookie only needs to exist (non-empty).\n */\n cookieSecret?: string\n /**\n * Fully custom guard middleware. If provided, it is used\n * instead of password/cookie auth (IP allow list still applies).\n */\n guardMiddleware?: RequestHandler\n /**\n * Whether to emit a CSP header + nonce. Defaults to true.\n */\n csp?: boolean\n}\n\nexport type Preset<L extends AnyLeafLowProfile> = L extends infer A extends\n AnyLeafLowProfile\n ? {\n method: A['method']\n path: A['path']\n // pre-set values for schemas. Does not have to be complete.\n body?: z.output<A['cfg']['bodySchema']>\n query?: z.output<A['cfg']['querySchema']>\n params?: z.output<A['cfg']['paramsSchema']>\n }\n : never\n\nexport type PresetGroup<L extends AnyLeafLowProfile> = {\n name: string\n description?: string\n tags: string[]\n docsGroup?: string\n\n ops: Preset<L>[]\n}\n\nexport type MountDocsArgs<L extends AnyLeafLowProfile> = {\n router: Router\n leaves: L[]\n presets?: PresetGroup<L>[]\n auth: DocsAuthOptions\n}\n\nexport type MountDocsResult = {\n path: string\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<L extends AnyLeafLowProfile>({\n router,\n leaves,\n auth = {},\n}: MountDocsArgs<L>): MountDocsResult {\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 leaves.filter((leaf) => leaf.cfg.docsHidden !== true),\n {\n cspNonce: nonce,\n assetBasePath: `${`${docsPath}/assets`}`,\n docsBasePath: `${docsPath}`,\n },\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 {\n path: docsPath,\n }\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","// 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 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\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 leavesJson: string\n assetBase: string\n docsBase: string\n cspNonce?: string\n}\n\nexport const DocsDocument = ({\n leavesJson,\n assetBase,\n docsBase,\n cspNonce,\n}: DocsDocumentProps) => {\n const cssHref = `${assetBase}/docs.css`\n const jsSrc = `${assetBase}/docs.js`\n const configJson = serializeConfig({\n docsBasePath: docsBase,\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=\"leaf-data\"\n type=\"application/json\"\n nonce={cspNonce}\n dangerouslySetInnerHTML={{ __html: leavesJson }}\n />\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}\n\nfunction serializeConfig(config: DocsConfig) {\n return JSON.stringify(config).replace(/<\\//g, '<\\\\/')\n}\n\nexport function createLeafDocsDocument(\n leaves: AnyLeafLowProfile[],\n options: RenderOptions = {},\n): ReactElement {\n const assetBase = normalizeBase(options.assetBasePath ?? DEFAULT_ASSET_BASE)\n const leavesJson = serializeLeaves(leaves)\n\n const docsBase = normalizeDocsBase(options.docsBasePath)\n\n return (\n <DocsDocument\n leavesJson={leavesJson}\n assetBase={assetBase}\n docsBase={docsBase}\n cspNonce={options.cspNonce}\n />\n )\n}\n\nexport function renderLeafDocsHTML(\n leaves: AnyLeafLowProfile[],\n options: RenderOptions = {},\n): string {\n const doc = createLeafDocsDocument(leaves, 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 routeSchemaParse,\n type AnyLeafLowProfile,\n type MethodCfg,\n} from '@emeryld/rrroutes-contract'\nimport { MethodType } from '../web/v2/types/types.base.js'\nimport {\n introspectSchema,\n SerializableSchemaNode,\n} from './schemaIntrospection.js'\n\ntype SerializableMethodCfg = Pick<\n MethodCfg,\n | 'description'\n | 'summary'\n | 'docsGroup'\n | 'tags'\n | 'deprecated'\n | 'stability'\n | 'feed'\n | 'docsMeta'\n> & {\n hasBody: boolean\n hasQuery: boolean\n hasParams: boolean\n hasOutput: boolean\n\n // NEW: full Zod ASTs\n bodySchema?: SerializableSchemaNode\n querySchema?: SerializableSchemaNode\n paramsSchema?: SerializableSchemaNode\n outputSchema?: SerializableSchemaNode\n}\n\nexport type SerializedLeaf = {\n method: MethodType\n path: string\n cfg: SerializableMethodCfg\n}\n\nexport type { SerializableSchemaNode } from './schemaIntrospection.js'\n\nexport function serializeLeaf(leaf: AnyLeafLowProfile): SerializedLeaf {\n const cfg = leaf.cfg\n\n const tags = Array.isArray(cfg.tags) ? cfg.tags.slice() : []\n\n return {\n method: leaf.method, // 'get' | 'post' | ...\n path: leaf.path,\n cfg: {\n description: cfg.description,\n summary: cfg.summary,\n docsGroup: cfg.docsGroup,\n tags,\n deprecated: cfg.deprecated,\n stability: cfg.stability,\n feed: !!cfg.feed,\n docsMeta: cfg.docsMeta,\n hasBody: !!cfg.bodySchema || !!cfg.bodyFiles?.length,\n hasQuery: !!cfg.querySchema,\n hasParams: !!cfg.paramsSchema,\n hasOutput: !!cfg.outputSchema,\n\n bodySchema: cfg.bodySchema\n ? introspectSchema(routeSchemaParse(cfg.bodySchema))\n : undefined,\n querySchema: cfg.querySchema\n ? introspectSchema(routeSchemaParse(cfg.querySchema))\n : undefined,\n paramsSchema: cfg.paramsSchema\n ? introspectSchema(routeSchemaParse(cfg.paramsSchema))\n : undefined,\n outputSchema: cfg.outputSchema\n ? introspectSchema(routeSchemaParse(cfg.outputSchema))\n : undefined,\n },\n }\n}\n","// schemaIntrospection.ts\nimport * as z from 'zod'\n\nexport type SerializableSchemaNode = {\n kind: string // \"object\" | \"string\" | \"number\" | ...\n optional?: boolean\n nullable?: boolean\n description?: string\n\n // object\n properties?: Record<string, SerializableSchemaNode>\n // array\n element?: SerializableSchemaNode\n // union\n union?: SerializableSchemaNode[]\n // literal\n literal?: unknown\n // enum\n enumValues?: string[]\n}\n\ntype ZodAny = z.ZodTypeAny\n\n/**\n * Zod 3 uses `schema._def`, Zod 4 uses `schema._zod.def`.\n */\nfunction getDef(schema: unknown): any | undefined {\n if (!schema || typeof schema !== 'object') return undefined\n const anySchema = schema as any\n return anySchema._zod?.def ?? anySchema._def\n}\n\n/**\n * Try to get a human-readable description.\n * Zod 4: use metadata/registry; fallback to internal def.description.\n * Zod 3: only internal def.description exists.\n */\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\n // Zod 4 global registry metadata, if present\n const registry = anyZ.globalRegistry?.get\n ? anyZ.globalRegistry.get(schema)\n : undefined\n if (registry && typeof registry.description === 'string') {\n return registry.description\n }\n\n // Legacy / internal description\n const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\n\n/**\n * Peel off wrappers (effects, optional, nullable, default) and\n * return the inner schema + flags.\n *\n * Supports:\n * - Zod 3: ZodEffects, ZodOptional, ZodNullable, ZodDefault\n * - Zod 4: ZodOptional, ZodNullable, ZodDefault\n */\nfunction unwrap(schema: ZodAny): {\n base: ZodAny\n optional: boolean\n nullable: boolean\n} {\n let s: ZodAny = schema\n let optional = false\n let nullable = false\n\n // Zod 3 only (undefined in Zod 4)\n const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Zod 3: ZodEffects wrapper\n if (ZodEffectsCtor && s instanceof ZodEffectsCtor) {\n const def = getDef(s) || {}\n const sourceType =\n typeof (s as any).sourceType === 'function'\n ? (s as any).sourceType()\n : def.schema\n if (!sourceType) break\n s = sourceType\n continue\n }\n\n // Zod 3 + 4: optional/nullable/default wrappers\n if (s instanceof z.ZodOptional) {\n optional = true\n const def = getDef(s)\n s = (def && def.innerType) || s // innerType exists in both 3 & 4\n continue\n }\n\n if (s instanceof z.ZodNullable) {\n nullable = true\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n if (s instanceof z.ZodDefault) {\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n break\n }\n\n return { base: s, optional, nullable }\n}\n\nexport function introspectSchema(\n schema: ZodAny | undefined,\n): SerializableSchemaNode | undefined {\n if (!schema) return undefined\n\n const { base, optional, nullable } = unwrap(schema)\n const def = getDef(base)\n\n const node: SerializableSchemaNode = {\n kind: inferKind(base),\n optional: optional || undefined,\n nullable: nullable || undefined,\n description: getDescription(base),\n }\n\n // OBJECT\n if (base instanceof z.ZodObject) {\n // Zod 3: _def.shape() (function)\n // Zod 4: .shape getter returns an object\n const rawShape: any =\n (base as any).shape ??\n (def && typeof def.shape === 'function' ? def.shape() : def?.shape)\n\n const shape = typeof rawShape === 'function' ? rawShape() : (rawShape ?? {})\n\n const props: Record<string, SerializableSchemaNode> = {}\n for (const key of Object.keys(shape)) {\n const child = shape[key] as ZodAny\n const childNode = introspectSchema(child)\n if (childNode) props[key] = childNode\n }\n node.properties = props\n }\n\n // ARRAY\n if (base instanceof z.ZodArray) {\n // Zod 3: def.type is inner schema\n // Zod 4: def.element is inner schema\n const inner =\n (def && (def.element as ZodAny)) ||\n (def && (def.type as ZodAny)) ||\n undefined\n if (inner) {\n node.element = introspectSchema(inner)\n }\n }\n\n // UNION\n if (base instanceof z.ZodUnion) {\n const options: ZodAny[] = (def && def.options) || []\n node.union = options\n .map((opt) => introspectSchema(opt))\n .filter(Boolean) as SerializableSchemaNode[]\n }\n\n // LITERAL\n if (base instanceof z.ZodLiteral) {\n if (def) {\n // Zod 4: def.values (multi-literal)\n if (Array.isArray(def.values)) {\n node.literal =\n def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\n // Zod 3: def.value\n node.literal = def.value\n }\n }\n }\n\n // ENUM\n if (base instanceof z.ZodEnum) {\n if (def) {\n if (Array.isArray(def.values)) {\n // Zod 3\n node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\n // Zod 4: entries is a { key: value } map\n node.enumValues = Object.values(def.entries).map((v: unknown) =>\n String(v),\n )\n }\n }\n }\n\n return node\n}\n\nfunction inferKind(schema: ZodAny): string {\n // This path still uses instanceof; it works with Zod 4 Classic\n // (importing from \"zod\"). Anything unknown falls back to \"unknown\".\n if (schema instanceof z.ZodString) return 'string'\n if (schema instanceof z.ZodNumber) return 'number'\n if (schema instanceof z.ZodBoolean) return 'boolean'\n if (schema instanceof z.ZodBigInt) return 'bigint'\n if (schema instanceof z.ZodDate) return 'date'\n if (schema instanceof z.ZodArray) return 'array'\n if (schema instanceof z.ZodObject) return 'object'\n if (schema instanceof z.ZodUnion) return 'union'\n if (schema instanceof z.ZodLiteral) return 'literal'\n if (schema instanceof z.ZodEnum) return 'enum'\n if (schema instanceof z.ZodRecord) return 'record'\n if (schema instanceof z.ZodTuple) return 'tuple'\n if (schema instanceof z.ZodUnknown) return 'unknown'\n if (schema instanceof z.ZodAny) return 'any'\n\n return 'unknown'\n}\n","// renderLeafDocsHTML.ts\nimport type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract'\nimport {\n renderLeafDocsHTML as LeafDocsPage,\n RenderOptions,\n} from './LeafDocsPage.js'\n\nexport function renderLeafDocsHTML(\n leaves: AnyLeafLowProfile[],\n options: RenderOptions = {},\n): string {\n return LeafDocsPage(leaves, 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 AugmentLeaves,\n AnyLeafLowProfile,\n finalize,\n FinalizedRegistry,\n resource,\n} from '@emeryld/rrroutes-contract'\nimport { cacheLeaves } from '../v2/types/types.cacheLog'\nimport { endpointLeaves } from '../v2/types/types.endpoint'\nimport { logLeaves } from '../v2/types/types.log'\nimport { presetLeaves } from '../v2/types/types.preset'\nimport { requestLogLeaves } from '../v2/types/types.requestLog'\n\ntype MountedLeaves<\n Leaves extends readonly AnyLeafLowProfile[],\n> = AugmentLeaves<'___rrroutes', undefined, Leaves>\ntype AllLeaves = readonly [\n ...MountedLeaves<typeof endpointLeaves>,\n ...MountedLeaves<typeof requestLogLeaves>,\n ...MountedLeaves<typeof logLeaves>,\n ...MountedLeaves<typeof cacheLeaves>,\n ...MountedLeaves<typeof presetLeaves>,\n]\n\nconst allLeaves: AllLeaves = resource()\n .sub(\n resource('___rrroutes')\n .sub(\n endpointLeaves,\n requestLogLeaves,\n logLeaves,\n cacheLeaves,\n presetLeaves,\n )\n .done(),\n )\n .done()\n\nexport const leaves: FinalizedRegistry<typeof allLeaves> = finalize(allLeaves)\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema } from './types.base'\n\nconst operationEnum = z.enum(['hit', 'miss', 'set', 'delete'])\nexport const cacheLogSchema = baseEntitySchema.extend({\n operation: operationEnum,\n // on hit, value = value retrieved\n // on miss, value = null\n // on set, value = value set\n // on delete, value = value deleted\n value: z.any().nullable(),\n size: z.number().optional(),\n})\n\nexport const cacheLogQuerySchema = baseQuerySchema.extend({\n operations: operationEnum.array().optional(),\n})\n\nexport const cacheLeaves = resource('cache')\n .get({\n feed: true,\n outputSchema: cacheLogSchema.array(),\n querySchema: cacheLogQuerySchema,\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n })\n .post({\n querySchema: cacheLogQuerySchema,\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]\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\n .enum(['timestamp', 'duration', 'level', 'path'])\n .default('timestamp'),\n orderDirection: z.enum(['asc', 'desc']).default('desc'),\n searchQuery: z.string().optional(),\n groups: z.string().array().optional(),\n tags: z.string().array().optional(),\n cursor: z.string().optional(),\n})\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z, { ZodType } from 'zod'\nimport { baseEntitySchema, baseQuerySchema, METHODS } from './types.base'\nimport { requestSchema } from './types.requestLog'\n\nexport const nodeKind = [\n 'object',\n 'string',\n 'number',\n 'array',\n 'enum',\n 'literal',\n 'union',\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] as const\nconst stabilityEnum = z.enum(STABILITIES)\nexport const endpointSchema = baseEntitySchema.extend({\n method: z.enum(METHODS),\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.object({ name: z.string(), maxCount: z.number() }),\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})\n\nexport type Endpoint = z.output<typeof endpointSchema>\n\nexport const endpointFilterSchema = baseQuerySchema.extend({\n methods: z.enum(METHODS).array().optional(),\n path: z.string().optional(),\n stability: stabilityEnum.array().optional(),\n})\n\nexport const endpointLeaves = resource('endpoints')\n .get({\n feed: true,\n querySchema: endpointFilterSchema,\n outputSchema: endpointSchema.array(),\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n })\n .sub(\n resource(':endpointId', undefined, z.string())\n .get({\n outputSchema: 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.string(),\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 latestErrorRequestIds: z.array(z.string()),\n }),\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema, METHODS } from './types.base'\nimport { cacheLogSchema } 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: z.enum(METHODS),\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})\n\nexport type RequestLogType = z.infer<typeof requestSchema>\n\nexport const requestQuerySchema = baseQuerySchema.extend({\n methods: z.enum(METHODS).array().default([]),\n statuses: z.number().array().default([]),\n path: z.string().optional(),\n})\n\nexport const requestLogLeaves = resource('requests')\n .get({\n feed: true,\n outputSchema: requestSchema.array(),\n querySchema: requestQuerySchema,\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\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(cacheLogSchema),\n }),\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema } from './types.base'\n\nconst levelSchema = z.enum(['info', 'warning', 'error', 'debug', 'trace'])\nexport const logSchema = baseEntitySchema.extend({\n level: levelSchema,\n meta: z.json(),\n})\n\nexport const logQuerySchema = baseQuerySchema.extend({\n level: levelSchema.array().optional(),\n})\n\nexport const logLeaves = resource('logs')\n .get({\n feed: true,\n outputSchema: logSchema.array(),\n querySchema: logQuerySchema,\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n })\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema, METHODS } from './types.base'\n\nconst presetSchema = baseEntitySchema.extend({\n operations: z.array(\n z.object({\n endpointId: z.string().optional(),\n method: z.enum(METHODS),\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})\n\nconst presetQuerySchema = baseQuerySchema.extend({\n name: z.string().optional(),\n tags: z.string().array().optional(),\n group: z.string().optional(),\n})\n\nexport const presetLeaves = resource('presets')\n .get({\n feed: true,\n querySchema: presetQuerySchema.array(),\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n outputSchema: presetSchema,\n })\n .post({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .put({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .done()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAGA,oBAA4B;AAE5B,qBAAwC;AACxC,qBAAe;AACf,uBAAiB;AACjB,sBAA8B;;;ACJ9B,oBAAqC;;;ACHrC,+BAIO;;;ACJP,QAAmB;AAyBnB,SAAS,OAAO,QAAkC;AAChD,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,YAAY;AAClB,SAAO,UAAU,MAAM,OAAO,UAAU;AAC1C;AAOA,SAAS,eAAe,QAAoC;AAC1D,QAAM,OAAY;AAGlB,QAAM,WAAW,KAAK,gBAAgB,MAClC,KAAK,eAAe,IAAI,MAAM,IAC9B;AACJ,MAAI,YAAY,OAAO,SAAS,gBAAgB,UAAU;AACxD,WAAO,SAAS;AAAA,EAClB;AAGA,QAAM,MAAM,OAAO,MAAM;AACzB,MAAI,OAAO,OAAO,IAAI,gBAAgB,UAAU;AAC9C,WAAO,IAAI;AAAA,EACb;AAEA,SAAO;AACT;AAUA,SAAS,OAAO,QAId;AACA,MAAI,IAAY;AAChB,MAAI,WAAW;AACf,MAAI,WAAW;AAGf,QAAM,iBAAiC;AAGvC,SAAO,MAAM;AAEX,QAAI,kBAAkB,aAAa,gBAAgB;AACjD,YAAM,MAAM,OAAO,CAAC,KAAK,CAAC;AAC1B,YAAM,aACJ,OAAQ,EAAU,eAAe,aAC5B,EAAU,WAAW,IACtB,IAAI;AACV,UAAI,CAAC,WAAY;AACjB,UAAI;AACJ;AAAA,IACF;AAGA,QAAI,aAAe,eAAa;AAC9B,iBAAW;AACX,YAAM,MAAM,OAAO,CAAC;AACpB,UAAK,OAAO,IAAI,aAAc;AAC9B;AAAA,IACF;AAEA,QAAI,aAAe,eAAa;AAC9B,iBAAW;AACX,YAAM,MAAM,OAAO,CAAC;AACpB,UAAK,OAAO,IAAI,aAAc;AAC9B;AAAA,IACF;AAEA,QAAI,aAAe,cAAY;AAC7B,YAAM,MAAM,OAAO,CAAC;AACpB,UAAK,OAAO,IAAI,aAAc;AAC9B;AAAA,IACF;AAEA;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,GAAG,UAAU,SAAS;AACvC;AAEO,SAAS,iBACd,QACoC;AACpC,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,EAAE,MAAM,UAAU,SAAS,IAAI,OAAO,MAAM;AAClD,QAAM,MAAM,OAAO,IAAI;AAEvB,QAAM,OAA+B;AAAA,IACnC,MAAM,UAAU,IAAI;AAAA,IACpB,UAAU,YAAY;AAAA,IACtB,UAAU,YAAY;AAAA,IACtB,aAAa,eAAe,IAAI;AAAA,EAClC;AAGA,MAAI,gBAAkB,aAAW;AAG/B,UAAM,WACH,KAAa,UACb,OAAO,OAAO,IAAI,UAAU,aAAa,IAAI,MAAM,IAAI,KAAK;AAE/D,UAAM,QAAQ,OAAO,aAAa,aAAa,SAAS,IAAK,YAAY,CAAC;AAE1E,UAAM,QAAgD,CAAC;AACvD,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,YAAM,QAAQ,MAAM,GAAG;AACvB,YAAM,YAAY,iBAAiB,KAAK;AACxC,UAAI,UAAW,OAAM,GAAG,IAAI;AAAA,IAC9B;AACA,SAAK,aAAa;AAAA,EACpB;AAGA,MAAI,gBAAkB,YAAU;AAG9B,UAAM,QACH,OAAQ,IAAI,WACZ,OAAQ,IAAI,QACb;AACF,QAAI,OAAO;AACT,WAAK,UAAU,iBAAiB,KAAK;AAAA,IACvC;AAAA,EACF;AAGA,MAAI,gBAAkB,YAAU;AAC9B,UAAM,UAAqB,OAAO,IAAI,WAAY,CAAC;AACnD,SAAK,QAAQ,QACV,IAAI,CAAC,QAAQ,iBAAiB,GAAG,CAAC,EAClC,OAAO,OAAO;AAAA,EACnB;AAGA,MAAI,gBAAkB,cAAY;AAChC,QAAI,KAAK;AAEP,UAAI,MAAM,QAAQ,IAAI,MAAM,GAAG;AAC7B,aAAK,UACH,IAAI,OAAO,WAAW,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,MAAM;AAAA,MAC/D,OAAO;AAEL,aAAK,UAAU,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,gBAAkB,WAAS;AAC7B,QAAI,KAAK;AACP,UAAI,MAAM,QAAQ,IAAI,MAAM,GAAG;AAE7B,aAAK,aAAa,IAAI,OAAO,MAAM;AAAA,MACrC,WAAW,IAAI,WAAW,OAAO,IAAI,YAAY,UAAU;AAEzD,aAAK,aAAa,OAAO,OAAO,IAAI,OAAO,EAAE;AAAA,UAAI,CAAC,MAChD,OAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,QAAwB;AAGzC,MAAI,kBAAoB,YAAW,QAAO;AAC1C,MAAI,kBAAoB,YAAW,QAAO;AAC1C,MAAI,kBAAoB,aAAY,QAAO;AAC3C,MAAI,kBAAoB,YAAW,QAAO;AAC1C,MAAI,kBAAoB,UAAS,QAAO;AACxC,MAAI,kBAAoB,WAAU,QAAO;AACzC,MAAI,kBAAoB,YAAW,QAAO;AAC1C,MAAI,kBAAoB,WAAU,QAAO;AACzC,MAAI,kBAAoB,aAAY,QAAO;AAC3C,MAAI,kBAAoB,UAAS,QAAO;AACxC,MAAI,kBAAoB,YAAW,QAAO;AAC1C,MAAI,kBAAoB,WAAU,QAAO;AACzC,MAAI,kBAAoB,aAAY,QAAO;AAC3C,MAAI,kBAAoB,SAAQ,QAAO;AAEvC,SAAO;AACT;;;ADrLO,SAAS,cAAc,MAAyC;AACrE,QAAM,MAAM,KAAK;AAEjB,QAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC;AAE3D,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA;AAAA,IACb,MAAM,KAAK;AAAA,IACX,KAAK;AAAA,MACH,aAAa,IAAI;AAAA,MACjB,SAAS,IAAI;AAAA,MACb,WAAW,IAAI;AAAA,MACf;AAAA,MACA,YAAY,IAAI;AAAA,MAChB,WAAW,IAAI;AAAA,MACf,MAAM,CAAC,CAAC,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,SAAS,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,IAAI,WAAW;AAAA,MAC9C,UAAU,CAAC,CAAC,IAAI;AAAA,MAChB,WAAW,CAAC,CAAC,IAAI;AAAA,MACjB,WAAW,CAAC,CAAC,IAAI;AAAA,MAEjB,YAAY,IAAI,aACZ,qBAAiB,2CAAiB,IAAI,UAAU,CAAC,IACjD;AAAA,MACJ,aAAa,IAAI,cACb,qBAAiB,2CAAiB,IAAI,WAAW,CAAC,IAClD;AAAA,MACJ,cAAc,IAAI,eACd,qBAAiB,2CAAiB,IAAI,YAAY,CAAC,IACnD;AAAA,MACJ,cAAc,IAAI,eACd,qBAAiB,2CAAiB,IAAI,YAAY,CAAC,IACnD;AAAA,IACN;AAAA,EACF;AACF;;;ADtBM;AAzCN,IAAM,qBAAqB;AAE3B,SAAS,cAAc,MAAc;AACnC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AAClD;AAEA,SAAS,kBAAkB,MAA0B;AACnD,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,SAAS,IAAK,QAAO;AACzB,SAAO,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AACrE;AAgBO,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,QAAM,UAAU,GAAG,SAAS;AAC5B,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,aAAa,gBAAgB;AAAA,IACjC,cAAc;AAAA,EAChB,CAAC;AAED,SACE,6CAAC,UAAK,MAAK,MACT;AAAA,iDAAC,UACC;AAAA,kDAAC,UAAK,SAAQ,SAAQ;AAAA,MACtB,4CAAC,UAAK,MAAK,YAAW,SAAQ,yCAAwC;AAAA,MACtE,4CAAC,WAAM,2BAAa;AAAA,MACpB,4CAAC,UAAK,KAAI,cAAa,MAAM,SAAS;AAAA,OACxC;AAAA,IACA,6CAAC,UACC;AAAA,kDAAC,SAAI,IAAG,aAAY;AAAA,MACpB;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,yBAAyB,EAAE,QAAQ,WAAW;AAAA;AAAA,MAChD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,yBAAyB,EAAE,QAAQ,WAAW;AAAA;AAAA,MAChD;AAAA,MACA,4CAAC,YAAO,MAAK,UAAS,KAAK,OAAO,OAAO,UAAU;AAAA,OACrD;AAAA,KACF;AAEJ;AAEA,SAAS,gBAAgBC,SAA6B;AACpD,SAAO,KAAK,UAAUA,QAAO,IAAI,aAAa,CAAC,EAAE,QAAQ,QAAQ,MAAM;AACzE;AAOA,SAAS,gBAAgB,QAAoB;AAC3C,SAAO,KAAK,UAAU,MAAM,EAAE,QAAQ,QAAQ,MAAM;AACtD;AAEO,SAAS,uBACdA,SACA,UAAyB,CAAC,GACZ;AACd,QAAM,YAAY,cAAc,QAAQ,iBAAiB,kBAAkB;AAC3E,QAAM,aAAa,gBAAgBA,OAAM;AAEzC,QAAM,WAAW,kBAAkB,QAAQ,YAAY;AAEvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,QAAQ;AAAA;AAAA,EACpB;AAEJ;AAEO,SAAS,mBACdA,SACA,UAAyB,CAAC,GAClB;AACR,QAAM,MAAM,uBAAuBA,SAAQ,OAAO;AAClD,QAAM,WAAO,oCAAqB,GAAG;AACrC,SAAO,kBAAkB,IAAI;AAC/B;;;AGnHO,SAASC,oBACdC,SACA,UAAyB,CAAC,GAClB;AACR,SAAO,mBAAaA,SAAQ,OAAO;AACrC;;;ACXA,sBAAgB;AAKT,SAAS,oBACd,UACA,OACgB;AAChB,QAAM,UAAU,SAAS,KAAK;AAC9B,SAAO,CAAC,KAAc,KAAe,SAAqB;AACxD,UAAM,WAAW,gBAAgB,IAAI,QAAQ,aAAa;AAC1D,QAAI,YAAY,aAAa,SAAS;AACpC,aAAO,KAAK;AAAA,IACd;AACA,6BAAyB,GAAG;AAC5B,QAAI,UAAU,oBAAoB,gBAAgB,KAAK,GAAG;AAC1D,QACG,OAAO,GAAG,EACV;AAAA,MACC;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAAA,EACJ;AACF;AAKO,SAAS,kBACd,YACA,cACgB;AAChB,SAAO,CAAC,KAAc,KAAe,SAAqB;AACxD,UAAM,UAAW,IAAY;AAC7B,UAAM,QAAQ,UAAU,UAAU;AAElC,UAAM,QAAQ,eAAe,UAAU,eAAe,QAAQ,KAAK;AAEnE,QAAI,OAAO;AACT,aAAO,KAAK;AAAA,IACd;AAEA,6BAAyB,GAAG;AAC5B,QACG,OAAO,GAAG,EACV;AAAA,MACC;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAAA,EACJ;AACF;AAKO,SAAS,6BAA6C;AAC3D,SAAO,CAAC,MAAe,QAAkB;AACvC,6BAAyB,GAAG;AAC5B,QACG,OAAO,GAAG,EACV,KAAK,oBAAoB,4CAA4C,CAAC;AAAA,EAC3E;AACF;AAIA,SAAS,gBAAgB,YAA2C;AAClE,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,SAAS,MAAM,QAAQ,UAAU,IAAI,WAAW,CAAC,IAAI;AAC3D,MAAI,OAAO,WAAW,YAAY,CAAC,OAAO,WAAW,QAAQ;AAC3D,WAAO;AACT,QAAM,QAAQ,OAAO,MAAM,SAAS,MAAM;AAC1C,MAAI;AACF,UAAM,UAAU,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,MAAM;AAC5D,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,UAAM,MAAM;AACZ,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,uBAAuB,SAAmC;AACxE,QAAM,SAAS,QACZ,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO,EACd,IAAI,cAAc,EAClB,OAAO,CAAC,MAAoB,MAAM,IAAI;AAEzC,SAAO,CAAC,KAAc,KAAe,SAAqB;AACxD,UAAM,QACJ,IAAI,MAAO,IAAI,cAAe,IAAI,WAAmB,iBAAkB;AACzE,UAAM,KAAK,YAAY,KAAK;AAE5B,QAAI,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,GAAG;AACnC,+BAAyB,GAAG;AAC5B,UACG,OAAO,GAAG,EACV;AAAA,QACC;AAAA,UACE;AAAA,QACF;AAAA,MACF;AACF;AAAA,IACF;AAEA,SAAK;AAAA,EACP;AACF;AAOA,SAAS,YAAY,IAAoB;AACvC,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,WAAW,SAAS,EAAG,QAAO,GAAG,MAAM,CAAC;AAC/C,MAAI,OAAO,MAAO,QAAO;AACzB,SAAO;AACT;AACA,SAAS,eAAe,KAA6B;AACnD,MAAI,IAAI,SAAS,GAAG,GAAG;AACrB,UAAM,OAAO,UAAU,GAAG;AAC1B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAAA,EAC1D;AAGA,SAAO,EAAE,MAAM,SAAS,OAAO,YAAY,GAAG,EAAE;AAClD;AACA,SAAS,UAAU,KAAoD;AACrE,QAAM,CAAC,QAAQ,OAAO,IAAI,IAAI,MAAM,GAAG;AACvC,QAAM,OAAO,OAAO,OAAO;AAC3B,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,GAAI,QAAO;AAC7D,MAAI,gBAAAC,QAAI,KAAK,MAAM,MAAM,EAAG,QAAO;AAEnC,QAAM,WAAW,SAAS,MAAM;AAChC,MAAI,YAAY,KAAM,QAAO;AAE7B,QAAM,OAAO,SAAS,IAAI,IAAK,CAAC,KAAM,KAAK,SAAW;AACtD,SAAO,EAAE,OAAO,WAAW,UAAU,GAAG,KAAK;AAC/C;AACA,SAAS,SAAS,IAA2B;AAC3C,QAAM,QAAQ,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAChD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AACxE,UACI,MAAM,CAAC,KAAK,OAAQ,MACpB,MAAM,CAAC,KAAK,OAAQ,MACpB,MAAM,CAAC,KAAK,MAAO,KACrB,MAAM,CAAC;AAEX;AACA,SAAS,YAAY,IAAY,QAA4B;AAC3D,QAAM,OAAO,gBAAAA,QAAI,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,IAAI;AAEjD,aAAW,KAAK,QAAQ;AACtB,QAAI,EAAE,SAAS,SAAS;AACtB,UAAI,OAAO,EAAE,MAAO,QAAO;AAAA,IAC7B,WAAW,EAAE,SAAS,UAAU,QAAQ,MAAM;AAC5C,WAAK,OAAO,EAAE,UAAU,EAAE,KAAM,QAAO;AAAA,IACzC;AAAA,EACF;AAEA,SAAO;AACT;AACA,SAAS,oBAAoB,SAAiB;AAC5C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAiBA,OAAO;AAAA;AAAA;AAAA;AAIhB;AACO,SAAS,yBAAyB,KAAe;AACtD,MAAI,UAAU,0BAA0B,SAAS;AACjD,MAAI,UAAU,mBAAmB,aAAa;AAC9C,MAAI,UAAU,mBAAmB,YAAY;AAC7C,MAAI,UAAU,iBAAiB,UAAU;AACzC,MAAI;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;AC9MA,IAAAC,4BAMO;;;ACNP,IAAAC,4BAAyB;AACzB,IAAAC,cAAc;;;ACDd,iBAAc;AAEP,IAAM,UAAU,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ;AAGxD,IAAM,mBAAmB,WAAAC,QAAE,OAAO;AAAA,EACvC,IAAI,WAAAA,QAAE,OAAO;AAAA,EACb,MAAM,WAAAA,QAAE,OAAO;AAAA,EACf,aAAa,WAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,WAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAM,WAAAA,QAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EAClC,WAAW,WAAAA,QAAE,OAAO;AAAA,EACpB,WAAW,WAAAA,QAAE,OAAO;AACtB,CAAC;AAEM,IAAM,kBAAkB,WAAAA,QAAE,OAAO;AAAA,EACtC,YAAY,WAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAChC,WAAW,WAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,WAAAA,QACN,KAAK,CAAC,aAAa,YAAY,SAAS,MAAM,CAAC,EAC/C,QAAQ,WAAW;AAAA,EACtB,gBAAgB,WAAAA,QAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA,EACtD,aAAa,WAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,WAAAA,QAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EACpC,MAAM,WAAAA,QAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EAClC,QAAQ,WAAAA,QAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;;;ADtBD,IAAM,gBAAgB,YAAAC,QAAE,KAAK,CAAC,OAAO,QAAQ,OAAO,QAAQ,CAAC;AACtD,IAAM,iBAAiB,iBAAiB,OAAO;AAAA,EACpD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKX,OAAO,YAAAA,QAAE,IAAI,EAAE,SAAS;AAAA,EACxB,MAAM,YAAAA,QAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAEM,IAAM,sBAAsB,gBAAgB,OAAO;AAAA,EACxD,YAAY,cAAc,MAAM,EAAE,SAAS;AAC7C,CAAC;AAEM,IAAM,kBAAc,oCAAS,OAAO,EACxC,IAAI;AAAA,EACH,MAAM;AAAA,EACN,cAAc,eAAe,MAAM;AAAA,EACnC,aAAa;AAAA,EACb,kBAAkB,YAAAA,QAAE,OAAO;AAAA,IACzB,YAAY,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AACH,CAAC,EACA,KAAK;AAAA,EACJ,aAAa;AACf,CAAC,EACA,KAAK;;;AE/BR,IAAAC,4BAAyB;AACzB,IAAAC,cAA2B;;;ACD3B,IAAAC,4BAAyB;AACzB,IAAAC,cAAc;;;ACDd,IAAAC,4BAAyB;AACzB,IAAAC,cAAc;AAGd,IAAM,cAAc,YAAAC,QAAE,KAAK,CAAC,QAAQ,WAAW,SAAS,SAAS,OAAO,CAAC;AAClE,IAAM,YAAY,iBAAiB,OAAO;AAAA,EAC/C,OAAO;AAAA,EACP,MAAM,YAAAA,QAAE,KAAK;AACf,CAAC;AAEM,IAAM,iBAAiB,gBAAgB,OAAO;AAAA,EACnD,OAAO,YAAY,MAAM,EAAE,SAAS;AACtC,CAAC;AAEM,IAAM,gBAAY,oCAAS,MAAM,EACrC,IAAI;AAAA,EACH,MAAM;AAAA,EACN,cAAc,UAAU,MAAM;AAAA,EAC9B,aAAa;AAAA,EACb,kBAAkB,YAAAA,QAAE,OAAO;AAAA,IACzB,YAAY,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AACH,CAAC,EACA,KAAK;;;ADjBD,IAAM,gBAAgB,iBAAiB,OAAO;AAAA,EACnD,QAAQ,YAAAC,QAAE,OAAO;AAAA,EACjB,MAAM,YAAAA,QAAE,IAAI,EAAE,SAAS;AAAA,EACvB,SAAS,YAAAA,QAAE,OAAO;AAAA,EAClB,MAAM,YAAAA,QAAE,OAAO;AAAA,EACf,QAAQ,YAAAA,QAAE,KAAK,OAAO;AAAA,EACtB,OAAO,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,QAAQ,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC/C,QAAQ,YAAAA,QAAE,IAAI,EAAE,SAAS;AAAA,EACzB,SAAS,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAChD,OAAO,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,YAAY,YAAAA,QAAE,OAAO;AACvB,CAAC;AAIM,IAAM,qBAAqB,gBAAgB,OAAO;AAAA,EACvD,SAAS,YAAAA,QAAE,KAAK,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC3C,UAAU,YAAAA,QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,EACvC,MAAM,YAAAA,QAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAEM,IAAM,uBAAmB,oCAAS,UAAU,EAChD,IAAI;AAAA,EACH,MAAM;AAAA,EACN,cAAc,cAAc,MAAM;AAAA,EAClC,aAAa;AAAA,EACb,kBAAkB,YAAAA,QAAE,OAAO;AAAA,IACzB,YAAY,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AACH,CAAC,EACA;AAAA,MACC,oCAAS,cAAc,QAAW,YAAAA,QAAE,OAAO,CAAC,EACzC,IAAI;AAAA,IACH,cAAc,cAAc,OAAO;AAAA;AAAA;AAAA,MAGjC,MAAM,YAAAA,QAAE,MAAM,SAAS;AAAA,MACvB,QAAQ,YAAAA,QAAE,MAAM,cAAc;AAAA,IAChC,CAAC;AAAA,EACH,CAAC,EACA,KAAK;AACV,EACC,KAAK;;;AD5CD,IAAM,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAqBO,IAAM,2BAGT,YAAAC,QAAE;AAAA,EAAK,MACT,YAAAA,QAAE,OAAO;AAAA,IACP,MAAM,YAAAA,QAAE,KAAK,QAAQ;AAAA,IAErB,UAAU,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAAA,IAC/B,UAAU,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAAA,IAC/B,aAAa,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAGjC,YAAY,YAAAA,QACT,OAAO,YAAAA,QAAE,OAAO,GAAG,wBAAwB,EAC3C,SAAS;AAAA;AAAA,IAGZ,SAAS,yBAAyB,SAAS;AAAA;AAAA,IAG3C,OAAO,YAAAA,QAAE,MAAM,wBAAwB,EAAE,SAAS;AAAA;AAAA,IAGlD,SAAS,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,IAG9B,YAAY,YAAAA,QAAE,MAAM,YAAAA,QAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC3C,CAAC;AACH;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,gBAAgB,YAAAA,QAAE,KAAK,WAAW;AACjC,IAAM,iBAAiB,iBAAiB,OAAO;AAAA,EACpD,QAAQ,YAAAA,QAAE,KAAK,OAAO;AAAA,EACtB,MAAM,YAAAA,QAAE,OAAO;AAAA,EACf,UAAU,YAAAA,QAAE,OAAO;AAAA,IACjB,MAAM,yBAAyB,SAAS;AAAA,IACxC,OAAO,yBAAyB,SAAS;AAAA,IACzC,QAAQ,yBAAyB,SAAS;AAAA,IAC1C,QAAQ,yBAAyB,SAAS;AAAA,IAC1C,WAAW,YAAAA,QAAE,OAAO,EAAE,MAAM,YAAAA,QAAE,OAAO,GAAG,UAAU,YAAAA,QAAE,OAAO,EAAE,CAAC;AAAA,EAChE,CAAC;AAAA,EACD,MAAM,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,SAAS,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW;AAAA,EACX,QAAQ,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,MAAM,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,OAAO,CAAC;AACvC,CAAC;AAIM,IAAM,uBAAuB,gBAAgB,OAAO;AAAA,EACzD,SAAS,YAAAA,QAAE,KAAK,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EAC1C,MAAM,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,WAAW,cAAc,MAAM,EAAE,SAAS;AAC5C,CAAC;AAEM,IAAM,qBAAiB,oCAAS,WAAW,EAC/C,IAAI;AAAA,EACH,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc,eAAe,MAAM;AAAA,EACnC,kBAAkB,YAAAA,QAAE,OAAO;AAAA,IACzB,YAAY,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AACH,CAAC,EACA;AAAA,MACC,oCAAS,eAAe,QAAW,YAAAA,QAAE,OAAO,CAAC,EAC1C,IAAI;AAAA,IACH,cAAc,eAAe,OAAO;AAAA;AAAA,MAElC,UAAU,YAAAA,QAAE,MAAM,aAAa;AAAA;AAAA,MAE/B,UAAU,YAAAA,QAAE;AAAA,QACV,YAAAA,QAAE,OAAO;AAAA,UACP,WAAW,YAAAA,QAAE,OAAO;AAAA,UACpB,OAAO,YAAAA,QAAE,OAAO;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,MACA,mBAAmB,YAAAA,QAAE,OAAO;AAAA,MAC5B,aAAa,YAAAA,QAAE,OAAO;AAAA;AAAA,MAEtB,uBAAuB,YAAAA,QAAE,MAAM,YAAAA,QAAE,OAAO,CAAC;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC,EACA,KAAK;AACV,EACC,KAAK;;;AG9HR,IAAAC,4BAAyB;AACzB,IAAAC,cAAc;AAGd,IAAM,eAAe,iBAAiB,OAAO;AAAA,EAC3C,YAAY,YAAAC,QAAE;AAAA,IACZ,YAAAA,QAAE,OAAO;AAAA,MACP,YAAY,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,MAChC,QAAQ,YAAAA,QAAE,KAAK,OAAO;AAAA,MACtB,MAAM,YAAAA,QAAE,OAAO;AAAA,MACf,MAAM,YAAAA,QAAE,KAAK,EAAE,SAAS;AAAA,MACxB,cAAc,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MACrD,OAAO,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAChD,CAAC;AAAA,EACH;AACF,CAAC;AAED,IAAM,oBAAoB,gBAAgB,OAAO;AAAA,EAC/C,MAAM,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,YAAAA,QAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EAClC,OAAO,YAAAA,QAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAEM,IAAM,mBAAe,oCAAS,SAAS,EAC3C,IAAI;AAAA,EACH,MAAM;AAAA,EACN,aAAa,kBAAkB,MAAM;AAAA,EACrC,kBAAkB,YAAAA,QAAE,OAAO;AAAA,IACzB,YAAY,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AAAA,EACD,cAAc;AAChB,CAAC,EACA,KAAK;AAAA,EACJ,YAAY;AAAA,EACZ,cAAc;AAChB,CAAC,EACA,IAAI;AAAA,EACH,YAAY;AAAA,EACZ,cAAc;AAChB,CAAC,EACA,KAAK;;;ANhBR,IAAM,gBAAuB,oCAAS,EACnC;AAAA,MACC,oCAAS,aAAa,EACnB;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,KAAK;AACV,EACC,KAAK;AAED,IAAM,aAA8C,oCAAS,SAAS;;;ANgD7E,SAAS,mBAAmB;AAC1B,QAAM,YACJ,OAAO,cAAc,cACjB,YACA,iBAAAC,QAAK,YAAQ,+BAAc,iBAAe,CAAC;AACjD,QAAM,aAAa,iBAAAA,QAAK,QAAQ,WAAW,WAAW;AACtD,MAAI,eAAAC,QAAG,WAAW,UAAU,EAAG,QAAO;AAGtC,QAAM,WAAW,iBAAAD,QAAK,QAAQ,WAAW,gBAAgB;AACzD,MAAI,eAAAC,QAAG,WAAW,QAAQ,EAAG,QAAO;AAEpC,SAAO;AACT;AAEO,SAAS,kBAA+C;AAAA,EAC7D;AAAA,EACA,QAAAC;AAAA,EACA,OAAO,CAAC;AACV,GAAsC;AACpC,QAAM,WAAW;AAEjB,QAAM,YAAY,iBAAiB;AACnC,QAAM,YAAY,iBAAAF,QAAK,KAAK,WAAW,QAAQ;AAE/C,QAAM,aAAa,KAAK,QAAQ;AAChC,QAAM,cAAc,KAAK,YAAY;AACrC,QAAM,eAAe,KAAK;AAC1B,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,aAAa,KAAK,cAAc,CAAC;AACvC,QAAM,aAAa,KAAK;AACxB,QAAM,eAAe,MAAM;AAC3B,QAAM,cAAc,MAAM;AAE1B,QAAM,UACJ,WAAW,SAAS,IAAI,uBAAuB,UAAU,IAAI;AAE/D,QAAM,YAA4B,CAAC,cAC/B,CAAC,MAAM,MAAM,SAAS,KAAK,IAC3B,cACE,cACA,aACE,kBAAkB,YAAY,YAAY,IAC1C,eACE,oBAAoB,cAAc,SAAS,IAC3C,2BAA2B;AAGpC,GAAC,UAAU,GAAG,QAAQ,WAAW,aAAa,EAAE,QAAQ,CAAC,MAAM;AAC9D,QAAI,QAAS,QAAO,IAAI,GAAG,OAAO;AAClC,WAAO,IAAI,GAAG,SAAS;AAAA,EACzB,CAAC;AAED,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,QACX,eAAAG,QAAc,WAAW,EAAE,WAAW,MAAM,QAAQ,OAAO,CAAC;AAAA,EAC9D;AAEA,QAAM,iBAAiB,CAAC,UAAU,GAAG,QAAQ,KAAK,GAAG,QAAQ,MAAM;AAEnE,SAAO,IAAI,gBAAgB,CAAC,MAAM,QAAQ;AACxC,UAAM,QAAQ,iBAAa,2BAAY,EAAE,EAAE,SAAS,QAAQ,IAAI;AAEhE,UAAM,OAAOC;AAAA,MACXF,QAAO,OAAO,CAAC,SAAS,KAAK,IAAI,eAAe,IAAI;AAAA,MACpD;AAAA,QACE,UAAU;AAAA,QACV,eAAe,GAAG,GAAG,QAAQ,SAAS;AAAA,QACtC,cAAc,GAAG,QAAQ;AAAA,MAC3B;AAAA,IACF;AAEA,6BAAyB,GAAG;AAE5B,QAAI,cAAc,OAAO;AACvB,UAAI;AAAA,QACF;AAAA,QACA;AAAA,UACE;AAAA,UACA,4BAA4B,KAAK;AAAA,UACjC,2BAA2B,KAAK;AAAA,UAChC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAEA,QAAI,KAAK,IAAI;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;","names":["renderLeafDocsHTML","leaves","renderLeafDocsHTML","leaves","net","import_rrroutes_contract","import_rrroutes_contract","import_zod","z","z","import_rrroutes_contract","import_zod","import_rrroutes_contract","import_zod","import_rrroutes_contract","import_zod","z","z","z","import_rrroutes_contract","import_zod","z","path","fs","leaves","expressStatic","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/utils/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"],"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 /** Turn auth on/off. Enabled by default. */\n enabled?: boolean\n /** Password to require for docs access (HTTP Basic). */\n password?: string\n /** Realm used for the HTTP Basic challenge prompt. */\n realm?: string\n /**\n * Allow list of client IPs for docs access.\n * Supports:\n * - exact IPv4 or IPv6 strings (e.g. \"127.0.0.1\", \"::1\")\n * - IPv4 CIDR (e.g. \"10.0.0.0/8\", \"192.168.1.0/24\")\n */\n allowedIps?: string[]\n /**\n * Name of cookie used for cookie-based docs auth.\n * Requires `cookie-parser` or equivalent to populate `req.cookies`.\n */\n cookieName?: string\n /**\n * Optional exact value required for the cookie.\n * If omitted, the cookie only needs to exist (non-empty).\n */\n cookieSecret?: string\n /**\n * Fully custom guard middleware. If provided, it is used\n * instead of password/cookie auth (IP allow list still applies).\n */\n guardMiddleware?: RequestHandler\n /**\n * Whether to emit a CSP header + nonce. Defaults to true.\n */\n csp?: boolean\n}\n\nexport type MountDocsArgs = {\n router: Router\n auth: DocsAuthOptions\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}: 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 })\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","// 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 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\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}\n\nexport const DocsDocument = ({\n assetBase,\n docsBase,\n cspNonce,\n}: DocsDocumentProps) => {\n const cssHref = `${assetBase}/docs.css`\n const jsSrc = `${assetBase}/docs.js`\n const configJson = serializeConfig({\n docsBasePath: docsBase,\n cspNonce,\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}\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\n const docsBase = normalizeDocsBase(options.docsBasePath)\n\n return (\n <DocsDocument\n assetBase={assetBase}\n docsBase={docsBase}\n cspNonce={options.cspNonce}\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 { Endpoint } from '../web/v2/types/types.endpoint.js'\nimport { introspectSchema } from './schemaIntrospection.js'\n\nexport type SerializedLeaf = Endpoint\n\nexport type { SerializableSchemaNode } from './schemaIntrospection.js'\n\nexport function serializeLeaf(leaf: AnyLeafLowProfile): Endpoint {\n const cfg = leaf.cfg\n\n const tags = Array.isArray(cfg.tags) ? cfg.tags.slice() : []\n const stability = (cfg.stability ?? 'experimental') as Endpoint['stability']\n const now = Date.now()\n\n return {\n id: buildLeafId(leaf),\n name: inferName(cfg, leaf.path),\n description: cfg.description,\n groupId: cfg.docsGroup,\n tags: tags.length > 0 ? tags : undefined,\n createdAt: now,\n updatedAt: now,\n method: leaf.method as MethodType,\n path: leaf.path,\n contract: {\n body: serializeContractSchema(cfg.bodySchema),\n query: serializeContractSchema(cfg.querySchema),\n params: serializeContractSchema(cfg.paramsSchema),\n output: serializeContractSchema(cfg.outputSchema),\n bodyFiles: serializeBodyFiles(cfg),\n },\n feed: cfg.feed ?? undefined,\n summary: cfg.summary,\n stability,\n hidden: cfg.docsHidden,\n meta: serializeMeta(cfg.docsMeta),\n }\n}\n\nfunction serializeContractSchema(schema: MethodCfgLowProfile['bodySchema']) {\n return schema ? introspectSchema(routeSchemaParse(schema)) : undefined\n}\n\nfunction serializeBodyFiles(cfg: MethodCfgLowProfile) {\n if (!Array.isArray(cfg.bodyFiles) || cfg.bodyFiles.length === 0)\n return undefined\n return cfg.bodyFiles.map(({ name, maxCount }) => ({ name, maxCount }))\n}\n\nfunction serializeMeta(meta?: Record<string, unknown>): Record<string, string> {\n if (!meta) return {}\n const entries = Object.entries(meta)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => [\n key,\n typeof value === 'string' ? value : JSON.stringify(value),\n ])\n return Object.fromEntries(entries)\n}\n\nfunction buildLeafId(leaf: AnyLeafLowProfile) {\n return `${leaf.method.toUpperCase()} ${leaf.path}`\n}\n\nfunction inferName(cfg: MethodCfgLowProfile, path: string) {\n return cfg.summary || cfg.description || path\n}\n","// schemaIntrospection.ts\nimport * as z from 'zod'\nimport type { SerializableSchema } from '../web/v2/types/types.endpoint.js'\n\nexport type SerializableSchemaNode = SerializableSchema\n\ntype ZodAny = z.ZodTypeAny\n\n/**\n * Zod 3 uses `schema._def`, Zod 4 uses `schema._zod.def`.\n */\nfunction getDef(schema: unknown): any | undefined {\n if (!schema || typeof schema !== 'object') return undefined\n const anySchema = schema as any\n return anySchema._zod?.def ?? anySchema._def\n}\n\n/**\n * Try to get a human-readable description.\n * Zod 4: use metadata/registry; fallback to internal def.description.\n * Zod 3: only internal def.description exists.\n */\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\n // Zod 4 global registry metadata, if present\n const registry = anyZ.globalRegistry?.get\n ? anyZ.globalRegistry.get(schema)\n : undefined\n if (registry && typeof registry.description === 'string') {\n return registry.description\n }\n\n // Legacy / internal description\n const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\n\n/**\n * Peel off wrappers (effects, optional, nullable, default) and\n * return the inner schema + flags.\n *\n * Supports:\n * - Zod 3: ZodEffects, ZodOptional, ZodNullable, ZodDefault\n * - Zod 4: ZodOptional, ZodNullable, ZodDefault\n */\nfunction unwrap(schema: ZodAny): {\n base: ZodAny\n optional: boolean\n nullable: boolean\n} {\n let s: ZodAny = schema\n let optional = false\n let nullable = false\n\n // Zod 3 only (undefined in Zod 4)\n const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Zod 3: ZodEffects wrapper\n if (ZodEffectsCtor && s instanceof ZodEffectsCtor) {\n const def = getDef(s) || {}\n const sourceType =\n typeof (s as any).sourceType === 'function'\n ? (s as any).sourceType()\n : def.schema\n if (!sourceType) break\n s = sourceType\n continue\n }\n\n // Zod 3 + 4: optional/nullable/default wrappers\n if (s instanceof z.ZodOptional) {\n optional = true\n const def = getDef(s)\n s = (def && def.innerType) || s // innerType exists in both 3 & 4\n continue\n }\n\n if (s instanceof z.ZodNullable) {\n nullable = true\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n if (s instanceof z.ZodDefault) {\n const def = getDef(s)\n s = (def && def.innerType) || s\n continue\n }\n\n break\n }\n\n return { base: s, optional, nullable }\n}\n\nexport function introspectSchema(\n schema: ZodAny | undefined,\n): SerializableSchema | undefined {\n if (!schema) return undefined\n\n const { base, optional, nullable } = unwrap(schema)\n const def = getDef(base)\n\n const node: SerializableSchema = {\n kind: inferKind(base),\n optional: optional || undefined,\n nullable: nullable || undefined,\n description: getDescription(base),\n }\n\n // OBJECT\n if (base instanceof z.ZodObject) {\n // Zod 3: _def.shape() (function)\n // Zod 4: .shape getter returns an object\n const rawShape: any =\n (base as any).shape ??\n (def && typeof def.shape === 'function' ? def.shape() : def?.shape)\n\n const shape = typeof rawShape === 'function' ? rawShape() : (rawShape ?? {})\n\n const props: Record<string, SerializableSchema> = {}\n for (const key of Object.keys(shape)) {\n const child = shape[key] as ZodAny\n const childNode = introspectSchema(child)\n if (childNode) props[key] = childNode\n }\n node.properties = props\n }\n\n // ARRAY\n if (base instanceof z.ZodArray) {\n // Zod 3: def.type is inner schema\n // Zod 4: def.element is inner schema\n const inner =\n (def && (def.element as ZodAny)) ||\n (def && (def.type as ZodAny)) ||\n undefined\n if (inner) {\n node.element = introspectSchema(inner)\n }\n }\n\n // UNION\n if (base instanceof z.ZodUnion) {\n const options: ZodAny[] = (def && def.options) || []\n node.union = options\n .map((opt) => introspectSchema(opt))\n .filter(Boolean) as SerializableSchema[]\n }\n\n // LITERAL\n if (base instanceof z.ZodLiteral) {\n if (def) {\n // Zod 4: def.values (multi-literal)\n if (Array.isArray(def.values)) {\n node.literal =\n def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\n // Zod 3: def.value\n node.literal = def.value\n }\n }\n }\n\n // ENUM\n if (base instanceof z.ZodEnum) {\n if (def) {\n if (Array.isArray(def.values)) {\n // Zod 3\n node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\n // Zod 4: entries is a { key: value } map\n node.enumValues = Object.values(def.entries).map((v: unknown) =>\n String(v),\n )\n }\n }\n }\n\n return node\n}\n\nfunction inferKind(schema: ZodAny): SerializableSchema['kind'] {\n // This path still uses instanceof; it works with Zod 4 Classic\n // (importing from \"zod\"). Anything unknown falls back to \"unknown\".\n if (schema instanceof z.ZodString) return 'string'\n if (schema instanceof z.ZodNumber) return 'number'\n if (schema instanceof z.ZodBoolean) return 'boolean'\n if (schema instanceof z.ZodBigInt) return 'bigint'\n if (schema instanceof z.ZodDate) return 'date'\n if (schema instanceof z.ZodArray) return 'array'\n if (schema instanceof z.ZodObject) return 'object'\n if (schema instanceof z.ZodUnion) return 'union'\n if (schema instanceof z.ZodLiteral) return 'literal'\n if (schema instanceof z.ZodEnum) return 'enum'\n if (schema instanceof z.ZodRecord) return 'record'\n if (schema instanceof z.ZodTuple) return 'tuple'\n if (schema instanceof z.ZodUnknown) return 'unknown'\n if (schema instanceof z.ZodAny) return 'any'\n\n return 'unknown'\n}\n","// renderLeafDocsHTML.ts\nimport {\n renderLeafDocsHTML as LeafDocsPage,\n RenderOptions,\n} from './LeafDocsPage.js'\n\nexport function renderLeafDocsHTML(options: RenderOptions = {}): string {\n return LeafDocsPage(options)\n}\n\nexport { createLeafDocsDocument } from './LeafDocsPage.js'\nexport type { RenderOptions } from './LeafDocsPage.js'\n","import type { Request, RequestHandler, Response } from 'express'\nimport net from 'node:net'\n\n/**\n * HTTP Basic password guard.\n */\nexport function createPasswordGuard(\n password: string,\n realm: string,\n): RequestHandler {\n const trimmed = password.trim()\n return (req: Request, res: Response, next: () => void) => {\n const provided = extractPassword(req.headers.authorization)\n if (provided && provided === trimmed) {\n return next()\n }\n applyDocsSecurityHeaders(res)\n res.setHeader('WWW-Authenticate', `Basic realm=\"${realm}\"`)\n res\n .status(401)\n .send(\n renderAuthErrorPage(\n 'Docs are password protected. Provide the configured password.',\n ),\n )\n }\n}\n/**\n * Cookie-based guard. Requires `req.cookies` to be populated\n * (e.g. via `cookie-parser`).\n */\nexport function createCookieGuard(\n cookieName: string,\n cookieSecret?: string,\n): RequestHandler {\n return (req: Request, res: Response, next: () => void) => {\n const cookies = (req as any).cookies as Record<string, string> | undefined\n const value = cookies?.[cookieName]\n\n const valid = cookieSecret ? value === cookieSecret : Boolean(value)\n\n if (valid) {\n return next()\n }\n\n applyDocsSecurityHeaders(res)\n res\n .status(401)\n .send(\n renderAuthErrorPage(\n 'Docs are protected. You must be authenticated to access this page.',\n ),\n )\n }\n}\n/**\n * When auth is enabled but no password/cookie/custom guard is provided,\n * fail closed.\n */\nexport function createMissingPasswordGuard(): RequestHandler {\n return (_req: Request, res: Response) => {\n applyDocsSecurityHeaders(res)\n res\n .status(500)\n .send(renderAuthErrorPage('Provide auth configuration to mounted docs'))\n }\n}\n/**\n * Extract password from HTTP Basic Authorization header.\n */\nfunction extractPassword(authHeader: string | string[] | undefined) {\n if (!authHeader) return undefined\n const header = Array.isArray(authHeader) ? authHeader[0] : authHeader\n if (typeof header !== 'string' || !header.startsWith('Basic '))\n return undefined\n const token = header.slice('Basic '.length)\n try {\n const decoded = Buffer.from(token, 'base64').toString('utf8')\n const parts = decoded.split(':')\n parts.shift() // username\n return parts.join(':')\n } catch {\n return undefined\n }\n}\n/**\n * Simple IP allow-list guard. For accurate client IPs behind proxies,\n * configure `app.set('trust proxy', true)` in your Express app.\n */\nexport function createIpAllowListGuard(allowed: string[]): RequestHandler {\n const ranges = allowed\n .map((raw) => raw.trim())\n .filter(Boolean)\n .map(parseIpPattern)\n .filter((r): r is IpRange => r !== null)\n\n return (req: Request, res: Response, next: () => void) => {\n const rawIp =\n req.ip || (req.connection && (req.connection as any).remoteAddress) || ''\n const ip = normalizeIp(rawIp)\n\n if (!ip || !isIpAllowed(ip, ranges)) {\n applyDocsSecurityHeaders(res)\n res\n .status(403)\n .send(\n renderAuthErrorPage(\n 'Access to docs is restricted from this IP address.',\n ),\n )\n return\n }\n\n next()\n }\n}\ntype IpRange =\n | { kind: 'exact'; value: string }\n | { kind: 'cidr'; base: number; mask: number }\n/**\n * Normalize typical Express IP formats, including IPv4-mapped IPv6.\n */\nfunction normalizeIp(ip: string): string {\n if (!ip) return ''\n if (ip.startsWith('::ffff:')) return ip.slice(7)\n if (ip === '::1') return '127.0.0.1'\n return ip\n}\nfunction parseIpPattern(raw: string): IpRange | null {\n if (raw.includes('/')) {\n const cidr = parseCidr(raw)\n if (!cidr) return null\n return { kind: 'cidr', base: cidr.base, mask: cidr.mask }\n }\n\n // Exact string match (IPv4 or IPv6).\n return { kind: 'exact', value: normalizeIp(raw) }\n}\nfunction parseCidr(raw: string): { base: number; mask: number } | null {\n const [baseIp, bitsStr] = raw.split('/')\n const bits = Number(bitsStr)\n if (!Number.isInteger(bits) || bits < 0 || bits > 32) return null\n if (net.isIP(baseIp) !== 4) return null // IPv4 CIDR only for simplicity\n\n const baseLong = ipToLong(baseIp)\n if (baseLong == null) return null\n\n const mask = bits === 0 ? 0 : (~0 << (32 - bits)) >>> 0\n return { base: (baseLong & mask) >>> 0, mask }\n}\nfunction ipToLong(ip: string): number | null {\n const parts = ip.split('.').map((n) => Number(n))\n if (parts.length !== 4) return null\n if (parts.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) return null\n return (\n ((parts[0] << 24) >>> 0) +\n ((parts[1] << 16) >>> 0) +\n ((parts[2] << 8) >>> 0) +\n parts[3]\n )\n}\nfunction isIpAllowed(ip: string, ranges: IpRange[]): boolean {\n const ipv4 = net.isIP(ip) === 4 ? ipToLong(ip) : null\n\n for (const r of ranges) {\n if (r.kind === 'exact') {\n if (ip === r.value) return true\n } else if (r.kind === 'cidr' && ipv4 != null) {\n if ((ipv4 & r.mask) === r.base) return true\n }\n }\n\n return false\n}\nfunction renderAuthErrorPage(message: string) {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>RRRoutes docs locked</title>\n <style>\n body { margin:0; font-family: system-ui, -apple-system, Segoe UI, sans-serif; background: #0f172a; color: #e2e8f0; display:flex; align-items:center; justify-content:center; min-height:100vh; }\n .card { padding:32px; border:1px solid #1e293b; border-radius:12px; max-width:420px; background: rgba(15,23,42,0.8); box-shadow:0 15px 45px rgba(0,0,0,0.35); }\n h1 { margin:0 0 12px; font-size:22px; }\n p { margin:0; line-height:1.5; color:#cbd5e1; }\n code { background: rgba(226,232,240,0.1); padding: 2px 4px; border-radius: 4px; }\n </style>\n</head>\n<body>\n <div class=\"card\">\n <h1>Docs locked</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\nexport function applyDocsSecurityHeaders(res: Response) {\n res.setHeader('X-Content-Type-Options', 'nosniff')\n res.setHeader('Referrer-Policy', 'same-origin')\n res.setHeader('X-Frame-Options', 'SAMEORIGIN')\n res.setHeader('Cache-Control', 'no-store')\n res.setHeader(\n 'Strict-Transport-Security',\n 'max-age=31536000; includeSubDomains',\n )\n}\n","import {\n AnyLeafLowProfile,\n AugmentLeaves,\n finalize,\n FinalizedRegistry,\n resource,\n} from '@emeryld/rrroutes-contract'\nimport { cacheLeaves } from '../v2/types/types.cacheLog'\nimport { endpointLeaves } from '../v2/types/types.endpoint'\nimport { logLeaves } from '../v2/types/types.log'\nimport { presetLeaves } from '../v2/types/types.preset'\nimport { requestLogLeaves } from '../v2/types/types.requestLog'\n\ntype MountedLeaves<Leaves extends readonly AnyLeafLowProfile[]> = AugmentLeaves<\n '/__rrroutes',\n undefined,\n Leaves\n>\ntype AllLeaves = readonly [\n ...MountedLeaves<typeof endpointLeaves>,\n ...MountedLeaves<typeof requestLogLeaves>,\n ...MountedLeaves<typeof logLeaves>,\n ...MountedLeaves<typeof cacheLeaves>,\n ...MountedLeaves<typeof presetLeaves>,\n]\n\nconst allLeaves: AllLeaves = resource()\n .sub(\n resource('/__rrroutes')\n .sub(\n endpointLeaves,\n requestLogLeaves,\n logLeaves,\n cacheLeaves,\n presetLeaves,\n )\n .done(),\n )\n .done()\n\nexport const leaves: FinalizedRegistry<typeof allLeaves> = finalize(allLeaves)\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema } from './types.base'\n\nconst operationEnum = z.enum(['hit', 'miss', 'set', 'delete'])\nexport const cacheLogSchema = baseEntitySchema.extend({\n operation: operationEnum,\n // on hit, value = value retrieved\n // on miss, value = null\n // on set, value = value set\n // on delete, value = value deleted\n value: z.any().nullable(),\n size: z.number().optional(),\n})\n\nexport const cacheLogQuerySchema = baseQuerySchema.extend({\n operations: operationEnum.array().optional(),\n})\n\nexport const cacheLeaves = resource('cache')\n .get({\n feed: true,\n outputSchema: cacheLogSchema.array(),\n querySchema: cacheLogQuerySchema,\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n })\n .sub(\n resource('clear')\n .post({\n outputSchema: z.object({ success: z.boolean() }),\n querySchema: cacheLogQuerySchema,\n })\n .done(),\n )\n .done()\n","import z from 'zod'\n\nexport const METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const\nexport type MethodType = (typeof METHODS)[number]\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\n .enum(['timestamp', 'duration', 'level', 'path'])\n .default('timestamp'),\n orderDirection: z.enum(['asc', 'desc']).default('desc'),\n searchQuery: z.string().optional(),\n groups: z.string().array().optional(),\n tags: z.string().array().optional(),\n cursor: z.string().optional(),\n})\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z, { ZodType } from 'zod'\nimport { baseEntitySchema, baseQuerySchema, METHODS } 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] as const\nconst stabilityEnum = z.enum(STABILITIES)\nexport const endpointSchema = baseEntitySchema.extend({\n method: z.enum(METHODS),\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 Endpoint = z.output<typeof endpointSchema>\n\nexport const endpointFilterSchema = baseQuerySchema.extend({\n methods: z.enum(METHODS).array().optional(),\n path: z.string().optional(),\n stability: stabilityEnum.array().optional(),\n})\n\nexport const endpointLeaves = resource('endpoints')\n .get({\n feed: true,\n querySchema: endpointFilterSchema,\n outputSchema: endpointSchema.array(),\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n })\n .sub(\n resource(':endpointId', undefined, z.string())\n .get({\n outputSchema: 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.string(),\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 latestErrorRequestIds: z.array(z.string()),\n }),\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema, METHODS } from './types.base'\nimport { cacheLogSchema } 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: z.enum(METHODS),\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})\n\nexport type RequestLogType = z.infer<typeof requestSchema>\n\nexport const requestQuerySchema = baseQuerySchema.extend({\n methods: z.enum(METHODS).array().default([]),\n statuses: z.number().array().default([]),\n path: z.string().optional(),\n})\n\nexport const requestLogLeaves = resource('requests')\n .get({\n feed: true,\n outputSchema: requestSchema.array(),\n querySchema: requestQuerySchema,\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\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(cacheLogSchema),\n }),\n })\n .done(),\n )\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema } from './types.base'\n\nconst levelSchema = z.enum(['info', 'warning', 'error', 'debug', 'trace'])\nexport const logSchema = baseEntitySchema.extend({\n level: levelSchema,\n meta: z.json(),\n})\n\nexport const logQuerySchema = baseQuerySchema.extend({\n level: levelSchema.array().optional(),\n})\n\nexport const logLeaves = resource('logs')\n .get({\n feed: true,\n outputSchema: logSchema.array(),\n querySchema: logQuerySchema,\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n })\n .done()\n","import { resource } from '@emeryld/rrroutes-contract'\nimport z from 'zod'\nimport { baseEntitySchema, baseQuerySchema, METHODS } from './types.base'\n\nconst presetSchema = baseEntitySchema.extend({\n operations: z.array(\n z.object({\n endpointId: z.string().optional(),\n method: z.enum(METHODS),\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})\n\nconst presetQuerySchema = baseQuerySchema.extend({\n name: z.string().optional(),\n tags: z.string().array().optional(),\n group: z.string().optional(),\n})\n\nexport const presetLeaves = resource('presets')\n .get({\n feed: true,\n querySchema: presetQuerySchema.array(),\n outputMetaSchema: z.object({\n totalCount: z.number().optional(),\n }),\n outputSchema: presetSchema.array(),\n })\n .post({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .put({\n bodySchema: presetSchema,\n outputSchema: presetSchema,\n })\n .done()\n"],"mappings":"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","names":["renderLeafDocsHTML","path","renderLeafDocsHTML","net","import_rrroutes_contract","import_rrroutes_contract","import_zod","z","z","import_rrroutes_contract","import_zod","import_rrroutes_contract","import_zod","import_rrroutes_contract","import_zod","z","z","z","import_rrroutes_contract","import_zod","z","path","fs","expressStatic","renderLeafDocsHTML"]}
|