@blaaiz/docs-core 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{chunk-ZWDLAW5M.js → chunk-2GUUVNTP.js} +222 -28
  2. package/dist/chunk-2GUUVNTP.js.map +1 -0
  3. package/dist/{chunk-ZKOOKLZ3.js → chunk-6H6OB7YP.js} +17 -2
  4. package/dist/chunk-6H6OB7YP.js.map +1 -0
  5. package/dist/generator.cjs +161 -18
  6. package/dist/generator.cjs.map +1 -1
  7. package/dist/generator.d.cts +24 -0
  8. package/dist/generator.d.ts +24 -0
  9. package/dist/generator.js +140 -13
  10. package/dist/generator.js.map +1 -1
  11. package/dist/index.cjs +224 -25
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +249 -4
  14. package/dist/index.d.ts +249 -4
  15. package/dist/index.js +1 -1
  16. package/dist/{navigation-CGqFIPlP.d.cts → navigation-DvgyWSZ4.d.cts} +22 -1
  17. package/dist/{navigation-CGqFIPlP.d.ts → navigation-DvgyWSZ4.d.ts} +22 -1
  18. package/dist/ui/api-try-it.cjs +15 -0
  19. package/dist/ui/api-try-it.cjs.map +1 -1
  20. package/dist/ui/api-try-it.js +1 -1
  21. package/dist/ui/ask-ai.cjs +26 -6
  22. package/dist/ui/ask-ai.cjs.map +1 -1
  23. package/dist/ui/ask-ai.d.cts +6 -1
  24. package/dist/ui/ask-ai.d.ts +6 -1
  25. package/dist/ui/ask-ai.js +26 -6
  26. package/dist/ui/ask-ai.js.map +1 -1
  27. package/dist/ui/copy-page.cjs +15 -0
  28. package/dist/ui/copy-page.cjs.map +1 -1
  29. package/dist/ui/copy-page.js +1 -1
  30. package/dist/ui.cjs +77 -6
  31. package/dist/ui.cjs.map +1 -1
  32. package/dist/ui.d.cts +99 -8
  33. package/dist/ui.d.ts +99 -8
  34. package/dist/ui.js +62 -8
  35. package/dist/ui.js.map +1 -1
  36. package/package.json +1 -1
  37. package/skills/SKILL.md +68 -27
  38. package/styles/api-reference.css +45 -2
  39. package/styles/ask-ai.css +28 -0
  40. package/styles/docs.css +96 -1
  41. package/styles/home.css +34 -1
  42. package/dist/chunk-ZKOOKLZ3.js.map +0 -1
  43. package/dist/chunk-ZWDLAW5M.js.map +0 -1
@@ -1361,6 +1361,22 @@ function validateFeatures(value) {
1361
1361
  }
1362
1362
  optionalBoolean(features["copyPage"], "features.copyPage");
1363
1363
  }
