boltdocs 3.2.1 → 3.3.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.
- package/bin/boltdocs.js +20 -1
- package/bin/preloader.mjs +28 -0
- package/dist/{adapters-ByYY44Zy.mjs → adapters-BmB4TKCc.mjs} +1 -1
- package/dist/{adapters-DvmtpdSF.cjs → adapters-Cp1Maurn.cjs} +1 -1
- package/dist/audit-CLXjMzwQ.mjs +11 -0
- package/dist/audit-COgjnQ5n.cjs +11 -0
- package/dist/build-BS2hefiL.cjs +6 -0
- package/dist/build-C5mNh9D-.mjs +6 -0
- package/dist/cache-CJE9nWLE.cjs +6 -0
- package/dist/cache-OY4HzIXl.mjs +6 -0
- package/dist/callout-oI_LCbxS.d.ts +71 -0
- package/dist/callout-plqx9Dw-.d.cts +71 -0
- package/dist/client/index.cjs +1265 -569
- package/dist/client/index.d.cts +3 -542
- package/dist/client/index.d.ts +3 -542
- package/dist/client/index.js +1167 -521
- package/dist/client/mdx.cjs +1 -1
- package/dist/client/mdx.d.cts +24 -2
- package/dist/client/mdx.d.ts +24 -2
- package/dist/client/mdx.js +1 -1
- package/dist/client/primitives.cjs +14 -4
- package/dist/client/primitives.d.cts +281 -38
- package/dist/client/primitives.d.ts +281 -38
- package/dist/client/primitives.js +5 -5
- package/dist/client/router.cjs +49 -0
- package/dist/client/router.d.cts +3 -0
- package/dist/client/router.d.ts +3 -0
- package/dist/client/router.js +8 -0
- package/dist/client/theme/reset.css +40 -4
- package/dist/{config-BpzaPsJj.d.cts → config-BoRlz0Ca.d.mts} +157 -14
- package/dist/{config-xtS0ZkMm.d.mts → config-CTsX_tGM.d.cts} +157 -14
- package/dist/config-Ceib-AOH.cjs +7 -0
- package/dist/config-DGLQsy7y.mjs +7 -0
- package/dist/{package-BcISI5-P.cjs → config-files-BYHDOrKn.mjs} +1 -1
- package/dist/config-files-D9cdBMl2.cjs +6 -0
- package/dist/config-jJh8WYJI.cjs +6 -0
- package/dist/csp-C4LmN1ko.cjs +6 -0
- package/dist/csp-D6JEOqKh.mjs +6 -0
- package/dist/dev-Ch3hEe5Y.cjs +6 -0
- package/dist/dev-QPNxysrd.mjs +6 -0
- package/dist/{docs-layout-BdtZ9z6s.js → docs-layout-CbZ7LDRe.js} +504 -249
- package/dist/{docs-layout-CFWI15Id.cjs → docs-layout-vzfXed1Q.cjs} +516 -254
- package/dist/{doctor-BBtmNJE0.cjs → doctor-B1_YL0Wt.cjs} +1 -1
- package/dist/doctor-C7whl4ED.cjs +6 -0
- package/dist/doctor-DmQnml2k.mjs +6 -0
- package/dist/{generator-COepVWGi.cjs → generator-BlW45ST7.cjs} +5 -3
- package/dist/{generator-CcOBN5vI.mjs → generator-BwknNejd.mjs} +5 -3
- package/dist/{handler-XX7cLTqe.cjs → handler-CDEoKARD.cjs} +2 -2
- package/dist/{handler-DzQae4eA.mjs → handler-D7UyZlPm.mjs} +2 -2
- package/dist/{image-Bz87fCla.js → image-B-NDSDuY.js} +129 -11
- package/dist/{image-C4TlpMHn.cjs → image-Hnaa2bJd.cjs} +175 -9
- package/dist/index-C56bL-A-.d.cts +1344 -0
- package/dist/{sidebar-COTaMHR-.d.ts → index-CPUUKzxD.d.cts} +344 -327
- package/dist/{sidebar-CrEdJuHX.d.cts → index-Ci4kfOHF.d.ts} +344 -327
- package/dist/index-Cu9H6CRa.d.ts +1344 -0
- package/dist/link-CgdI6O2o.js +872 -0
- package/dist/{link-D1Gjkb-2.cjs → link-vZjmD-es.cjs} +406 -223
- package/dist/{mdx-BuO6a1f7.js → mdx-BRT71V5Q.js} +211 -168
- package/dist/{mdx-CD-tSjRG.cjs → mdx-D0Absdq5.cjs} +225 -169
- package/dist/native-BNCY7PRF.cjs +6 -0
- package/dist/native-Di9Fnfrv.mjs +6 -0
- package/dist/native-Kre2T5eS.cjs +6 -0
- package/dist/node/cache.cjs +1 -1
- package/dist/node/cache.d.cts +19 -3
- package/dist/node/cache.d.mts +19 -3
- package/dist/node/cache.mjs +1 -1
- package/dist/node/cli-entry.cjs +1 -9
- package/dist/node/cli-entry.mjs +1 -9
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.cts +245 -17
- package/dist/node/index.d.mts +246 -18
- package/dist/node/index.mjs +1 -1
- package/dist/node/mdx/shiki-adapter.cjs +1 -1
- package/dist/node/mdx/shiki-adapter.d.cts +24 -3
- package/dist/node/mdx/shiki-adapter.d.mts +24 -2
- package/dist/node/mdx/shiki-adapter.mjs +1 -1
- package/dist/node-Du5UL5wo.mjs +23 -0
- package/dist/node-DunuGqyp.cjs +23 -0
- package/dist/{package-CCYEAYeA.mjs → package-DA848keM.mjs} +1 -1
- package/dist/package-wplzySjz.cjs +6 -0
- package/dist/pages-external-BBw8ObVK.mjs +6 -0
- package/dist/pages-external-DPiPFxxP.cjs +6 -0
- package/dist/parser-BqTOsEUa.cjs +6 -0
- package/dist/parser-CGMY2lJ7.mjs +6 -0
- package/dist/plugin-BcTzvHAJ.mjs +69 -0
- package/dist/plugin-TulVMt1z.cjs +69 -0
- package/dist/plugin-context-C-l90hFt.cjs +15 -0
- package/dist/plugin-context-wqHNSZum.mjs +15 -0
- package/dist/plugin-lifecycle-B1BzSHdn.cjs +6 -0
- package/dist/resolve-B7vWOd8R.cjs +6 -0
- package/dist/resolve-C2kKnk_5.mjs +6 -0
- package/dist/resolve-It1Iug83.cjs +6 -0
- package/dist/resolve-YdTrt_FG.mjs +6 -0
- package/dist/router-C3kygdRK.cjs +1285 -0
- package/dist/router-CZBxMRAH.js +987 -0
- package/dist/routes-BL4y79tb.mjs +6 -0
- package/dist/routes-C2nPecwu.cjs +6 -0
- package/dist/routes-U9L8psZ9.cjs +6 -0
- package/dist/{search-dialog-DHqwjJuG.cjs → search-dialog-BCOHQGSt.cjs} +1 -1
- package/dist/search-dialog-Bp_P1MPP.js +481 -0
- package/dist/{search-dialog-DFnlx8LO.js → search-dialog-BqkzDTq2.js} +107 -57
- package/dist/{search-dialog-BRFno7HD.cjs → search-dialog-CIeIUhAn.cjs} +218 -43
- package/dist/{search-dialog-D6TvjcuV.js → search-dialog-DtmxmfEu.js} +1 -1
- package/dist/{search-dialog-B1NERUNx.cjs → search-dialog-x_qHU8ty.cjs} +107 -58
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.mts +1 -1
- package/dist/server/index.mjs +1 -1
- package/dist/update-check-BKqmYfwT.cjs +11 -0
- package/dist/update-check-QnrVR3q1.mjs +11 -0
- package/dist/utils-8lzafE49.mjs +7 -0
- package/dist/utils-ej6_SjIZ.cjs +7 -0
- package/dist/virtual-modules-Ca5tHk1X.cjs +30 -0
- package/dist/virtual-modules-Dlgt1fP0.mjs +30 -0
- package/package.json +18 -16
- package/src/shared/mdx-path.ts +12 -0
- package/src/shared/structured-data.ts +145 -0
- package/src/shared/types.ts +220 -16
- package/dist/banner-BMop1KLF.d.ts +0 -100
- package/dist/banner-CVD0GugR.d.cts +0 -100
- package/dist/cache-CO4Dy2uQ.cjs +0 -6
- package/dist/cache-Dk53iOo6.mjs +0 -6
- package/dist/config-CCXp3aXO.mjs +0 -7
- package/dist/config-CMd4XoFq.cjs +0 -6
- package/dist/config-DlGoEM9D.cjs +0 -7
- package/dist/csp-CRp_3U7a.cjs +0 -6
- package/dist/csp-oTC2ygvF.mjs +0 -6
- package/dist/doctor-Bv16QSrI.cjs +0 -7
- package/dist/doctor-DOAbSaiL.mjs +0 -7
- package/dist/headers-Ddwek8K7.mjs +0 -6
- package/dist/headers-dg4SDrjY.cjs +0 -6
- package/dist/link-2PzgTnaP.js +0 -673
- package/dist/meta-loader-C4Hu9RN9.mjs +0 -6
- package/dist/meta-loader-Dq1zcFnh.cjs +0 -6
- package/dist/node-BXtqM1uH.mjs +0 -6
- package/dist/node-BlVk4EVg.cjs +0 -104
- package/dist/node-DOf4zhWc.mjs +0 -104
- package/dist/node-aD1eisrR.cjs +0 -6
- package/dist/pages-external-BYa4JSda.mjs +0 -6
- package/dist/pages-external-XkYIs-d5.cjs +0 -6
- package/dist/parser-DCiEWkSk.cjs +0 -8
- package/dist/parser-qk9FIHJ7.mjs +0 -8
- package/dist/plugin-C95kvu6h.mjs +0 -73
- package/dist/plugin-DM3u2bVj.cjs +0 -73
- package/dist/routes-BW6zsk7Z.mjs +0 -6
- package/dist/routes-BgoIB5wb.cjs +0 -6
- package/dist/routes-CORVxc02.cjs +0 -6
- package/dist/search-dialog-BmxHiKwt.js +0 -312
- package/dist/shiki-adapter-CoQ6jyJ4.cjs +0 -6
- package/dist/shiki-adapter-D-aKw7PP.mjs +0 -6
- package/dist/utils-Crm9oPcV.mjs +0 -7
- package/dist/utils-D6Xtj0FZ.cjs +0 -7
- /package/dist/{errors-0zGHRLue.mjs → errors-N-b6Sn2G.mjs} +0 -0
- /package/dist/{index-1KsTDq4o.d.mts → index-lFoyzCXy.d.mts} +0 -0
- /package/dist/{types-generator-BXhv7Ill.cjs → types-generator-DDSA93P3.cjs} +0 -0
- /package/dist/{types-generator-bDPvUztF.mjs → types-generator-DG1GX1EZ.mjs} +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
import{t as e}from"./chunk-BFSpntXv.mjs";import{o as t,t as n}from"./utils-8lzafE49.mjs";import{n as r}from"./pages-external-BBw8ObVK.mjs";import{FileCache as i}from"./node/cache.mjs";import{t as a}from"./cache-OY4HzIXl.mjs";import o from"node:path";import s from"node:fs";import c from"node:crypto";import{warn as l}from"@bdocs/dui";import u from"node:fs/promises";import{fdir as d}from"fdir";function f(e){return o.resolve(e)}function p(e,t){return c.createHash(`sha1`).update(`${f(e)}:${t}`).digest(`hex`).slice(0,16)}function m(e,n,r){let s=p(e,r),c=t();return{fingerprint:r,docCache:new i({name:`routes-${s}`,root:n}),parserCache:new a(n,s),cachedFileList:null,localizedPathCache:new Map,cachedNativeDocs:null,frontmatterHashes:new Map,directoryMeta:null,cachedDirectoryMetaFiles:null,directoryMetaEntries:new Map,discoverySnapshot:null,discoverySnapshotLoaded:!1,discoverySnapshotPath:o.resolve(n,c.dir,`route-discovery-${s}.json`)}}function h(e,t=o.dirname(o.resolve(e))){let n=f(e),r=o.resolve(t),i=m(n,r,`legacy`);return{docsDir:n,cacheRoot:r,docCache:i.docCache,parserCache:i.parserCache,cachedFileList:i.cachedFileList,localizedPathCache:i.localizedPathCache,cachedNativeDocs:i.cachedNativeDocs,frontmatterHashes:i.frontmatterHashes,directoryMeta:i.directoryMeta,cachedDirectoryMetaFiles:i.cachedDirectoryMetaFiles,variants:new Map([[`legacy`,i]]),activeVariant:i,activeGenerations:new Map,generationEpoch:0,disposed:!1}}const g=new Map;function _(e,t,n=!1){if(e.disposed)throw Error(`[boltdocs] Route cache context has been disposed.`);let r=e.variants.get(t);if(!r&&(r=m(e.docsDir,e.cacheRoot,t),e.variants.set(t,r),e.variants.size>8)){for(let[n,r]of e.variants)if(!(n===t||r===e.activeVariant)&&!e.activeGenerations.has(n)){e.variants.delete(n);break}}return n&&(e.activeVariant=r,e.docCache=r.docCache,e.parserCache=r.parserCache,e.cachedFileList=r.cachedFileList,e.localizedPathCache=r.localizedPathCache,e.cachedNativeDocs=r.cachedNativeDocs,e.frontmatterHashes=r.frontmatterHashes,e.directoryMeta=r.directoryMeta,e.cachedDirectoryMetaFiles=r.cachedDirectoryMetaFiles),r}function v(e,t){e.activeVariant===t&&(e.cachedFileList=t.cachedFileList,e.cachedNativeDocs=t.cachedNativeDocs,e.frontmatterHashes=t.frontmatterHashes,e.directoryMeta=t.directoryMeta,e.cachedDirectoryMetaFiles=t.cachedDirectoryMetaFiles)}function y(e,t){return c.createHash(`sha1`).update(JSON.stringify({basePath:t||e?.base||`/docs`,i18n:e?.i18n,versions:e?.versions,drafts:e?.drafts,featureFlags:e?.featureFlags,sidebarGroups:e?.theme?.sidebarGroups})).digest(`hex`)}function b(e,t){let n=f(e),r=g.get(n),i=t??r;(!i||r===i)&&g.delete(n),i&&(i.disposed=!0,i.generationEpoch++,i.activeGenerations.clear(),i.variants.clear(),i.activeVariant=null,i.cachedFileList=null,i.localizedPathCache.clear(),i.cachedNativeDocs=null,i.frontmatterHashes.clear(),i.directoryMeta=null,i.cachedDirectoryMetaFiles=null)}function x(e){let t=f(e),n=g.get(t);return n||(n=h(t),g.set(t,n)),n}const S=h(o.resolve(process.cwd(),`docs`)),C=S.docCache;function w(e){try{s.rmSync(e.discoverySnapshotPath,{force:!0})}catch{}}function T(e){let t=typeof e==`string`?x(e):e??S;for(let e of t.variants.values())e.cachedFileList=null,e.localizedPathCache.clear(),e.cachedNativeDocs=null,e.frontmatterHashes.clear(),e.directoryMeta=null,e.cachedDirectoryMetaFiles=null,e.discoverySnapshot=null,e.discoverySnapshotLoaded=!1,w(e),e.docCache.invalidateAll(),e.parserCache.clear();t.cachedFileList=null,t.localizedPathCache.clear(),t.cachedNativeDocs=null,t.frontmatterHashes.clear(),t.directoryMeta=null,t.cachedDirectoryMetaFiles=null,t.generationEpoch++}function E(e,t){let n=typeof t==`string`?x(t):t??S,r=o.resolve(e);for(let e of n.variants.values()){for(let t of e.directoryMetaEntries.keys())o.resolve(t)===r&&e.directoryMetaEntries.delete(t);e.directoryMeta=null,e.cachedDirectoryMetaFiles=null,e.discoverySnapshot=null,e.discoverySnapshotLoaded=!1,w(e)}n.directoryMeta=null,n.cachedDirectoryMetaFiles=null,n.generationEpoch++}function D(e,t){let n=typeof t==`string`?x(t):t??S;for(let t of n.variants.values())t.docCache.invalidate(e),t.parserCache.invalidate(e),t.cachedNativeDocs?.[e.replace(/\\/g,`/`)]&&delete t.cachedNativeDocs[e.replace(/\\/g,`/`)],t.frontmatterHashes.delete(e);n.cachedNativeDocs=n.activeVariant?.cachedNativeDocs??null,n.frontmatterHashes.delete(e),n.generationEpoch++}function O(e){return e.sort((e,t)=>{let n=e.group?e.groupPosition??999:e.sidebarPosition??999,r=t.group?t.groupPosition??999:t.sidebarPosition??999;return n===r?!e.group&&t.group?-1:e.group&&!t.group?1:e.group&&t.group&&e.group!==t.group?(e.groupTitle||e.group).localeCompare(t.groupTitle||t.group):k(e,t):n-r})}function k(e,t){if(e.sidebarPosition!==void 0&&t.sidebarPosition!==void 0){let n=e.sidebarPosition-t.sidebarPosition;if(n!==0)return n}else if(e.sidebarPosition!==void 0)return-1;else if(t.sidebarPosition!==void 0)return 1;let n=e.title.localeCompare(t.title);return n===0?e.path.localeCompare(t.path):n}var A=e({generateRoutes:()=>B,getExternalRoutePaths:()=>r,invalidateDirectoryMetaFile:()=>L,invalidateFile:()=>R,invalidateRouteCache:()=>z});const j=Symbol(`route-generation-invalidated`);async function M(e,t,n){let r=[...t].sort((e,t)=>{if(o.dirname(e)===o.dirname(t)){let n=o.basename(e),r=o.basename(t);if(n===`_meta.json`&&r===`meta.json`)return-1;if(n===`meta.json`&&r===`_meta.json`)return 1}return e.localeCompare(t)}),i=new Set(r),a=n.directoryMetaEntries;for(let e of a.keys())i.has(e)||a.delete(e);await Promise.all(r.map(async e=>{let t;try{t=await u.stat(e)}catch(t){a.delete(e),l(`Failed to stat meta.json: ${t instanceof Error?t.message:String(t)}`);return}let n=a.get(e);if(!(n&&n.mtimeMs===t.mtimeMs&&n.size===t.size))try{let n=await u.readFile(e,`utf8`);a.set(e,{mtimeMs:t.mtimeMs,size:t.size,content:JSON.parse(n)})}catch(t){a.delete(e),l(`Failed to read meta.json: ${t instanceof Error?t.message:String(t)}`)}}));let s={};for(let t of r){let n=a.get(t);if(!n)continue;let r=o.relative(e,o.dirname(t)).replace(/\\/g,`/`);s[r||`.`]=n.content}return s}async function N(e,n){if(!n.discoverySnapshotPath||t().noCache)return null;if(n.discoverySnapshotLoaded)return n.discoverySnapshot;n.discoverySnapshotLoaded=!0;try{let t=await u.readFile(n.discoverySnapshotPath,`utf8`),r=JSON.parse(t),i=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),a=r.files,s=r.directoryMetaFiles,c=r.directories&&typeof r.directories==`object`?Object.entries(r.directories):[],l=o.resolve(e),d=await u.realpath(l),f=e=>{let t=o.resolve(e);return t===l||t.startsWith(`${l}${o.sep}`)},p=e=>/\.(?:md|mdx)$/i.test(e),m=e=>{let t=o.basename(e);return t===`meta.json`||t===`_meta.json`};if(r.version!==1||!i(a)||!i(s)||!r.directories||typeof r.directories!=`object`||Array.isArray(r.directories)||a.some(e=>!f(e)||!p(e))||s.some(e=>!f(e)||!m(e))||c.some(([e,t])=>!f(e)||typeof t!=`number`||!Number.isFinite(t)))return null;let h=e=>{let t=o.resolve(e);return t===d||t.startsWith(`${d}${o.sep}`)},g=await Promise.all([...a,...s].map(async e=>{try{return(await u.lstat(e)).isFile()?h(await u.realpath(e)):!1}catch{return!1}})),_=await Promise.all(c.map(async([e,t])=>{try{let n=await u.stat(e);return n.isDirectory()&&n.mtimeMs===t&&h(await u.realpath(e))}catch{return!1}}));if(g.every(Boolean)&&_.every(Boolean)){let e={version:1,files:a,directoryMetaFiles:s,directories:Object.fromEntries(c)};return n.discoverySnapshot=e,e}}catch{}return null}async function P(e,n){if(t().noCache){e.discoverySnapshot=null,e.discoverySnapshotLoaded=!1;return}e.discoverySnapshot=n,e.discoverySnapshotLoaded=!0;try{await u.mkdir(o.dirname(e.discoverySnapshotPath),{recursive:!0}),await u.writeFile(e.discoverySnapshotPath,JSON.stringify(n))}catch{}}async function F(e,t,n){if(!n){let n=await N(e,t);if(n)return n}let r=await new d({excludeSymlinks:!0}).withFullPaths().filter(t=>{let n=o.basename(t),r=n===`meta.json`||n===`_meta.json`;return!(t.endsWith(`.md`)||t.endsWith(`.mdx`))&&!r?!1:!o.relative(e,t).replace(/\\/g,`/`).split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`&&e!==`_meta.json`)}).crawl(e).withPromise(),i=r.filter(e=>{let t=o.basename(e);return t===`meta.json`||t===`_meta.json`}).sort((e,t)=>e.localeCompare(t)),a=r.filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)),s=[/index\./i,/intro/i,/getting-started/i,/readme/i],c=a.map(e=>{let t=s.findIndex(t=>t.test(o.basename(e)));return{file:e,score:t===-1?2**53-1:t}});c.sort((e,t)=>e.score-t.score||e.file.localeCompare(t.file));let l=c.map(({file:e})=>e),f=[...l,...i],p=new Set([o.resolve(e)]);for(let t of f){let n=o.dirname(t);for(;n.startsWith(o.resolve(e))&&(p.add(n),n!==o.resolve(e));)n=o.dirname(n)}let m=await Promise.all([...p].sort().map(async e=>{try{return[e,(await u.stat(e)).mtimeMs]}catch{return null}})),h={version:1,files:l,directoryMetaFiles:i,directories:Object.fromEntries(m.filter(e=>e!==null))};return await P(t,h),h}async function I(e,t,n){let r=Array(e.length),i=0;async function a(){for(;i<e.length;){let t=i++;r[t]=await n(e[t])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},()=>a())),r}function L(e,t){E(e,t)}function R(e,t){let n=typeof t==`string`?x(t):t;if(n){let t=e.replace(/\\/g,`/`);(o.basename(t)===`meta.json`||o.basename(t)===`_meta.json`)&&E(e,n),n.cachedNativeDocs?.[t]&&delete n.cachedNativeDocs[t],D(e,n);return}D(e)}function z(e){if(e){T(e);return}T()}async function B(e,r,i,a=!1,s,c){let l=s??x(e);if(l.disposed)throw Error(`[boltdocs] Route cache context has been disposed.`);let u=y(r,i);if(c&&c.fingerprint!==u)throw Error(`[boltdocs] Route cache variant does not match the requested route configuration fingerprint.`);if(c&&l.variants.get(u)!==c)throw Error(`[boltdocs] Route cache variant does not belong to the requested route cache context.`);let d=l.activeGenerations.get(u);if(d)return d;let f=c??_(l,u),p=l.generationEpoch,m=(async()=>{let s=i||r?.base||`/docs`;await f.docCache.load();let c,u,d=await F(e,f,a||t().noCache);c=d.files.filter(t=>r?.experimental?.fileRouting?!o.relative(e,t).replace(/\\\\/g,`/`).split(`/`).includes(`pages-external`):!0),u=d.directoryMetaFiles,f.cachedFileList=c,f.cachedDirectoryMetaFiles=u,f.directoryMeta=await M(e,u,f),v(l,f),f.docCache.pruneStale(new Set(c));let m=process.env.NODE_ENV===`test`||process.env.VITEST===`true`,h,g=!0;for(let e of c)if(!f.docCache.get(e)){g=!1;break}if(g)h=c.map(e=>{let t=f.docCache.get(e);if(!t)throw Error(`[boltdocs] Route cache entry disappeared for ${e}`);return t});else{if(!m&&!f.cachedNativeDocs)try{let{runParser:t}=await import(`@bdocs/parser`);f.cachedNativeDocs=await t(e,!0)}catch{}if(!m&&f.cachedNativeDocs!==null&&f.cachedNativeDocs){let{parseDocFileWithNative:t}=await import(`./native-Di9Fnfrv.mjs`).then(e=>e.t),n=c.filter(e=>!f.cachedNativeDocs?.[e.replace(/\\/g,`/`)]);if(n.length>0)try{let{runParserFiles:t}=await import(`@bdocs/parser`),r=await t(e,n,!0);f.cachedNativeDocs={...f.cachedNativeDocs,...r}}catch{}let i=c.some(e=>!f.cachedNativeDocs?.[e.replace(/\\/g,`/`)])?(await import(`./parser-CGMY2lJ7.mjs`)).parseDocFile:void 0;h=await I(c,32,async n=>{let a=f.docCache.get(n);if(a)return a;let o=n.replace(/\\/g,`/`),c=f.cachedNativeDocs[o];if(c){let i=await t(n,c,e,s,r,f.parserCache);return f.docCache.set(n,i),i}else{if(!i)throw Error(`[boltdocs] Native parser did not return a document for ${n}`);let t=await i(n,e,s,r,f.parserCache);return f.docCache.set(n,t),t}})}else{let{parseDocFile:t}=await import(`./parser-CGMY2lJ7.mjs`);h=await I(c,32,async n=>{let i=f.docCache.get(n);if(i)return i;let a=await t(n,e,s,r,f.parserCache);return f.docCache.set(n,a),a})}}if(l.generationEpoch!==p)throw j;f.docCache.save();let _=[],y=new Map,b=process.env.NODE_ENV||`development`,x=r?.drafts?.visible||process.env.BOLTDOCS_DRAFTS===`true`||(r?.drafts?.environments?.includes(b)??!1);for(let e of h)if(!(e.route.draft&&!x)){if(e.route.featureFlags&&r?.featureFlags){if(!e.route.featureFlags.every(e=>{let t=r.featureFlags?.[e];return t===!0||t===b}))continue}else if(e.route.featureFlags&&!r?.featureFlags)continue;if(e.inferredCollection){let t=e.inferredCollection;y.has(t)||y.set(t,[]),y.get(t).push(e)}else _.push(e)}let S=new Map,C=[],w=r?.i18n?.defaultLocale||``;for(let e of _)if(e.isGroupIndex&&e.relativeDir&&C.push(e),e.relativeDir){let t=`${e.route.locale||w}:${e.relativeDir}`,r=S.get(t);r?r.position===void 0&&e.inferredGroupPosition!==void 0&&(r.position=e.inferredGroupPosition):(r={title:n(e.relativeDir),position:e.inferredGroupPosition},S.set(t,r))}for(let e of C){let t=`${e.route.locale||w}:${e.relativeDir}`,n=S.get(t);e.groupMeta&&(n.title=e.groupMeta.title,e.groupMeta.position!==void 0&&(n.position=e.groupMeta.position),e.groupMeta.icon&&(n.icon=e.groupMeta.icon))}if(r?.theme?.sidebarGroups){let e=r.i18n?Object.keys(r.i18n.locales):[w];for(let[t,i]of Object.entries(r.theme.sidebarGroups))for(let r of e){let e=`${r}:${t}`,a=S.get(e),o;typeof i.title==`string`?o=i.title:i.title&&(o=i.title[r]||i.title[w]),a?(o&&(a.title=o),i.icon&&(a.icon=i.icon)):S.set(e,{title:o||n(t),icon:i.icon})}}let T=Array(_.length);for(let e=0;e<_.length;e++){let t=_[e],r=t.relativeDir,i=t.route.locale||w,a=r?`${i}:${r}`:void 0,o=a?S.get(a):void 0,s;o&&(s=typeof o.title==`string`?o.title:o.title[i]||o.title[w]),T[e]={...t.route,group:r,groupTitle:s||(r?n(r):void 0),groupPosition:o?.position,groupIcon:o?.icon}}let E=[];for(let[,e]of y)for(let t of e)E.push({...t.route,collection:t.inferredCollection});E.sort((e,t)=>{let n=e=>{if(!e)return-1/0;let t=new Date(e).getTime();return Number.isFinite(t)?t:-1/0},r=n(e.date),i=n(t.date)-r;return i===0?e.path.localeCompare(t.path):i});let D=T;if(r?.i18n){let e=V(T,r,s,f.localizedPathCache);D=[...T,...e]}let k=[...O(D),...E];if(l.generationEpoch!==p)throw j;return k})();l.activeGenerations.set(u,m);try{return await m}catch(t){if(t!==j)throw t;if(l.disposed)throw Error(`[boltdocs] Route cache context was disposed during generation.`);f.docCache.invalidateAll(),f.parserCache.clear(),l.activeGenerations.get(u)===m&&l.activeGenerations.delete(u);let n=0;for(;n<10;)try{return await B(e,r,i,a,l)}catch(e){if(e!==j)throw e;if(l.disposed)throw Error(`[boltdocs] Route cache context was disposed during generation.`);n++}throw Error(`[boltdocs] Route generation was repeatedly invalidated by concurrent file changes.`)}finally{l.activeGenerations.get(u)===m&&l.activeGenerations.delete(u)}}function V(e,t,n,r){let i=t.i18n.defaultLocale,a=Object.keys(t.i18n.locales),o=[],s=new Map,c=[];for(let t of e){let e=t.locale||i;s.has(e)||s.set(e,new Set),s.get(e).add(t.path),e===i&&c.push(t)}for(let e of a){if(e===i)continue;let a=s.get(e)||new Set;for(let s of c){let c=H(s.path,i,e,n,t,r);c!==s.path&&(a.has(c)||o.push({...s,path:c,locale:e}))}}return o}function H(e,t,n,r,i,a){let o=`${e}:${n}`,s=a.get(o);if(s)return s;let c=r.startsWith(`/`)?r:`/`+r,l=c;if(i?.versions){let t=i.versions.prefix||``;for(let n of i.versions.versions){let r=`${c}/${t+n.path}`;if(e.startsWith(r)){l=r;break}let i=`${c}/${n.path}`;if(e.startsWith(i)){l=i;break}}}let u=e.substring(l.length),d=`/${t}`;if(u.startsWith(d+`/`))u=`/`+n+`/`+u.substring(d.length+1);else if(u===d)u=`/`+n;else if(u===`/`||u===``)u=`/`+n;else{let e=u.startsWith(`/`)?``:`/`;u=`/`+n+e+u}let f=l+u;return a.size>2e3&&a.clear(),a.set(o,f),f}export{b as a,_ as c,A as i,y as l,R as n,C as o,z as r,x as s,B as t,E as u};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
const e=require(`./pages-external-DPiPFxxP.cjs`),t=require(`./routes-U9L8psZ9.cjs`);exports.generateRoutes=t.t,exports.getExternalRoutePaths=e.n,exports.invalidateDirectoryMetaFile=t.n,exports.invalidateFile=t.r,exports.invalidateRouteCache=t.i;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
const e=require(`./chunk-D1Md3oWO.cjs`),t=require(`./utils-ej6_SjIZ.cjs`),n=require(`./node/cache.cjs`),r=require(`./cache-CJE9nWLE.cjs`);let i=require(`node:path`);i=e.r(i);let a=require(`node:fs`);a=e.r(a);let o=require(`node:crypto`);o=e.r(o);let s=require(`@bdocs/dui`),c=require(`node:fs/promises`);c=e.r(c);let l=require(`fdir`);function u(e){return i.default.resolve(e)}function d(e,t){return o.default.createHash(`sha1`).update(`${u(e)}:${t}`).digest(`hex`).slice(0,16)}function f(e,a,o){let s=d(e,o),c=t.o();return{fingerprint:o,docCache:new n.FileCache({name:`routes-${s}`,root:a}),parserCache:new r.t(a,s),cachedFileList:null,localizedPathCache:new Map,cachedNativeDocs:null,frontmatterHashes:new Map,directoryMeta:null,cachedDirectoryMetaFiles:null,directoryMetaEntries:new Map,discoverySnapshot:null,discoverySnapshotLoaded:!1,discoverySnapshotPath:i.default.resolve(a,c.dir,`route-discovery-${s}.json`)}}function p(e,t=i.default.dirname(i.default.resolve(e))){let n=u(e),r=i.default.resolve(t),a=f(n,r,`legacy`);return{docsDir:n,cacheRoot:r,docCache:a.docCache,parserCache:a.parserCache,cachedFileList:a.cachedFileList,localizedPathCache:a.localizedPathCache,cachedNativeDocs:a.cachedNativeDocs,frontmatterHashes:a.frontmatterHashes,directoryMeta:a.directoryMeta,cachedDirectoryMetaFiles:a.cachedDirectoryMetaFiles,variants:new Map([[`legacy`,a]]),activeVariant:a,activeGenerations:new Map,generationEpoch:0,disposed:!1}}const m=new Map;function h(e,t,n=!1){if(e.disposed)throw Error(`[boltdocs] Route cache context has been disposed.`);let r=e.variants.get(t);if(!r&&(r=f(e.docsDir,e.cacheRoot,t),e.variants.set(t,r),e.variants.size>8)){for(let[n,r]of e.variants)if(!(n===t||r===e.activeVariant)&&!e.activeGenerations.has(n)){e.variants.delete(n);break}}return n&&(e.activeVariant=r,e.docCache=r.docCache,e.parserCache=r.parserCache,e.cachedFileList=r.cachedFileList,e.localizedPathCache=r.localizedPathCache,e.cachedNativeDocs=r.cachedNativeDocs,e.frontmatterHashes=r.frontmatterHashes,e.directoryMeta=r.directoryMeta,e.cachedDirectoryMetaFiles=r.cachedDirectoryMetaFiles),r}function g(e,t){e.activeVariant===t&&(e.cachedFileList=t.cachedFileList,e.cachedNativeDocs=t.cachedNativeDocs,e.frontmatterHashes=t.frontmatterHashes,e.directoryMeta=t.directoryMeta,e.cachedDirectoryMetaFiles=t.cachedDirectoryMetaFiles)}function _(e,t){return o.default.createHash(`sha1`).update(JSON.stringify({basePath:t||e?.base||`/docs`,i18n:e?.i18n,versions:e?.versions,drafts:e?.drafts,featureFlags:e?.featureFlags,sidebarGroups:e?.theme?.sidebarGroups})).digest(`hex`)}function v(e,t){let n=u(e),r=m.get(n),i=t??r;(!i||r===i)&&m.delete(n),i&&(i.disposed=!0,i.generationEpoch++,i.activeGenerations.clear(),i.variants.clear(),i.activeVariant=null,i.cachedFileList=null,i.localizedPathCache.clear(),i.cachedNativeDocs=null,i.frontmatterHashes.clear(),i.directoryMeta=null,i.cachedDirectoryMetaFiles=null)}function y(e){let t=u(e),n=m.get(t);return n||(n=p(t),m.set(t,n)),n}const b=p(i.default.resolve(process.cwd(),`docs`)),x=b.docCache;function S(e){try{a.default.rmSync(e.discoverySnapshotPath,{force:!0})}catch{}}function C(e){let t=typeof e==`string`?y(e):e??b;for(let e of t.variants.values())e.cachedFileList=null,e.localizedPathCache.clear(),e.cachedNativeDocs=null,e.frontmatterHashes.clear(),e.directoryMeta=null,e.cachedDirectoryMetaFiles=null,e.discoverySnapshot=null,e.discoverySnapshotLoaded=!1,S(e),e.docCache.invalidateAll(),e.parserCache.clear();t.cachedFileList=null,t.localizedPathCache.clear(),t.cachedNativeDocs=null,t.frontmatterHashes.clear(),t.directoryMeta=null,t.cachedDirectoryMetaFiles=null,t.generationEpoch++}function w(e,t){let n=typeof t==`string`?y(t):t??b,r=i.default.resolve(e);for(let e of n.variants.values()){for(let t of e.directoryMetaEntries.keys())i.default.resolve(t)===r&&e.directoryMetaEntries.delete(t);e.directoryMeta=null,e.cachedDirectoryMetaFiles=null,e.discoverySnapshot=null,e.discoverySnapshotLoaded=!1,S(e)}n.directoryMeta=null,n.cachedDirectoryMetaFiles=null,n.generationEpoch++}function T(e,t){let n=typeof t==`string`?y(t):t??b;for(let t of n.variants.values())t.docCache.invalidate(e),t.parserCache.invalidate(e),t.cachedNativeDocs?.[e.replace(/\\/g,`/`)]&&delete t.cachedNativeDocs[e.replace(/\\/g,`/`)],t.frontmatterHashes.delete(e);n.cachedNativeDocs=n.activeVariant?.cachedNativeDocs??null,n.frontmatterHashes.delete(e),n.generationEpoch++}function E(e){return e.sort((e,t)=>{let n=e.group?e.groupPosition??999:e.sidebarPosition??999,r=t.group?t.groupPosition??999:t.sidebarPosition??999;return n===r?!e.group&&t.group?-1:e.group&&!t.group?1:e.group&&t.group&&e.group!==t.group?(e.groupTitle||e.group).localeCompare(t.groupTitle||t.group):D(e,t):n-r})}function D(e,t){if(e.sidebarPosition!==void 0&&t.sidebarPosition!==void 0){let n=e.sidebarPosition-t.sidebarPosition;if(n!==0)return n}else if(e.sidebarPosition!==void 0)return-1;else if(t.sidebarPosition!==void 0)return 1;let n=e.title.localeCompare(t.title);return n===0?e.path.localeCompare(t.path):n}const O=Symbol(`route-generation-invalidated`);async function k(e,t,n){let r=[...t].sort((e,t)=>{if(i.default.dirname(e)===i.default.dirname(t)){let n=i.default.basename(e),r=i.default.basename(t);if(n===`_meta.json`&&r===`meta.json`)return-1;if(n===`meta.json`&&r===`_meta.json`)return 1}return e.localeCompare(t)}),a=new Set(r),o=n.directoryMetaEntries;for(let e of o.keys())a.has(e)||o.delete(e);await Promise.all(r.map(async e=>{let t;try{t=await c.default.stat(e)}catch(t){o.delete(e),(0,s.warn)(`Failed to stat meta.json: ${t instanceof Error?t.message:String(t)}`);return}let n=o.get(e);if(!(n&&n.mtimeMs===t.mtimeMs&&n.size===t.size))try{let n=await c.default.readFile(e,`utf8`);o.set(e,{mtimeMs:t.mtimeMs,size:t.size,content:JSON.parse(n)})}catch(t){o.delete(e),(0,s.warn)(`Failed to read meta.json: ${t instanceof Error?t.message:String(t)}`)}}));let l={};for(let t of r){let n=o.get(t);if(!n)continue;let r=i.default.relative(e,i.default.dirname(t)).replace(/\\/g,`/`);l[r||`.`]=n.content}return l}async function A(e,n){if(!n.discoverySnapshotPath||t.o().noCache)return null;if(n.discoverySnapshotLoaded)return n.discoverySnapshot;n.discoverySnapshotLoaded=!0;try{let t=await c.default.readFile(n.discoverySnapshotPath,`utf8`),r=JSON.parse(t),a=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),o=r.files,s=r.directoryMetaFiles,l=r.directories&&typeof r.directories==`object`?Object.entries(r.directories):[],u=i.default.resolve(e),d=await c.default.realpath(u),f=e=>{let t=i.default.resolve(e);return t===u||t.startsWith(`${u}${i.default.sep}`)},p=e=>/\.(?:md|mdx)$/i.test(e),m=e=>{let t=i.default.basename(e);return t===`meta.json`||t===`_meta.json`};if(r.version!==1||!a(o)||!a(s)||!r.directories||typeof r.directories!=`object`||Array.isArray(r.directories)||o.some(e=>!f(e)||!p(e))||s.some(e=>!f(e)||!m(e))||l.some(([e,t])=>!f(e)||typeof t!=`number`||!Number.isFinite(t)))return null;let h=e=>{let t=i.default.resolve(e);return t===d||t.startsWith(`${d}${i.default.sep}`)},g=await Promise.all([...o,...s].map(async e=>{try{return(await c.default.lstat(e)).isFile()?h(await c.default.realpath(e)):!1}catch{return!1}})),_=await Promise.all(l.map(async([e,t])=>{try{let n=await c.default.stat(e);return n.isDirectory()&&n.mtimeMs===t&&h(await c.default.realpath(e))}catch{return!1}}));if(g.every(Boolean)&&_.every(Boolean)){let e={version:1,files:o,directoryMetaFiles:s,directories:Object.fromEntries(l)};return n.discoverySnapshot=e,e}}catch{}return null}async function j(e,n){if(t.o().noCache){e.discoverySnapshot=null,e.discoverySnapshotLoaded=!1;return}e.discoverySnapshot=n,e.discoverySnapshotLoaded=!0;try{await c.default.mkdir(i.default.dirname(e.discoverySnapshotPath),{recursive:!0}),await c.default.writeFile(e.discoverySnapshotPath,JSON.stringify(n))}catch{}}async function M(e,t,n){if(!n){let n=await A(e,t);if(n)return n}let r=await new l.fdir({excludeSymlinks:!0}).withFullPaths().filter(t=>{let n=i.default.basename(t),r=n===`meta.json`||n===`_meta.json`;return!(t.endsWith(`.md`)||t.endsWith(`.mdx`))&&!r?!1:!i.default.relative(e,t).replace(/\\/g,`/`).split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`&&e!==`_meta.json`)}).crawl(e).withPromise(),a=r.filter(e=>{let t=i.default.basename(e);return t===`meta.json`||t===`_meta.json`}).sort((e,t)=>e.localeCompare(t)),o=r.filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)),s=[/index\./i,/intro/i,/getting-started/i,/readme/i],u=o.map(e=>{let t=s.findIndex(t=>t.test(i.default.basename(e)));return{file:e,score:t===-1?2**53-1:t}});u.sort((e,t)=>e.score-t.score||e.file.localeCompare(t.file));let d=u.map(({file:e})=>e),f=[...d,...a],p=new Set([i.default.resolve(e)]);for(let t of f){let n=i.default.dirname(t);for(;n.startsWith(i.default.resolve(e))&&(p.add(n),n!==i.default.resolve(e));)n=i.default.dirname(n)}let m=await Promise.all([...p].sort().map(async e=>{try{return[e,(await c.default.stat(e)).mtimeMs]}catch{return null}})),h={version:1,files:d,directoryMetaFiles:a,directories:Object.fromEntries(m.filter(e=>e!==null))};return await j(t,h),h}async function N(e,t,n){let r=Array(e.length),i=0;async function a(){for(;i<e.length;){let t=i++;r[t]=await n(e[t])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},()=>a())),r}function P(e,t){w(e,t)}function F(e,t){let n=typeof t==`string`?y(t):t;if(n){let t=e.replace(/\\/g,`/`);(i.default.basename(t)===`meta.json`||i.default.basename(t)===`_meta.json`)&&w(e,n),n.cachedNativeDocs?.[t]&&delete n.cachedNativeDocs[t],T(e,n);return}T(e)}function I(e){if(e){C(e);return}C()}async function L(e,n,r,a=!1,o,s){let c=o??y(e);if(c.disposed)throw Error(`[boltdocs] Route cache context has been disposed.`);let l=_(n,r);if(s&&s.fingerprint!==l)throw Error(`[boltdocs] Route cache variant does not match the requested route configuration fingerprint.`);if(s&&c.variants.get(l)!==s)throw Error(`[boltdocs] Route cache variant does not belong to the requested route cache context.`);let u=c.activeGenerations.get(l);if(u)return u;let d=s??h(c,l),f=c.generationEpoch,p=(async()=>{let o=r||n?.base||`/docs`;await d.docCache.load();let s,l,u=await M(e,d,a||t.o().noCache);s=u.files.filter(t=>n?.experimental?.fileRouting?!i.default.relative(e,t).replace(/\\\\/g,`/`).split(`/`).includes(`pages-external`):!0),l=u.directoryMetaFiles,d.cachedFileList=s,d.cachedDirectoryMetaFiles=l,d.directoryMeta=await k(e,l,d),g(c,d),d.docCache.pruneStale(new Set(s));let p=process.env.NODE_ENV===`test`||process.env.VITEST===`true`,m,h=!0;for(let e of s)if(!d.docCache.get(e)){h=!1;break}if(h)m=s.map(e=>{let t=d.docCache.get(e);if(!t)throw Error(`[boltdocs] Route cache entry disappeared for ${e}`);return t});else{if(!p&&!d.cachedNativeDocs)try{let{runParser:t}=await import(`@bdocs/parser`);d.cachedNativeDocs=await t(e,!0)}catch{}if(!p&&d.cachedNativeDocs!==null&&d.cachedNativeDocs){let{parseDocFileWithNative:t}=await Promise.resolve().then(()=>require(`./native-Kre2T5eS.cjs`)),r=s.filter(e=>!d.cachedNativeDocs?.[e.replace(/\\/g,`/`)]);if(r.length>0)try{let{runParserFiles:t}=await import(`@bdocs/parser`),n=await t(e,r,!0);d.cachedNativeDocs={...d.cachedNativeDocs,...n}}catch{}let i=s.some(e=>!d.cachedNativeDocs?.[e.replace(/\\/g,`/`)])?(await Promise.resolve().then(()=>require(`./parser-BqTOsEUa.cjs`))).parseDocFile:void 0;m=await N(s,32,async r=>{let a=d.docCache.get(r);if(a)return a;let s=r.replace(/\\/g,`/`),c=d.cachedNativeDocs[s];if(c){let i=await t(r,c,e,o,n,d.parserCache);return d.docCache.set(r,i),i}else{if(!i)throw Error(`[boltdocs] Native parser did not return a document for ${r}`);let t=await i(r,e,o,n,d.parserCache);return d.docCache.set(r,t),t}})}else{let{parseDocFile:t}=await Promise.resolve().then(()=>require(`./parser-BqTOsEUa.cjs`));m=await N(s,32,async r=>{let i=d.docCache.get(r);if(i)return i;let a=await t(r,e,o,n,d.parserCache);return d.docCache.set(r,a),a})}}if(c.generationEpoch!==f)throw O;d.docCache.save();let _=[],v=new Map,y=process.env.NODE_ENV||`development`,b=n?.drafts?.visible||process.env.BOLTDOCS_DRAFTS===`true`||(n?.drafts?.environments?.includes(y)??!1);for(let e of m)if(!(e.route.draft&&!b)){if(e.route.featureFlags&&n?.featureFlags){if(!e.route.featureFlags.every(e=>{let t=n.featureFlags?.[e];return t===!0||t===y}))continue}else if(e.route.featureFlags&&!n?.featureFlags)continue;if(e.inferredCollection){let t=e.inferredCollection;v.has(t)||v.set(t,[]),v.get(t).push(e)}else _.push(e)}let x=new Map,S=[],C=n?.i18n?.defaultLocale||``;for(let e of _)if(e.isGroupIndex&&e.relativeDir&&S.push(e),e.relativeDir){let n=`${e.route.locale||C}:${e.relativeDir}`,r=x.get(n);r?r.position===void 0&&e.inferredGroupPosition!==void 0&&(r.position=e.inferredGroupPosition):(r={title:t.t(e.relativeDir),position:e.inferredGroupPosition},x.set(n,r))}for(let e of S){let t=`${e.route.locale||C}:${e.relativeDir}`,n=x.get(t);e.groupMeta&&(n.title=e.groupMeta.title,e.groupMeta.position!==void 0&&(n.position=e.groupMeta.position),e.groupMeta.icon&&(n.icon=e.groupMeta.icon))}if(n?.theme?.sidebarGroups){let e=n.i18n?Object.keys(n.i18n.locales):[C];for(let[r,i]of Object.entries(n.theme.sidebarGroups))for(let n of e){let e=`${n}:${r}`,a=x.get(e),o;typeof i.title==`string`?o=i.title:i.title&&(o=i.title[n]||i.title[C]),a?(o&&(a.title=o),i.icon&&(a.icon=i.icon)):x.set(e,{title:o||t.t(r),icon:i.icon})}}let w=Array(_.length);for(let e=0;e<_.length;e++){let n=_[e],r=n.relativeDir,i=n.route.locale||C,a=r?`${i}:${r}`:void 0,o=a?x.get(a):void 0,s;o&&(s=typeof o.title==`string`?o.title:o.title[i]||o.title[C]),w[e]={...n.route,group:r,groupTitle:s||(r?t.t(r):void 0),groupPosition:o?.position,groupIcon:o?.icon}}let T=[];for(let[,e]of v)for(let t of e)T.push({...t.route,collection:t.inferredCollection});T.sort((e,t)=>{let n=e=>{if(!e)return-1/0;let t=new Date(e).getTime();return Number.isFinite(t)?t:-1/0},r=n(e.date),i=n(t.date)-r;return i===0?e.path.localeCompare(t.path):i});let D=w;if(n?.i18n){let e=R(w,n,o,d.localizedPathCache);D=[...w,...e]}let A=[...E(D),...T];if(c.generationEpoch!==f)throw O;return A})();c.activeGenerations.set(l,p);try{return await p}catch(t){if(t!==O)throw t;if(c.disposed)throw Error(`[boltdocs] Route cache context was disposed during generation.`);d.docCache.invalidateAll(),d.parserCache.clear(),c.activeGenerations.get(l)===p&&c.activeGenerations.delete(l);let i=0;for(;i<10;)try{return await L(e,n,r,a,c)}catch(e){if(e!==O)throw e;if(c.disposed)throw Error(`[boltdocs] Route cache context was disposed during generation.`);i++}throw Error(`[boltdocs] Route generation was repeatedly invalidated by concurrent file changes.`)}finally{c.activeGenerations.get(l)===p&&c.activeGenerations.delete(l)}}function R(e,t,n,r){let i=t.i18n.defaultLocale,a=Object.keys(t.i18n.locales),o=[],s=new Map,c=[];for(let t of e){let e=t.locale||i;s.has(e)||s.set(e,new Set),s.get(e).add(t.path),e===i&&c.push(t)}for(let e of a){if(e===i)continue;let a=s.get(e)||new Set;for(let s of c){let c=z(s.path,i,e,n,t,r);c!==s.path&&(a.has(c)||o.push({...s,path:c,locale:e}))}}return o}function z(e,t,n,r,i,a){let o=`${e}:${n}`,s=a.get(o);if(s)return s;let c=r.startsWith(`/`)?r:`/`+r,l=c;if(i?.versions){let t=i.versions.prefix||``;for(let n of i.versions.versions){let r=`${c}/${t+n.path}`;if(e.startsWith(r)){l=r;break}let i=`${c}/${n.path}`;if(e.startsWith(i)){l=i;break}}}let u=e.substring(l.length),d=`/${t}`;if(u.startsWith(d+`/`))u=`/`+n+`/`+u.substring(d.length+1);else if(u===d)u=`/`+n;else if(u===`/`||u===``)u=`/`+n;else{let e=u.startsWith(`/`)?``:`/`;u=`/`+n+e+u}let f=l+u;return a.size>2e3&&a.clear(),a.set(o,f),f}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return w}});
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
const require_search_dialog = require('./search-dialog-
|
|
6
|
+
const require_search_dialog = require('./search-dialog-CIeIUhAn.cjs');
|
|
7
7
|
|
|
8
8
|
exports.SearchDialog = require_search_dialog.SearchDialog;
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
import { R as Search, V as X, W as useConfig, l as useRoutesContext, o as cn, q as useBoltdocsContext, u as normalizePath } from "./link-CgdI6O2o.js";
|
|
7
|
+
import { E as useLocation, O as useNavigate } from "./router-CZBxMRAH.js";
|
|
8
|
+
import { i as ErrorBoundary, n as Navbar, t as SearchDialog$1 } from "./search-dialog-BqkzDTq2.js";
|
|
9
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
10
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { Index } from "flexsearch";
|
|
12
|
+
import fetchSearchData from "virtual:boltdocs-search";
|
|
13
|
+
|
|
14
|
+
//#region src/client/hooks/use-routes.ts
|
|
15
|
+
/**
|
|
16
|
+
* Hook to access the framework's routing state.
|
|
17
|
+
* Returns both the complete set of routes and a filtered list based on the current
|
|
18
|
+
* version and locale.
|
|
19
|
+
*/
|
|
20
|
+
function useRoutes() {
|
|
21
|
+
const routeContext = useRoutesContext();
|
|
22
|
+
const allRoutes = routeContext.routes;
|
|
23
|
+
const routeIndex = routeContext.index || {
|
|
24
|
+
byPath: new Map(allRoutes.map((route) => [normalizePath(route.path), route])),
|
|
25
|
+
hintsByPath: /* @__PURE__ */ new Map(),
|
|
26
|
+
collectionNames: []
|
|
27
|
+
};
|
|
28
|
+
const config = useConfig();
|
|
29
|
+
const location = useLocation();
|
|
30
|
+
const { pathname } = location;
|
|
31
|
+
const { currentLocale: currentLocaleStore, currentVersion: currentVersionStore } = useBoltdocsContext();
|
|
32
|
+
const currentPath = normalizePath(pathname);
|
|
33
|
+
const currentRoute = routeIndex.byPath.get(currentPath);
|
|
34
|
+
const pathParts = pathname.split("/").filter(Boolean);
|
|
35
|
+
const urlLocale = config.i18n ? pathParts.find((part) => Array.isArray(config.i18n?.locales) ? config.i18n?.locales.includes(part) : part in (config.i18n?.locales || {})) : void 0;
|
|
36
|
+
const currentLocale = config.i18n ? urlLocale || currentLocaleStore || config.i18n.defaultLocale : void 0;
|
|
37
|
+
const configuredVersions = config.versions?.versions || [];
|
|
38
|
+
const currentVersion = config.versions ? configuredVersions.some((version) => version.path === currentVersionStore) ? currentVersionStore : config.versions.defaultVersion : void 0;
|
|
39
|
+
const routes = useMemo(() => {
|
|
40
|
+
if (!allRoutes) return [];
|
|
41
|
+
const alternateCounts = /* @__PURE__ */ new Map();
|
|
42
|
+
const defaultLocale = config.i18n?.defaultLocale || "";
|
|
43
|
+
const defaultVersion = config.versions?.defaultVersion || "";
|
|
44
|
+
for (const r of allRoutes) {
|
|
45
|
+
const locale = r.locale || defaultLocale;
|
|
46
|
+
const version = r.version || defaultVersion;
|
|
47
|
+
const key = `${r.filePath}::${locale}::${version}`;
|
|
48
|
+
alternateCounts.set(key, (alternateCounts.get(key) || 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
return allRoutes.filter((r) => {
|
|
51
|
+
const localeMatch = config.i18n ? (r.locale || config.i18n.defaultLocale) === currentLocale : true;
|
|
52
|
+
const versionMatch = config.versions ? (r.version || config.versions.defaultVersion) === currentVersion : true;
|
|
53
|
+
if (!(localeMatch && versionMatch)) return false;
|
|
54
|
+
const pathParts = pathname.split("/").filter(Boolean);
|
|
55
|
+
const isCurrentLocalePrefixed = !!(config.i18n && pathParts.includes(currentLocaleStore || config.i18n.defaultLocale));
|
|
56
|
+
const isCurrentVersionPrefixed = !!(config.versions && !!currentVersion && pathParts.includes(currentVersion));
|
|
57
|
+
const isRouteLocalePrefixed = !!r.locale;
|
|
58
|
+
const isRouteVersionPrefixed = !!r.version;
|
|
59
|
+
const locale = r.locale || defaultLocale;
|
|
60
|
+
const version = r.version || defaultVersion;
|
|
61
|
+
const key = `${r.filePath}::${locale}::${version}`;
|
|
62
|
+
if ((alternateCounts.get(key) || 0) > 1) {
|
|
63
|
+
const localeMismatch = config.i18n && isCurrentLocalePrefixed !== isRouteLocalePrefixed;
|
|
64
|
+
const versionMismatch = config.versions && isCurrentVersionPrefixed !== isRouteVersionPrefixed;
|
|
65
|
+
if (localeMismatch || versionMismatch) return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
});
|
|
69
|
+
}, [
|
|
70
|
+
allRoutes,
|
|
71
|
+
config,
|
|
72
|
+
pathname,
|
|
73
|
+
currentLocale,
|
|
74
|
+
currentVersion,
|
|
75
|
+
currentLocaleStore
|
|
76
|
+
]);
|
|
77
|
+
const collections = useMemo(() => new Set(routeIndex.collectionNames), [routeIndex.collectionNames]);
|
|
78
|
+
return {
|
|
79
|
+
routes,
|
|
80
|
+
allRoutes,
|
|
81
|
+
currentRoute,
|
|
82
|
+
isCollectionPage: !!currentRoute?.collection || location.pathname.split("/").filter(Boolean).some((segment) => collections.has(segment.toLowerCase())),
|
|
83
|
+
currentLocale,
|
|
84
|
+
currentVersion
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
//#endregion
|
|
89
|
+
//#region src/client/components/internal/error-boundary.tsx
|
|
90
|
+
function InternalFallback({ error, resetErrorBoundary, className }) {
|
|
91
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
92
|
+
className: cn("p-2 font-mono flex flex-col items-center justify-between min-h-[30vh]", className),
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsx("p", {
|
|
95
|
+
className: "text-lg font-semibold text-danger-500",
|
|
96
|
+
children: "Something went wrong"
|
|
97
|
+
}),
|
|
98
|
+
error?.message && /* @__PURE__ */ jsx("pre", {
|
|
99
|
+
className: "text-sm mt-2 max-w-md overflow-auto whitespace-pre-wrap break-word",
|
|
100
|
+
children: error.message
|
|
101
|
+
}),
|
|
102
|
+
/* @__PURE__ */ jsx("button", {
|
|
103
|
+
type: "button",
|
|
104
|
+
onClick: resetErrorBoundary,
|
|
105
|
+
className: "px-2 py-3 mt-2 bg-soft rounded border-subtle border font-mono font-semibold text-body hover:scale-105 transition-transform active:scale-95 cursor-pointer",
|
|
106
|
+
children: "Try again"
|
|
107
|
+
})
|
|
108
|
+
]
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function InternalErrorBoundary({ children, fallback }) {
|
|
112
|
+
return /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
113
|
+
fallback,
|
|
114
|
+
FallbackComponent: !fallback ? InternalFallback : void 0,
|
|
115
|
+
children
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//#endregion
|
|
120
|
+
//#region src/client/hooks/use-search.ts
|
|
121
|
+
function useSearch(routes) {
|
|
122
|
+
const { currentLocale, currentVersion } = useRoutes();
|
|
123
|
+
const config = useConfig();
|
|
124
|
+
const algoliaConfig = config.integrations?.search?.algolia;
|
|
125
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
126
|
+
const [query, setQuery] = useState("");
|
|
127
|
+
const [index, setIndex] = useState(null);
|
|
128
|
+
const [algoliaResults, setAlgoliaResults] = useState([]);
|
|
129
|
+
const [searchData, setSearchData] = useState([]);
|
|
130
|
+
const [searchDataLoading, setSearchDataLoading] = useState(false);
|
|
131
|
+
const [searchDataError, setSearchDataError] = useState(null);
|
|
132
|
+
const searchGeneration = useRef(0);
|
|
133
|
+
const loadingGeneration = useRef(null);
|
|
134
|
+
const navigate = useNavigate();
|
|
135
|
+
useEffect(() => {
|
|
136
|
+
if (algoliaConfig || !isOpen) return;
|
|
137
|
+
if (searchData.length > 0) return;
|
|
138
|
+
setSearchDataLoading(true);
|
|
139
|
+
setSearchDataError(null);
|
|
140
|
+
let active = true;
|
|
141
|
+
const generation = ++searchGeneration.current;
|
|
142
|
+
loadingGeneration.current = generation;
|
|
143
|
+
fetchSearchData().then((data) => {
|
|
144
|
+
if (!active || generation !== searchGeneration.current) return;
|
|
145
|
+
setSearchData(data || []);
|
|
146
|
+
if (loadingGeneration.current === generation) {
|
|
147
|
+
loadingGeneration.current = null;
|
|
148
|
+
setSearchDataLoading(false);
|
|
149
|
+
}
|
|
150
|
+
}).catch((err) => {
|
|
151
|
+
if (!active || generation !== searchGeneration.current) return;
|
|
152
|
+
console.error("[boltdocs] Failed to load search index:", err);
|
|
153
|
+
setSearchDataError(err);
|
|
154
|
+
if (loadingGeneration.current === generation) {
|
|
155
|
+
loadingGeneration.current = null;
|
|
156
|
+
setSearchDataLoading(false);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return () => {
|
|
160
|
+
active = false;
|
|
161
|
+
};
|
|
162
|
+
}, [
|
|
163
|
+
isOpen,
|
|
164
|
+
algoliaConfig,
|
|
165
|
+
searchData.length
|
|
166
|
+
]);
|
|
167
|
+
useEffect(() => {
|
|
168
|
+
if (!import.meta.hot) return;
|
|
169
|
+
const applyFrontmatterDelta = (payload) => {
|
|
170
|
+
const updated = payload.search?.updated ?? [];
|
|
171
|
+
const deleted = new Set(payload.search?.deleted ?? []);
|
|
172
|
+
searchGeneration.current += 1;
|
|
173
|
+
if (loadingGeneration.current !== null) {
|
|
174
|
+
loadingGeneration.current = null;
|
|
175
|
+
setSearchDataLoading(false);
|
|
176
|
+
}
|
|
177
|
+
setSearchData((prev) => {
|
|
178
|
+
const map = new Map(prev.map((d) => [d.id, d]));
|
|
179
|
+
for (const doc of updated) map.set(doc.id, doc);
|
|
180
|
+
for (const id of deleted) map.delete(id);
|
|
181
|
+
return Array.from(map.values());
|
|
182
|
+
});
|
|
183
|
+
setIndex(null);
|
|
184
|
+
};
|
|
185
|
+
const refreshFromAsset = async () => {
|
|
186
|
+
const generation = ++searchGeneration.current;
|
|
187
|
+
loadingGeneration.current = generation;
|
|
188
|
+
setSearchDataLoading(true);
|
|
189
|
+
try {
|
|
190
|
+
const data = await fetchSearchData({ bustCache: true });
|
|
191
|
+
if (generation !== searchGeneration.current) return;
|
|
192
|
+
setSearchData(data || []);
|
|
193
|
+
setSearchDataError(null);
|
|
194
|
+
setIndex(null);
|
|
195
|
+
} catch (error) {
|
|
196
|
+
if (generation !== searchGeneration.current) return;
|
|
197
|
+
console.error("[boltdocs] Failed to refresh search index:", error);
|
|
198
|
+
setSearchDataError(error instanceof Error ? error : new Error(String(error)));
|
|
199
|
+
} finally {
|
|
200
|
+
if (generation === searchGeneration.current) {
|
|
201
|
+
loadingGeneration.current = null;
|
|
202
|
+
setSearchDataLoading(false);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const hot = import.meta.hot;
|
|
207
|
+
hot.on("boltdocs:frontmatter-update", applyFrontmatterDelta);
|
|
208
|
+
hot.on("boltdocs:mdx-update", refreshFromAsset);
|
|
209
|
+
return () => {
|
|
210
|
+
hot.off?.("boltdocs:frontmatter-update", applyFrontmatterDelta);
|
|
211
|
+
hot.off?.("boltdocs:mdx-update", refreshFromAsset);
|
|
212
|
+
};
|
|
213
|
+
}, []);
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
const handleKeyDown = (e) => {
|
|
216
|
+
if ((/Mac/.test(navigator.userAgent) ? e.metaKey : e.ctrlKey) && (e.key === "k" || e.key === "j")) {
|
|
217
|
+
e.preventDefault();
|
|
218
|
+
setIsOpen((prev) => !prev);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
222
|
+
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
223
|
+
}, []);
|
|
224
|
+
const handleSelect = useCallback((key) => {
|
|
225
|
+
const path = String(key);
|
|
226
|
+
if (!path) return;
|
|
227
|
+
setIsOpen(false);
|
|
228
|
+
const url = new URL(path, window.location.origin);
|
|
229
|
+
if (query) url.searchParams.set("hl", query);
|
|
230
|
+
navigate(`${url.pathname}${url.search}${url.hash}`);
|
|
231
|
+
}, [navigate, query]);
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
if (algoliaConfig) return;
|
|
234
|
+
if (!isOpen || searchData.length === 0 || index) return;
|
|
235
|
+
const newIndex = new Index({
|
|
236
|
+
tokenize: "forward",
|
|
237
|
+
cache: true
|
|
238
|
+
});
|
|
239
|
+
for (let i = 0; i < searchData.length; i++) {
|
|
240
|
+
const doc = searchData[i];
|
|
241
|
+
if (!doc) continue;
|
|
242
|
+
newIndex.add(i, `${doc.title} ${doc.content}`);
|
|
243
|
+
}
|
|
244
|
+
setIndex(newIndex);
|
|
245
|
+
}, [
|
|
246
|
+
isOpen,
|
|
247
|
+
index,
|
|
248
|
+
algoliaConfig,
|
|
249
|
+
searchData
|
|
250
|
+
]);
|
|
251
|
+
useEffect(() => {
|
|
252
|
+
if (!algoliaConfig) return;
|
|
253
|
+
if (!query) {
|
|
254
|
+
setAlgoliaResults([]);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const delayDebounceFn = setTimeout(async () => {
|
|
258
|
+
try {
|
|
259
|
+
const url = `https://${algoliaConfig.appId}-dsn.algolia.net/1/indexes/${algoliaConfig.indexName}/query`;
|
|
260
|
+
const facetFilters = [];
|
|
261
|
+
if (currentLocale) facetFilters.push(`lang:${currentLocale}`);
|
|
262
|
+
if (currentVersion) facetFilters.push(`version:${currentVersion}`);
|
|
263
|
+
let params = `query=${encodeURIComponent(query)}&hitsPerPage=20`;
|
|
264
|
+
if (facetFilters.length > 0) params += `&facetFilters=${encodeURIComponent(JSON.stringify(facetFilters))}`;
|
|
265
|
+
const response = await fetch(url, {
|
|
266
|
+
method: "POST",
|
|
267
|
+
headers: {
|
|
268
|
+
"Content-Type": "application/json",
|
|
269
|
+
"X-Algolia-API-Key": algoliaConfig.apiKey,
|
|
270
|
+
"X-Algolia-Application-Id": algoliaConfig.appId
|
|
271
|
+
},
|
|
272
|
+
body: JSON.stringify({ params })
|
|
273
|
+
});
|
|
274
|
+
if (!response.ok) throw new Error(`Algolia search request failed: ${response.statusText}`);
|
|
275
|
+
setAlgoliaResults(((await response.json()).hits || []).map((hit) => {
|
|
276
|
+
let path = hit.url || "";
|
|
277
|
+
try {
|
|
278
|
+
if (path.startsWith("http://") || path.startsWith("https://")) {
|
|
279
|
+
const urlObj = new URL(path);
|
|
280
|
+
path = urlObj.pathname + urlObj.search + urlObj.hash;
|
|
281
|
+
}
|
|
282
|
+
} catch {}
|
|
283
|
+
const hierarchy = hit.hierarchy || {};
|
|
284
|
+
const levels = [
|
|
285
|
+
hierarchy.lvl0,
|
|
286
|
+
hierarchy.lvl1,
|
|
287
|
+
hierarchy.lvl2,
|
|
288
|
+
hierarchy.lvl3,
|
|
289
|
+
hierarchy.lvl4,
|
|
290
|
+
hierarchy.lvl5,
|
|
291
|
+
hierarchy.lvl6
|
|
292
|
+
].filter(Boolean);
|
|
293
|
+
const title = levels[levels.length - 1] || "Documentation";
|
|
294
|
+
const bio = levels.join(" > ");
|
|
295
|
+
return {
|
|
296
|
+
id: hit.objectID || path,
|
|
297
|
+
title,
|
|
298
|
+
path,
|
|
299
|
+
bio,
|
|
300
|
+
groupTitle: hierarchy.lvl0 || "Docs",
|
|
301
|
+
isHeading: !!hit.anchor || path.includes("#")
|
|
302
|
+
};
|
|
303
|
+
}));
|
|
304
|
+
} catch (err) {
|
|
305
|
+
console.error("Error fetching search results from Algolia:", err);
|
|
306
|
+
}
|
|
307
|
+
}, 250);
|
|
308
|
+
return () => clearTimeout(delayDebounceFn);
|
|
309
|
+
}, [
|
|
310
|
+
query,
|
|
311
|
+
algoliaConfig,
|
|
312
|
+
currentLocale,
|
|
313
|
+
currentVersion
|
|
314
|
+
]);
|
|
315
|
+
return {
|
|
316
|
+
isOpen,
|
|
317
|
+
setIsOpen,
|
|
318
|
+
query,
|
|
319
|
+
setQuery,
|
|
320
|
+
list: useMemo(() => {
|
|
321
|
+
if (!query) return routes.filter((r) => {
|
|
322
|
+
const routeLocale = r.locale || config.i18n?.defaultLocale;
|
|
323
|
+
const routeVersion = r.version || config.versions?.defaultVersion;
|
|
324
|
+
return (!currentLocale || routeLocale === currentLocale) && (!currentVersion || routeVersion === currentVersion);
|
|
325
|
+
}).slice(0, 10).map((r) => ({
|
|
326
|
+
id: r.path,
|
|
327
|
+
title: r.title,
|
|
328
|
+
path: r.path,
|
|
329
|
+
bio: r.description || "",
|
|
330
|
+
groupTitle: r.groupTitle
|
|
331
|
+
}));
|
|
332
|
+
if (algoliaConfig) return algoliaResults;
|
|
333
|
+
if (!index) return [];
|
|
334
|
+
const searchResults = index.search(query, {
|
|
335
|
+
limit: 20,
|
|
336
|
+
suggest: true
|
|
337
|
+
});
|
|
338
|
+
const results = [];
|
|
339
|
+
const seen = /* @__PURE__ */ new Set();
|
|
340
|
+
for (const id of searchResults) {
|
|
341
|
+
const doc = searchData[typeof id === "number" ? id : Number(id)];
|
|
342
|
+
if (!doc) continue;
|
|
343
|
+
const docLocale = doc.locale || config.i18n?.defaultLocale;
|
|
344
|
+
const docVersion = doc.version || config.versions?.defaultVersion;
|
|
345
|
+
const localeMatch = !currentLocale || docLocale === currentLocale || !doc.locale && currentLocale === config.i18n?.defaultLocale;
|
|
346
|
+
if (!(!currentVersion || docVersion === currentVersion)) continue;
|
|
347
|
+
if (seen.has(doc.url)) continue;
|
|
348
|
+
seen.add(doc.url);
|
|
349
|
+
results.push({
|
|
350
|
+
id: doc.url,
|
|
351
|
+
title: doc.title,
|
|
352
|
+
path: doc.url,
|
|
353
|
+
bio: doc.display,
|
|
354
|
+
groupTitle: doc.display.split(" > ")[0],
|
|
355
|
+
isHeading: doc.url.includes("#"),
|
|
356
|
+
localeMatch
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
return results.filter((result) => result.localeMatch).slice(0, 10);
|
|
360
|
+
}, [
|
|
361
|
+
query,
|
|
362
|
+
index,
|
|
363
|
+
currentLocale,
|
|
364
|
+
currentVersion,
|
|
365
|
+
routes,
|
|
366
|
+
searchData,
|
|
367
|
+
algoliaConfig,
|
|
368
|
+
algoliaResults,
|
|
369
|
+
config
|
|
370
|
+
]),
|
|
371
|
+
searchDataLoading,
|
|
372
|
+
searchDataError,
|
|
373
|
+
handleSelect,
|
|
374
|
+
input: {
|
|
375
|
+
value: query,
|
|
376
|
+
onChange: (e) => setQuery(e.target.value)
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
//#endregion
|
|
382
|
+
//#region src/client/components/ui-base/search-dialog.tsx
|
|
383
|
+
function Highlight({ text, query, markClassName }) {
|
|
384
|
+
if (!query || !text) return /* @__PURE__ */ jsx(Fragment$1, { children: text });
|
|
385
|
+
const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
386
|
+
const regex = new RegExp(`(${escapedQuery})`, "gi");
|
|
387
|
+
return /* @__PURE__ */ jsx(Fragment$1, { children: text.split(regex).map((part, i) => regex.test(part) ? /* @__PURE__ */ jsx("mark", {
|
|
388
|
+
className: cn("bg-primary-500/20 text-primary-600 dark:text-primary-400 font-bold px-0.5 rounded-sm", markClassName),
|
|
389
|
+
children: part
|
|
390
|
+
}, i) : part) });
|
|
391
|
+
}
|
|
392
|
+
function SearchDialog({ routes, className, markClassName }) {
|
|
393
|
+
const { isOpen, setIsOpen, query, setQuery, list, searchDataLoading, searchDataError, handleSelect } = useSearch(routes);
|
|
394
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
395
|
+
/* @__PURE__ */ jsxs(Navbar.SearchTrigger.Desktop, {
|
|
396
|
+
onPress: () => setIsOpen(true),
|
|
397
|
+
className: "rounded-xl border border-subtle bg-surface text-muted transition-all duration-200 hover:border-primary-500/50 hover:text-body hover:bg-soft/50 hover:shadow-sm active:scale-[0.98] focus-visible:ring-2 focus-visible:ring-primary-500/30",
|
|
398
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
399
|
+
className: "flex items-center gap-2",
|
|
400
|
+
children: [/* @__PURE__ */ jsx(Search, { size: 16 }), /* @__PURE__ */ jsx("span", {
|
|
401
|
+
className: "hidden sm:inline-block",
|
|
402
|
+
children: "Search docs..."
|
|
403
|
+
})]
|
|
404
|
+
}), /* @__PURE__ */ jsx(Navbar.SearchTrigger.Kbd, { className: "[&_kbd]:bg-main [&_kbd]:border [&_kbd]:border-subtle [&_kbd]:rounded [&_kbd]:px-1.5 [&_kbd]:h-5 [&_kbd]:w-5" })]
|
|
405
|
+
}),
|
|
406
|
+
/* @__PURE__ */ jsx(Navbar.SearchTrigger.Mobile, {
|
|
407
|
+
onPress: () => setIsOpen(true),
|
|
408
|
+
className: "rounded-xl text-muted transition-all duration-200 hover:text-body active:scale-95 focus-visible:ring-2 focus-visible:ring-primary-500/30",
|
|
409
|
+
children: /* @__PURE__ */ jsx(Search, { size: 20 })
|
|
410
|
+
}),
|
|
411
|
+
/* @__PURE__ */ jsx(InternalErrorBoundary, { children: /* @__PURE__ */ jsx(SearchDialog$1.Overlay, {
|
|
412
|
+
isOpen,
|
|
413
|
+
isDismissable: true,
|
|
414
|
+
onOpenChange: () => setIsOpen(false),
|
|
415
|
+
className: cn("fixed inset-0 z-100 flex items-center justify-center p-4 bg-black/40 backdrop-blur-xs animate-fade-in", className),
|
|
416
|
+
children: /* @__PURE__ */ jsx(SearchDialog$1.Content, {
|
|
417
|
+
className: "w-full max-w-lg bg-main border border-subtle shadow-md rounded-2xl overflow-hidden p-6",
|
|
418
|
+
children: /* @__PURE__ */ jsx(SearchDialog$1.Dialog, {
|
|
419
|
+
"aria-label": "Search documentation",
|
|
420
|
+
className: "flex flex-col min-h-0 h-[450px]",
|
|
421
|
+
children: /* @__PURE__ */ jsxs(SearchDialog$1.Autocomplete, {
|
|
422
|
+
className: "flex flex-col min-h-0",
|
|
423
|
+
children: [/* @__PURE__ */ jsxs(SearchDialog$1.Input, {
|
|
424
|
+
value: query,
|
|
425
|
+
onChange: setQuery,
|
|
426
|
+
className: "flex items-center gap-2 border border-subtle bg-surface px-4 py-2.5 rounded-xl focus-within:border-primary-500 mb-4",
|
|
427
|
+
children: [/* @__PURE__ */ jsx(SearchDialog$1.Input.SearchInput, {
|
|
428
|
+
placeholder: "Search documentation...",
|
|
429
|
+
className: "w-full bg-transparent outline-none text-body text-sm"
|
|
430
|
+
}), query && /* @__PURE__ */ jsx(SearchDialog$1.Input.Button, {
|
|
431
|
+
onPress: () => setQuery(""),
|
|
432
|
+
className: "text-muted hover:text-body hover:bg-surface rounded-md p-1 cursor-pointer select-none transition-colors",
|
|
433
|
+
children: /* @__PURE__ */ jsx(X, { size: 16 })
|
|
434
|
+
})]
|
|
435
|
+
}), searchDataLoading ? /* @__PURE__ */ jsx("div", {
|
|
436
|
+
className: "flex flex-1 items-center justify-center px-4 py-8 text-sm text-muted",
|
|
437
|
+
children: "Loading search index…"
|
|
438
|
+
}) : searchDataError ? /* @__PURE__ */ jsx("div", {
|
|
439
|
+
className: "flex flex-1 items-center justify-center px-4 py-8 text-center text-sm text-muted",
|
|
440
|
+
children: "Search is temporarily unavailable."
|
|
441
|
+
}) : query && list.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
442
|
+
className: "flex flex-1 items-center justify-center px-4 py-8 text-sm text-muted",
|
|
443
|
+
children: "No results found."
|
|
444
|
+
}) : /* @__PURE__ */ jsx(SearchDialog$1.List, {
|
|
445
|
+
items: list,
|
|
446
|
+
onAction: handleSelect,
|
|
447
|
+
children: (item) => /* @__PURE__ */ jsxs(SearchDialog$1.Item, {
|
|
448
|
+
textValue: item.title,
|
|
449
|
+
className: "flex items-center gap-3 px-4 py-2 rounded-xl group dark:hover:bg-primary-300/40 hover:bg-primary-200/50 transition-colors duration-100",
|
|
450
|
+
children: [/* @__PURE__ */ jsx(SearchDialog$1.Item.Icon, {
|
|
451
|
+
isHeading: item.isHeading,
|
|
452
|
+
className: "text-muted group-hover:text-primary-500 group-focus:text-primary-500"
|
|
453
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
454
|
+
className: "flex flex-col justify-center min-w-0",
|
|
455
|
+
children: [/* @__PURE__ */ jsx(SearchDialog$1.Item.Title, {
|
|
456
|
+
className: "text-sm font-medium text-body truncate dark:group-hover:text-primary-100",
|
|
457
|
+
children: /* @__PURE__ */ jsx(Highlight, {
|
|
458
|
+
text: item.title,
|
|
459
|
+
query,
|
|
460
|
+
markClassName
|
|
461
|
+
})
|
|
462
|
+
}), /* @__PURE__ */ jsx(SearchDialog$1.Item.Bio, {
|
|
463
|
+
className: "text-xs text-muted truncate",
|
|
464
|
+
children: /* @__PURE__ */ jsx(Highlight, {
|
|
465
|
+
text: item.bio,
|
|
466
|
+
query,
|
|
467
|
+
markClassName
|
|
468
|
+
})
|
|
469
|
+
})]
|
|
470
|
+
})]
|
|
471
|
+
}, item.id)
|
|
472
|
+
})]
|
|
473
|
+
})
|
|
474
|
+
})
|
|
475
|
+
})
|
|
476
|
+
}) })
|
|
477
|
+
] });
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
//#endregion
|
|
481
|
+
export { useRoutes as i, useSearch as n, InternalErrorBoundary as r, SearchDialog as t };
|