1364
+ function validateNavbarAction(value, field) {
1365
+ const action = optionalObject(value, field);
1366
+ if (action === void 0) {
1367
+ return;
1368
+ }
1369
+ requireString(action["text"], `${field}.text`, "Example: 'Dashboard'.");
1370
+ requireString(action["href"], `${field}.href`, "Example: 'https://app.example.com'.");
1371
+ }
1372
+ function validateNavbar(value) {
1373
+ const navbar = optionalObject(value, "navbar");
1374
+ if (navbar === void 0) {
1375
+ return;
1376
+ }
1377
+ validateNavbarAction(navbar["primary"], "navbar.primary");
1378
+ validateNavbarAction(navbar["secondary"], "navbar.secondary");
1379
+ }
1364
1380
  function validateSeo(value) {
1365
1381
  const seo = optionalObject(value, "seo");
1366
1382
  if (seo === void 0) {
@@ -1411,6 +1427,7 @@ function validateDocsConfig(config) {
1411
1427
  validateTheme(config["theme"]);
1412
1428
  validateAuth(config["auth"]);
1413
1429
  validateProxy(config["proxy"]);
1430
+ validateNavbar(config["navbar"]);
1414
1431
  validateFeatures(config["features"]);
1415
1432
  validateSeo(config["seo"]);
1416
1433
  if (config["ai"] !== void 0) {
@@ -1458,6 +1475,90 @@ function buildThemeCss(theme) {
1458
1475
  return blocks.join("\n");
1459
1476
  }
1460
1477
 
1478
+ // src/core/redirects.ts
1479
+ function redirectTarget(url, redirects) {
1480
+ const { pathname } = url;
1481
+ const markdown = pathname.endsWith(".md");
1482
+ const page = markdown ? pathname.slice(0, -3) : pathname;
1483
+ const destination = redirects[page];
1484
+ if (destination === void 0) {
1485
+ return null;
1486
+ }
1487
+ const target = new URL(url);
1488
+ target.pathname = markdown ? `${destination}.md` : destination;
1489
+ return target;
1490
+ }
1491
+
1492
+ // src/core/llms-txt.ts
1493
+ function buildLlmsTxt(pages, options) {
1494
+ const origin = options.origin?.replace(/\/$/, "") ?? "";
1495
+ const lines = [`# ${options.name}`];
1496
+ if (options.description !== void 0 && options.description !== "") {
1497
+ lines.push("", `> ${options.description}`);
1498
+ }
1499
+ lines.push("", "## Docs", "");
1500
+ for (const page of pages) {
1501
+ const link = `[${page.title}](${origin}${page.url}.md)`;
1502
+ lines.push(
1503
+ page.description === void 0 || page.description === "" ? `- ${link}` : `- ${link}: ${page.description}`
1504
+ );
1505
+ }
1506
+ lines.push("");
1507
+ return lines.join("\n");
1508
+ }
1509
+
1510
+ // src/core/code-samples.ts
1511
+ function singleQuote(value) {
1512
+ return `'${value.replaceAll("'", "'\\''")}'`;
1513
+ }
1514
+ function isRecord(value) {
1515
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1516
+ }
1517
+ function bodyToString(body, mediaType) {
1518
+ if (typeof body === "string") {
1519
+ return body;
1520
+ }
1521
+ if (mediaType === "application/x-www-form-urlencoded" && isRecord(body)) {
1522
+ const params = new URLSearchParams();
1523
+ for (const [key, value] of Object.entries(body)) {
1524
+ if (value === void 0 || value === null) {
1525
+ continue;
1526
+ }
1527
+ const encoded = typeof value === "string" || typeof value === "number" || typeof value === "boolean" ? String(value) : JSON.stringify(value);
1528
+ params.set(key, encoded);
1529
+ }
1530
+ return params.toString();
1531
+ }
1532
+ if (mediaType === "application/x-ndjson" && Array.isArray(body)) {
1533
+ return body.map((entry) => JSON.stringify(entry)).join("\n");
1534
+ }
1535
+ return JSON.stringify(body, null, 2);
1536
+ }
1537
+ var curlCodeUsage = {
1538
+ label: "cURL",
1539
+ lang: "bash",
1540
+ generate(data) {
1541
+ const lines = [`curl --request ${data.method.toUpperCase()}`, `--url ${singleQuote(data.url)}`];
1542
+ for (const [name, param] of Object.entries(data.header ?? {})) {
1543
+ lines.push(`--header ${singleQuote(`${name}: ${param.value}`)}`);
1544
+ }
1545
+ for (const [name, param] of Object.entries(data.cookie ?? {})) {
1546
+ lines.push(`--cookie ${singleQuote(`${name}=${param.value}`)}`);
1547
+ }
1548
+ if (isRecord(data.body) && data.bodyMediaType === "multipart/form-data") {
1549
+ for (const [key, value] of Object.entries(data.body)) {
1550
+ lines.push(
1551
+ `--form ${singleQuote(`${key}=${typeof value === "string" ? value : JSON.stringify(value)}`)}`
1552
+ );
1553
+ }
1554
+ } else if (data.body !== void 0 && data.body !== null && data.bodyMediaType !== void 0) {
1555
+ lines.push(`--header ${singleQuote(`Content-Type: ${data.bodyMediaType}`)}`);
1556
+ lines.push(`--data ${singleQuote(bodyToString(data.body, data.bodyMediaType))}`);
1557
+ }
1558
+ return lines.map((line, i) => i === 0 ? line : ` ${line}`).join(" \\\n");
1559
+ }
1560
+ };
1561
+
1461
1562
  // src/core/seo.ts
1462
1563
  function trimTrailingSlash(value) {
1463
1564
  return value.replace(/\/+$/, "");
@@ -1560,6 +1661,7 @@ function firstDocFile(items) {
1560
1661
  }
1561
1662
  function planDocsTree(navigation, options = {}) {
1562
1663
  const apiDir = options.apiDir ?? "api";
1664
+ const headings = (options.sidebar ?? "collapsible") === "headings";
1563
1665
  const specs = [];
1564
1666
  const apiPages = [];
1565
1667
  const apiGroups = [];
@@ -1607,7 +1709,7 @@ function planDocsTree(navigation, options = {}) {
1607
1709
  const at = apiGroups.length;
1608
1710
  const sub = planApiItems(item.items, childDir);
1609
1711
  apiGroups.splice(at, 0, { dir: childDir, title: item.title, children: sub });
1610
- children.push({ order, folder });
1712
+ children.push({ order, folder, title: item.title });
1611
1713
  order += 1;
1612
1714
  continue;
1613
1715
  }
@@ -1645,11 +1747,11 @@ function planDocsTree(navigation, options = {}) {
1645
1747
  title: tab.title,
1646
1748
  root: true,
1647
1749
  ...tab.icon ? { icon: tab.icon } : {},
1648
- pages: planDocItems(tab.items, tabDir)
1750
+ pages: planDocItems(tab.items, tabDir, true)
1649
1751
  }
1650
1752
  });
1651
1753
  }
1652
- function planDocItems(items, dir) {
1754
+ function planDocItems(items, dir, tabLevel) {
1653
1755
  const entries = [];
1654
1756
  for (const item of items) {
1655
1757
  if (item.kind === "doc") {
@@ -1664,10 +1766,18 @@ function planDocsTree(navigation, options = {}) {
1664
1766
  continue;
1665
1767
  }
1666
1768
  if (groupDir === dir) {
1667
- entries.push(...planDocItems(item.items, dir));
1769
+ if (headings) {
1770
+ entries.push(`---${item.title}---`);
1771
+ }
1772
+ entries.push(...planDocItems(item.items, dir, false));
1773
+ continue;
1774
+ }
1775
+ const folder = groupDir.slice(dir.length + 1);
1776
+ if (headings && tabLevel) {
1777
+ entries.push(`---${item.title}---`, `...${folder}`);
1668
1778
  continue;
1669
1779
  }
1670
- entries.push(groupDir.slice(dir.length + 1));
1780
+ entries.push(folder);
1671
1781
  }
1672
1782
  return entries;
1673
1783
  }
@@ -1682,7 +1792,14 @@ function planDocsTree(navigation, options = {}) {
1682
1792
  }
1683
1793
  metas.push({
1684
1794
  path: `${groupDir}/meta.json`,
1685
- content: { title: group.title, pages: planDocItems(group.items, groupDir) }
1795
+ content: {
1796
+ title: group.title,
1797
+ // A nested group starts closed in the headings style, whatever the
1798
+ // site's defaultOpenLevel. On a tab-level group the flag is inert:
1799
+ // that folder is extracted, so no folder node renders it.
1800
+ ...headings ? { defaultOpen: false } : {},
1801
+ pages: planDocItems(group.items, groupDir, false)
1802
+ }
1686
1803
  });
1687
1804
  return groupDir;
1688
1805
  }
@@ -2115,10 +2232,67 @@ ${description ? `${description}
2115
2232
  ` : ""}${cleanBody(trimmedBody)}
2116
2233
  `;
2117
2234
  }
2235
+ function operationHead(operation) {
2236
+ let title;
2237
+ let description;
2238
+ try {
2239
+ const parsed = JSON.parse(operation.source);
2240
+ const exact = parsed.paths?.[operation.route]?.[operation.method.toLowerCase()];
2241
+ const first = Object.values(parsed.paths ?? {}).flatMap((item) => Object.values(item))[0];
2242
+ const named = exact ?? first;
2243
+ title = named?.summary ?? parsed.info?.title;
2244
+ description = named?.description ?? parsed.info?.description;
2245
+ } catch {
2246
+ }
2247
+ const head = [`# ${title ?? "API operation"}`];
2248
+ if (description !== void 0 && description !== "") {
2249
+ head.push("", `> ${description.replace(/\n/g, "\n> ")}`);
2250
+ }
2251
+ return head.join("\n");
2252
+ }
2253
+ function fenceFor(source) {
2254
+ const longest = source.match(/`+/g)?.reduce((max, run) => Math.max(max, run.length), 0) ?? 0;
2255
+ return "`".repeat(Math.max(4, longest + 1));
2256
+ }
2118
2257
  function createMarkdownRoute(options) {
2258
+ const requestOrigin = (request) => {
2259
+ const url = new URL(request.url);
2260
+ const proto = request.headers.get("x-forwarded-proto") ?? url.protocol.replace(/:$/, "");
2261
+ const host = request.headers.get("x-forwarded-host") ?? request.headers.get("host") ?? url.host;
2262
+ return `${proto}://${host}`;
2263
+ };
2264
+ const respond = (request, markdown) => {
2265
+ const preamble = options.llmsTxtPath === void 0 ? "" : [
2266
+ "> ## Documentation Index",
2267
+ `> Fetch the complete documentation index at: ${requestOrigin(request)}${options.llmsTxtPath}`,
2268
+ "> Use this file to discover all available pages before exploring further.",
2269
+ "",
2270
+ ""
2271
+ ].join("\n");
2272
+ return new Response(`${preamble}${markdown}`, {
2273
+ headers: { "content-type": "text/plain; charset=utf-8" }
2274
+ });
2275
+ };
2119
2276
  return {
2120
- async GET(_request, context) {
2277
+ async GET(request, context) {
2121
2278
  const { slug } = await context.params;
2279
+ const operation = await options.loadOperationSource?.(slug);
2280
+ if (operation) {
2281
+ const fence = fenceFor(operation.source);
2282
+ return respond(
2283
+ request,
2284
+ [
2285
+ operationHead(operation),
2286
+ "",
2287
+ "## OpenAPI",
2288
+ "",
2289
+ `${fence}json ${operation.file} ${operation.method.toLowerCase()} ${operation.route}`,
2290
+ operation.source.trimEnd(),
2291
+ fence,
2292
+ ""
2293
+ ].join("\n")
2294
+ );
2295
+ }
2122
2296
  const raw = await options.read(slug);
2123
2297
  if (raw === null) {
2124
2298
  return new Response("Not found", { status: 404 });
@@ -2132,12 +2306,32 @@ function createMarkdownRoute(options) {
2132
2306
  if (markdown === null) {
2133
2307
  return new Response("Not found", { status: 404 });
2134
2308
  }
2135
- return new Response(markdown, {
2136
- headers: { "content-type": "text/plain; charset=utf-8" }
2137
- });
2309
+ return respond(request, markdown);
2138
2310
  }
2139
2311
  };
2140
2312
  }
2313
+ function markdownRewriteTarget(url, options = {}) {
2314
+ const baseUrl = (options.baseUrl ?? "/docs").replace(/\/+$/, "");
2315
+ const markdownBase = (options.markdownBase ?? "/md").replace(/\/+$/, "");
2316
+ const { pathname } = url;
2317
+ if (!pathname.endsWith(".md") || pathname.includes("%")) {
2318
+ return null;
2319
+ }
2320
+ const page = pathname.slice(0, -3);
2321
+ if (page !== baseUrl && !page.startsWith(`${baseUrl}/`)) {
2322
+ return null;
2323
+ }
2324
+ if (page.endsWith("/") || page.includes("//")) {
2325
+ return null;
2326
+ }
2327
+ const target = new URL(url);
2328
+ target.pathname = `${markdownBase}${page.slice(baseUrl.length)}`;
2329
+ return target;
2330
+ }
2331
+ function isMarkdownRouteRequest(url, options = {}) {
2332
+ const markdownBase = options.markdownBase ?? "/md";
2333
+ return url.pathname === markdownBase || url.pathname.startsWith(`${markdownBase}/`);
2334
+ }
2141
2335
 
2142
2336
  // src/core/auth/domains.ts
2143
2337
  function isAllowedEmail(email, allowedDomains) {
@@ -2921,7 +3115,7 @@ var InvalidNavigationError = class extends Error {
2921
3115
  this.name = "InvalidNavigationError";
2922
3116
  }
2923
3117
  };
2924
- function isRecord(value) {
3118
+ function isRecord2(value) {
2925
3119
  return typeof value === "object" && value !== null && !Array.isArray(value);
2926
3120
  }
2927
3121
  function parsePageString(entry) {
@@ -2944,7 +3138,7 @@ function parseItem(entry, path) {
2944
3138
  if (typeof entry === "string") {
2945
3139
  return parsePageString(entry);
2946
3140
  }
2947
- if (isRecord(entry) && typeof entry["group"] === "string") {
3141
+ if (isRecord2(entry) && typeof entry["group"] === "string") {
2948
3142
  return parseGroup(entry, path);
2949
3143
  }
2950
3144
  throw new InvalidNavigationError(
@@ -2969,7 +3163,7 @@ function parseGroup(group, path) {
2969
3163
  };
2970
3164
  }
2971
3165
  function parseTab(tab, path) {
2972
- if (!isRecord(tab) || typeof tab["tab"] !== "string") {
3166
+ if (!isRecord2(tab) || typeof tab["tab"] !== "string") {
2973
3167
  throw new InvalidNavigationError(`Tab at ${path} is missing a string "tab" title.`);
2974
3168
  }
2975
3169
  const items = tab["groups"] !== void 0 ? parseGroups(tab["groups"], `${path}.groups`) : parseItems(tab["pages"], `${path}.pages`);
@@ -2987,18 +3181,18 @@ function parseGroups(groups, path) {
2987
3181
  }
2988
3182
  return groups.map((group, index) => {
2989
3183
  const groupPath = `${path}[${String(index)}]`;
2990
- if (!isRecord(group)) {
3184
+ if (!isRecord2(group)) {
2991
3185
  throw new InvalidNavigationError(`Group at ${groupPath} must be an object.`);
2992
3186
  }
2993
3187
  return parseGroup(group, groupPath);
2994
3188
  });
2995
3189
  }
2996
3190
  function parseNavigation(docsJson) {
2997
- if (!isRecord(docsJson)) {
3191
+ if (!isRecord2(docsJson)) {
2998
3192
  throw new InvalidNavigationError("docs.json must be an object.");
2999
3193
  }
3000
3194
  const navigation = docsJson["navigation"];
3001
- if (!isRecord(navigation)) {
3195
+ if (!isRecord2(navigation)) {
3002
3196
  throw new InvalidNavigationError('docs.json must have a "navigation" object.');
3003
3197
  }
3004
3198
  const tabs = navigation["tabs"];
@@ -3015,7 +3209,7 @@ var OpenApiMergeError = class extends Error {
3015
3209
  this.name = "OpenApiMergeError";
3016
3210
  }
3017
3211
  };
3018
- function isRecord2(value) {
3212
+ function isRecord3(value) {
3019
3213
  return typeof value === "object" && value !== null && !Array.isArray(value);
3020
3214
  }
3021
3215
  function collectServers(inputs, override) {
@@ -3029,7 +3223,7 @@ function collectServers(inputs, override) {
3029
3223
  continue;
3030
3224
  }
3031
3225
  for (const server of servers) {
3032
- if (isRecord2(server) && typeof server["url"] === "string" && !byUrl.has(server["url"])) {
3226
+ if (isRecord3(server) && typeof server["url"] === "string" && !byUrl.has(server["url"])) {
3033
3227
  byUrl.set(server["url"], server);
3034
3228
  }
3035
3229
  }
@@ -3044,7 +3238,7 @@ function collectTags(inputs) {
3044
3238
  continue;
3045
3239
  }
3046
3240
  for (const tag of tags) {
3047
- if (isRecord2(tag) && typeof tag["name"] === "string" && !byName.has(tag["name"])) {
3241
+ if (isRecord3(tag) && typeof tag["name"] === "string" && !byName.has(tag["name"])) {
3048
3242
  byName.set(tag["name"], tag);
3049
3243
  }
3050
3244
  }
@@ -3055,11 +3249,11 @@ function mergeComponents(inputs) {
3055
3249
  const merged = {};
3056
3250
  for (const doc of inputs) {
3057
3251
  const components = doc["components"];
3058
- if (!isRecord2(components)) {
3252
+ if (!isRecord3(components)) {
3059
3253
  continue;
3060
3254
  }
3061
3255
  for (const [section, value] of Object.entries(components)) {
3062
- if (!isRecord2(value)) {
3256
+ if (!isRecord3(value)) {
3063
3257
  continue;
3064
3258
  }
3065
3259
  const target = merged[section] ?? (merged[section] = {});
@@ -3077,12 +3271,12 @@ function assemblePaths(inputs) {
3077
3271
  const paths = {};
3078
3272
  for (const doc of inputs) {
3079
3273
  const docPaths = doc["paths"];
3080
- if (!isRecord2(docPaths)) {
3274
+ if (!isRecord3(docPaths)) {
3081
3275
  throw new OpenApiMergeError('Each OpenAPI input must have a "paths" object.');
3082
3276
  }
3083
3277
  const docSecurity = doc["security"];
3084
3278
  for (const [route, pathItem] of Object.entries(docPaths)) {
3085
- if (!isRecord2(pathItem)) {
3279
+ if (!isRecord3(pathItem)) {
3086
3280
  throw new OpenApiMergeError(`Path item for "${route}" must be an object.`);
3087
3281
  }
3088
3282
  const target = paths[route] ?? (paths[route] = {});
@@ -3093,7 +3287,7 @@ function assemblePaths(inputs) {
3093
3287
  );
3094
3288
  }
3095
3289
  let resolved = operation;
3096
- if (HTTP_METHODS2.has(method.toLowerCase()) && isRecord2(operation) && !("security" in operation) && Array.isArray(docSecurity)) {
3290
+ if (HTTP_METHODS2.has(method.toLowerCase()) && isRecord3(operation) && !("security" in operation) && Array.isArray(docSecurity)) {
3097
3291
  resolved = { ...operation, security: docSecurity };
3098
3292
  }
3099
3293
  target[method] = resolved;
@@ -3104,7 +3298,7 @@ function assemblePaths(inputs) {
3104
3298
  }
3105
3299
  function mergeOpenApiDocuments(inputs, options) {
3106
3300
  const records = inputs.map((input, index) => {
3107
- if (!isRecord2(input)) {
3301
+ if (!isRecord3(input)) {
3108
3302
  throw new OpenApiMergeError(`OpenAPI input at index ${String(index)} must be an object.`);
3109
3303
  }
3110
3304
  return input;
@@ -3119,6 +3313,6 @@ function mergeOpenApiDocuments(inputs, options) {
3119
3313
  };
3120
3314
  }
3121
3315
 
3122
- export { AI_PROVIDER_MODELS, AI_PROVIDER_NAMES, AiConfigError, DocsConfigError, InvalidNavigationError, OpenApiMergeError, ProxyTargetError, SESSION_COOKIE, assertAllowedTarget, buildMetadata, buildRobots, buildSearchIndex, buildSessionCookie, buildSitemap, buildThemeCss, clearSessionCookie, createAskAiRoute, createAuthGate, createEmailSignIn, createGoogleAuth, createMarkdownRoute, createSecretSignIn, createSignOut, createSiteAuth, createTryItProxy, createTryItProxyRoute, defineDocsConfig, isAllowedEmail, mdxToMarkdown, mergeOpenApiDocuments, openApiOperationToMarkdown, parseNavigation, planDocsTree, readCookie, resolveAiConfig, searchIndex, signSession, unwrapProxyTarget, validateDocsConfig, verifySession };
3123
- //# sourceMappingURL=chunk-ZWDLAW5M.js.map
3124
- //# sourceMappingURL=chunk-ZWDLAW5M.js.map
3316
+ export { AI_PROVIDER_MODELS, AI_PROVIDER_NAMES, AiConfigError, DocsConfigError, InvalidNavigationError, OpenApiMergeError, ProxyTargetError, SESSION_COOKIE, assertAllowedTarget, buildLlmsTxt, buildMetadata, buildRobots, buildSearchIndex, buildSessionCookie, buildSitemap, buildThemeCss, clearSessionCookie, createAskAiRoute, createAuthGate, createEmailSignIn, createGoogleAuth, createMarkdownRoute, createSecretSignIn, createSignOut, createSiteAuth, createTryItProxy, createTryItProxyRoute, curlCodeUsage, defineDocsConfig, hasOpenApi, isAllowedEmail, isMarkdownRouteRequest, markdownRewriteTarget, mdxToMarkdown, mergeOpenApiDocuments, openApiOperationToMarkdown, parseNavigation, planDocsTree, readCookie, redirectTarget, resolveAiConfig, searchIndex, signSession, unwrapProxyTarget, validateDocsConfig, verifySession };
3317
+ //# sourceMappingURL=chunk-2GUUVNTP.js.map
3318
+ //# sourceMappingURL=chunk-2GUUVNTP.js.map