boltdocs 2.9.0 → 2.9.1
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/{cache-C2PiGyg8.cjs → cache-B19MLTpN.cjs} +1 -1
- package/dist/{cache-DFW4R3S0.mjs → cache-CfhOTR3Q.mjs} +1 -1
- package/dist/config-BqZUYono.cjs +7 -0
- package/dist/config-DBKBEj3j.mjs +7 -0
- package/dist/config-GPVEdeon.mjs +6 -0
- package/dist/config-kIQOJHXC.cjs +6 -0
- package/dist/csp-CBysWlAf.cjs +6 -0
- package/dist/csp-RJyh0nHV.mjs +6 -0
- package/dist/doctor-C19DsI1e.mjs +7 -0
- package/dist/{parser-DJoEF96Y.cjs → doctor-D8fl3Sbg.cjs} +1 -1
- package/dist/doctor-DzEgMMRo.cjs +7 -0
- package/dist/errors-C0Hx15Ag.mjs +6 -0
- package/dist/errors-Dx6JHoKE.cjs +6 -0
- package/dist/{doctor-wsPTzt8Y.mjs → handler-eNNcucnf.mjs} +1 -1
- package/dist/headers-BJ4jJAhU.cjs +6 -0
- package/dist/headers-HD_qTVVW.mjs +6 -0
- package/dist/{meta-loader-D0V6oOQt.cjs → meta-loader-C9MKjAs0.cjs} +1 -1
- package/dist/{meta-loader-By22EnYa.mjs → meta-loader-CxAoQthW.mjs} +1 -1
- package/dist/node/cli-entry.cjs +9 -3
- package/dist/node/cli-entry.mjs +9 -3
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.cts +7 -7
- package/dist/node/index.d.mts +8 -8
- package/dist/node/index.mjs +1 -1
- package/dist/node/routes/worker.cjs +1 -1
- package/dist/node/routes/worker.mjs +1 -1
- package/dist/node-B7qbjtLl.mjs +105 -0
- package/dist/node-Dj3-2YYP.cjs +105 -0
- package/dist/package-ByXh2JHp.cjs +6 -0
- package/dist/{package-BK_82QLX.mjs → package-DQBAV8uo.mjs} +1 -1
- package/dist/{doctor-Bknon8f5.cjs → parser-B8naUXl2.cjs} +1 -1
- package/dist/parser-D4oEyuP-.cjs +6 -0
- package/dist/parser-IR9tfyGE.mjs +6 -0
- package/dist/plugin-BkquLpOI.mjs +61 -0
- package/dist/plugin-CL1LsQXk.cjs +61 -0
- package/dist/routes-DR13Y1em.mjs +6 -0
- package/dist/routes-DX8ryKjs.cjs +6 -0
- package/dist/{routes-C6Kr2HFN.cjs → routes-DgTQxpZi.cjs} +1 -1
- package/dist/{routes-CKgGAy8P.mjs → routes-TUSK5wD7.mjs} +1 -1
- package/dist/{shiki-adapter-CUtj-xKv.cjs → shiki-adapter-BB71nVsG.cjs} +1 -1
- package/dist/{handler-B31cxNw0.mjs → shiki-adapter-CL-IQwKI.cjs} +1 -1
- package/dist/shiki-adapter-CxTLkjew.mjs +6 -0
- package/dist/{shiki-adapter-F-P-lDon.mjs → shiki-adapter-rQ087Lx3.mjs} +1 -1
- package/dist/types-generator-BRyf4o9F.mjs +26 -0
- package/dist/types-generator-BqNKCbrx.cjs +26 -0
- package/dist/types-generator-Cu2jQP-V.mjs +6 -0
- package/dist/utils-BWy_8ASj.cjs +7 -0
- package/dist/utils-DexBrwiP.mjs +7 -0
- package/dist/{worker-pool-DRv8ef4z.mjs → worker-pool-C6r6V05j.mjs} +1 -1
- package/package.json +1 -1
- package/dist/doctor-BY1tSmQd.mjs +0 -34
- package/dist/doctor-DcFLi4t1.cjs +0 -34
- package/dist/node-DV-EPtMU.mjs +0 -160
- package/dist/node-vOVNRABe.cjs +0 -160
- package/dist/package-OxKE0p6j.cjs +0 -6
- package/dist/parser-C2Pw18LY.cjs +0 -6
- package/dist/parser-DScG_PTs.mjs +0 -6
- package/dist/routes--LYHSHT7.cjs +0 -6
- package/dist/routes-BAsfsn_e.mjs +0 -6
- package/dist/shiki-adapter-EZptJAmW.mjs +0 -6
- package/dist/shiki-adapter-PQBl32AN.cjs +0 -6
- package/dist/utils-DC4Wq-S2.mjs +0 -7
- package/dist/utils-wHud9ny5.cjs +0 -7
- /package/dist/{generator-DILs0EFN.mjs → generator-B6lrnDZ-.mjs} +0 -0
- /package/dist/{generator-BEIF6MOx.cjs → generator-DtUU3Cfk.cjs} +0 -0
- /package/dist/{handler-Djy0HfsI.cjs → handler-1LRMYeI4.cjs} +0 -0
- /package/dist/{handler-DfhH9D1b.mjs → handler-CyIBbZdb.mjs} +0 -0
- /package/dist/{worker-pool-BS1LX67P.cjs → worker-pool-m81xuM5v.cjs} +0 -0
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
const e=require(`./chunk-Ds5LZdWN.cjs`),t=require(`./utils-
|
|
6
|
+
const e=require(`./chunk-Ds5LZdWN.cjs`),t=require(`./utils-BWy_8ASj.cjs`);let n=require(`node:path`);n=e.n(n);let r=require(`node:fs`);r=e.n(r);let i=require(`node:fs/promises`);i=e.n(i);let a=require(`node:crypto`);a=e.n(a);let o=require(`node:zlib`);o=e.n(o);let s=require(`node:util`),c=require(`lru-cache`);const l=i.default.writeFile,u=i.default.readFile,d=i.default.mkdir,f=i.default.rename,p=(0,s.promisify)(o.default.gzip),m=(0,s.promisify)(o.default.gunzip),h=new class{activeTasks=new Set;add(e){let t=Promise.resolve().then(e).catch(()=>{}).finally(()=>{this.activeTasks.delete(t)});this.activeTasks.add(t)}async flush(){await Promise.all(Array.from(this.activeTasks))}get pending(){return this.activeTasks.size}};var g=class{entries=new Map;cachePath=null;compress;constructor(e={}){let r=t.o();if(this.compress=e.compress===void 0?r.compress:e.compress,e.name){let t=e.root||process.cwd(),i=this.compress?`json.gz`:`json`;this.cachePath=n.default.resolve(t,r.dir,`${e.name}.${i}`)}}async load(){if(!t.o().noCache&&this.cachePath)try{let e=await u(this.cachePath);this.cachePath.endsWith(`.gz`)&&(e=await m(e));let t=JSON.parse(e.toString(`utf-8`));this.entries=new Map(Object.entries(t))}catch(e){if(e.code===`ENOENT`)return}}save(){if(t.o().noCache||!this.cachePath)return;let e=Object.fromEntries(this.entries),r=JSON.stringify(e),i=this.cachePath,o=this.compress;h.add(async()=>{try{await d(n.default.dirname(i),{recursive:!0});let e=Buffer.from(r);o&&(e=await p(e));let t=`${i}.${a.default.randomBytes(4).toString(`hex`)}.tmp`;await l(t,e),await f(t,i)}catch{}})}get(e){let n=this.entries.get(e);return!n||t.s(e)!==n.mtime?null:n.data}getStale(e){let t=this.entries.get(e);return t?t.data:null}set(e,n){this.entries.set(e,{data:n,mtime:t.s(e)})}isValid(e){let n=this.entries.get(e);return n?t.s(e)===n.mtime:!1}invalidate(e){this.entries.delete(e)}invalidateAll(){this.entries.clear()}pruneStale(e){for(let t of this.entries.keys())e.has(t)||this.entries.delete(t)}get size(){return this.entries.size}async flush(){await h.flush()}},_=class{index=new Map;memoryCache;baseDir;shardsDir;indexPath;saveTimeout=null;constructor(e,r=process.cwd()){let i=t.o();this.baseDir=n.default.resolve(r,i.dir,`transform-${e}`),this.shardsDir=n.default.resolve(this.baseDir,`shards`),this.indexPath=n.default.resolve(this.baseDir,`index.json`),this.memoryCache=new c.LRUCache({max:i.lruLimit,ttl:i.lruTTL,updateAgeOnGet:!0})}async load(){if(!t.o().noCache)try{let e=await u(this.indexPath,`utf-8`);this.index=new Map(Object.entries(JSON.parse(e)))}catch(e){if(e.code===`ENOENT`)return}}save(){if(t.o().noCache)return;let e=JSON.stringify(Object.fromEntries(this.index)),r=this.indexPath;h.add(async()=>{try{await d(n.default.dirname(r),{recursive:!0}),await l(r,e)}catch{}})}async getMany(e){let t=new Map,r=[];for(let n of e){let e=this.memoryCache.get(n);e?t.set(n,e):this.index.has(n)&&r.push(n)}if(r.length>0){let e=await Promise.all(r.map(async e=>{let t=this.index.get(e),r=n.default.resolve(this.shardsDir,`${t}.gz`);try{let t=(await m(await u(r))).toString(`utf-8`);return this.memoryCache.set(e,t),{key:e,val:t}}catch{return null}}));for(let n of e)n&&t.set(n.key,n.val)}return t}async getAsync(e){let t=this.memoryCache.get(e);if(t)return t;let r=this.index.get(e);if(!r)return null;let i=n.default.resolve(this.shardsDir,`${r}.gz`);try{let t=(await m(await u(i))).toString(`utf-8`);return this.memoryCache.set(e,t),t}catch(e){return e.code,null}}set(e,t){let r=a.default.createHash(`md5`).update(t).digest(`hex`);this.index.set(e,r),this.memoryCache.set(e,t);let o=n.default.resolve(this.shardsDir,`${r}.gz`);h.add(async()=>{try{try{await i.default.access(o);return}catch{}await d(this.shardsDir,{recursive:!0});let e=await p(Buffer.from(t)),n=`${o}.${a.default.randomBytes(4).toString(`hex`)}.tmp`;await l(n,e),await f(n,o)}catch{}}),this.saveTimeout&&clearTimeout(this.saveTimeout),this.saveTimeout=setTimeout(()=>{this.save()},500),typeof this.saveTimeout.unref==`function`&&this.saveTimeout.unref()}get size(){return this.index.size}async flush(){await h.flush()}},v=class{assetsDir;hashMap=new Map;constructor(e=process.cwd()){let r=t.o();this.assetsDir=n.default.resolve(e,r.dir,`assets`)}async getFileHash(e){let t=await i.default.stat(e),n=t.mtimeMs,r=this.hashMap.get(e);if(r&&r.mtime===n)return r.hash;let o=a.default.createHash(`md5`).update(`${t.size}-${n}`).digest(`hex`);return this.hashMap.set(e,{hash:o,mtime:n}),o}async get(e,t){try{let n=await this.getFileHash(e),r=this.getCachedPath(e,`${t}-${n}`);return await i.default.access(r),r}catch{return null}}set(e,t,n,r){let i=this.getCachedPath(e,`${t}-${r}`);h.add(async()=>{try{await d(this.assetsDir,{recursive:!0});let e=`${i}.${a.default.randomBytes(4).toString(`hex`)}.tmp`;await l(e,n),await f(e,i)}catch{}})}getCachedPath(e,t){let r=n.default.extname(e),i=n.default.basename(e,r),a=t.replace(/[^a-z0-9]/gi,`-`).toLowerCase();return n.default.join(this.assetsDir,`${i}.${a}${r}`)}clear(){r.default.existsSync(this.assetsDir)&&r.default.rmSync(this.assetsDir,{recursive:!0,force:!0})}async flush(){await h.flush()}};async function y(){await h.flush()}const b=new Map,x=()=>{let e=t.o();return n.default.resolve(process.cwd(),e.dir,`cache/parser`)},S=`v2.4`;var C=class{static async get(e){if(t.o().noCache)return null;try{let t=await r.default.promises.stat(e),i=b.get(e);if(i&&i.mtime===t.mtimeMs)return i.data;let o=x(),s=a.default.createHash(`md5`).update(e).digest(`hex`),c=n.default.join(o,`${s}.json`);try{let n=await r.default.promises.readFile(c,`utf-8`),i=JSON.parse(n);return i._mtime!==t.mtimeMs||i._v!==S?null:(b.set(e,{data:i.data,mtime:i._mtime}),i.data)}catch{return null}}catch{return null}}static async set(e,i){if(!t.o().noCache)try{let t=await r.default.promises.stat(e);b.set(e,{data:i,mtime:t.mtimeMs});let o=x(),s=a.default.createHash(`md5`).update(e).digest(`hex`),c=n.default.join(o,`${s}.json`),l={_v:S,_mtime:t.mtimeMs,data:i};h.add(async()=>{try{await r.default.promises.mkdir(o,{recursive:!0}),await r.default.promises.writeFile(c,JSON.stringify(l))}catch{}})}catch{}}static invalidate(e){b.delete(e)}static clear(){b.clear();let e=x();if(r.default.existsSync(e))try{r.default.rmSync(e,{recursive:!0,force:!0})}catch{}}};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return C}});
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
import{o as e,s as t}from"./utils-
|
|
6
|
+
import{o as e,s as t}from"./utils-DexBrwiP.mjs";import n from"node:path";import r from"node:fs";import i from"node:fs/promises";import a from"node:crypto";import o from"node:zlib";import{promisify as s}from"node:util";import{LRUCache as c}from"lru-cache";const l=i.writeFile,u=i.readFile,d=i.mkdir,f=i.rename,p=s(o.gzip),m=s(o.gunzip),h=new class{activeTasks=new Set;add(e){let t=Promise.resolve().then(e).catch(()=>{}).finally(()=>{this.activeTasks.delete(t)});this.activeTasks.add(t)}async flush(){await Promise.all(Array.from(this.activeTasks))}get pending(){return this.activeTasks.size}};var g=class{entries=new Map;cachePath=null;compress;constructor(t={}){let r=e();if(this.compress=t.compress===void 0?r.compress:t.compress,t.name){let e=t.root||process.cwd(),i=this.compress?`json.gz`:`json`;this.cachePath=n.resolve(e,r.dir,`${t.name}.${i}`)}}async load(){if(!e().noCache&&this.cachePath)try{let e=await u(this.cachePath);this.cachePath.endsWith(`.gz`)&&(e=await m(e));let t=JSON.parse(e.toString(`utf-8`));this.entries=new Map(Object.entries(t))}catch(e){if(e.code===`ENOENT`)return}}save(){if(e().noCache||!this.cachePath)return;let t=Object.fromEntries(this.entries),r=JSON.stringify(t),i=this.cachePath,o=this.compress;h.add(async()=>{try{await d(n.dirname(i),{recursive:!0});let e=Buffer.from(r);o&&(e=await p(e));let t=`${i}.${a.randomBytes(4).toString(`hex`)}.tmp`;await l(t,e),await f(t,i)}catch{}})}get(e){let n=this.entries.get(e);return!n||t(e)!==n.mtime?null:n.data}getStale(e){let t=this.entries.get(e);return t?t.data:null}set(e,n){this.entries.set(e,{data:n,mtime:t(e)})}isValid(e){let n=this.entries.get(e);return n?t(e)===n.mtime:!1}invalidate(e){this.entries.delete(e)}invalidateAll(){this.entries.clear()}pruneStale(e){for(let t of this.entries.keys())e.has(t)||this.entries.delete(t)}get size(){return this.entries.size}async flush(){await h.flush()}},_=class{index=new Map;memoryCache;baseDir;shardsDir;indexPath;saveTimeout=null;constructor(t,r=process.cwd()){let i=e();this.baseDir=n.resolve(r,i.dir,`transform-${t}`),this.shardsDir=n.resolve(this.baseDir,`shards`),this.indexPath=n.resolve(this.baseDir,`index.json`),this.memoryCache=new c({max:i.lruLimit,ttl:i.lruTTL,updateAgeOnGet:!0})}async load(){if(!e().noCache)try{let e=await u(this.indexPath,`utf-8`);this.index=new Map(Object.entries(JSON.parse(e)))}catch(e){if(e.code===`ENOENT`)return}}save(){if(e().noCache)return;let t=JSON.stringify(Object.fromEntries(this.index)),r=this.indexPath;h.add(async()=>{try{await d(n.dirname(r),{recursive:!0}),await l(r,t)}catch{}})}async getMany(e){let t=new Map,r=[];for(let n of e){let e=this.memoryCache.get(n);e?t.set(n,e):this.index.has(n)&&r.push(n)}if(r.length>0){let e=await Promise.all(r.map(async e=>{let t=this.index.get(e),r=n.resolve(this.shardsDir,`${t}.gz`);try{let t=(await m(await u(r))).toString(`utf-8`);return this.memoryCache.set(e,t),{key:e,val:t}}catch{return null}}));for(let n of e)n&&t.set(n.key,n.val)}return t}async getAsync(e){let t=this.memoryCache.get(e);if(t)return t;let r=this.index.get(e);if(!r)return null;let i=n.resolve(this.shardsDir,`${r}.gz`);try{let t=(await m(await u(i))).toString(`utf-8`);return this.memoryCache.set(e,t),t}catch(e){return e.code,null}}set(e,t){let r=a.createHash(`md5`).update(t).digest(`hex`);this.index.set(e,r),this.memoryCache.set(e,t);let o=n.resolve(this.shardsDir,`${r}.gz`);h.add(async()=>{try{try{await i.access(o);return}catch{}await d(this.shardsDir,{recursive:!0});let e=await p(Buffer.from(t)),n=`${o}.${a.randomBytes(4).toString(`hex`)}.tmp`;await l(n,e),await f(n,o)}catch{}}),this.saveTimeout&&clearTimeout(this.saveTimeout),this.saveTimeout=setTimeout(()=>{this.save()},500),typeof this.saveTimeout.unref==`function`&&this.saveTimeout.unref()}get size(){return this.index.size}async flush(){await h.flush()}},v=class{assetsDir;hashMap=new Map;constructor(t=process.cwd()){let r=e();this.assetsDir=n.resolve(t,r.dir,`assets`)}async getFileHash(e){let t=await i.stat(e),n=t.mtimeMs,r=this.hashMap.get(e);if(r&&r.mtime===n)return r.hash;let o=a.createHash(`md5`).update(`${t.size}-${n}`).digest(`hex`);return this.hashMap.set(e,{hash:o,mtime:n}),o}async get(e,t){try{let n=await this.getFileHash(e),r=this.getCachedPath(e,`${t}-${n}`);return await i.access(r),r}catch{return null}}set(e,t,n,r){let i=this.getCachedPath(e,`${t}-${r}`);h.add(async()=>{try{await d(this.assetsDir,{recursive:!0});let e=`${i}.${a.randomBytes(4).toString(`hex`)}.tmp`;await l(e,n),await f(e,i)}catch{}})}getCachedPath(e,t){let r=n.extname(e),i=n.basename(e,r),a=t.replace(/[^a-z0-9]/gi,`-`).toLowerCase();return n.join(this.assetsDir,`${i}.${a}${r}`)}clear(){r.existsSync(this.assetsDir)&&r.rmSync(this.assetsDir,{recursive:!0,force:!0})}async flush(){await h.flush()}};async function y(){await h.flush()}const b=new Map,x=()=>{let t=e();return n.resolve(process.cwd(),t.dir,`cache/parser`)},S=`v2.4`;var C=class{static async get(t){if(e().noCache)return null;try{let e=await r.promises.stat(t),i=b.get(t);if(i&&i.mtime===e.mtimeMs)return i.data;let o=x(),s=a.createHash(`md5`).update(t).digest(`hex`),c=n.join(o,`${s}.json`);try{let n=await r.promises.readFile(c,`utf-8`),i=JSON.parse(n);return i._mtime!==e.mtimeMs||i._v!==S?null:(b.set(t,{data:i.data,mtime:i._mtime}),i.data)}catch{return null}}catch{return null}}static async set(t,i){if(!e().noCache)try{let e=await r.promises.stat(t);b.set(t,{data:i,mtime:e.mtimeMs});let o=x(),s=a.createHash(`md5`).update(t).digest(`hex`),c=n.join(o,`${s}.json`),l={_v:S,_mtime:e.mtimeMs,data:i};h.add(async()=>{try{await r.promises.mkdir(o,{recursive:!0}),await r.promises.writeFile(c,JSON.stringify(l))}catch{}})}catch{}}static invalidate(e){b.delete(e)}static clear(){b.clear();let e=x();if(r.existsSync(e))try{r.rmSync(e,{recursive:!0,force:!0})}catch{}}};export{y as a,_ as i,v as n,g as r,C as t};
|
|
@@ -0,0 +1,7 @@
|
|
|
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-Ds5LZdWN.cjs`),t=require(`./errors-Dx6JHoKE.cjs`),n=require(`./types-generator-BqNKCbrx.cjs`);let r=require(`node:path`);r=e.n(r);let i=require(`node:fs`);i=e.n(i);let a=require(`zod`),o=require(`@bdocs/dui`),s=require(`vite`);function c(e){return e}const l=a.z.object({icon:a.z.string().max(50),link:a.z.string().url()});a.z.object({text:a.z.string().max(2e3).optional()});const u=a.z.object({name:a.z.string(),enforce:a.z.enum([`pre`,`post`]).optional(),version:a.z.string().optional(),boltdocsVersion:a.z.string().optional(),remarkPlugins:a.z.array(a.z.unknown()).optional(),rehypePlugins:a.z.array(a.z.unknown()).optional(),vitePlugins:a.z.array(a.z.unknown()).optional(),components:a.z.record(a.z.string(),a.z.string()).optional(),hooks:a.z.record(a.z.string(),a.z.unknown()).optional()}),d=a.z.object({title:a.z.union([a.z.string(),a.z.record(a.z.string(),a.z.string())]).optional(),description:a.z.union([a.z.string(),a.z.record(a.z.string(),a.z.string())]).optional(),logo:a.z.union([a.z.string(),a.z.object({dark:a.z.string(),light:a.z.string(),alt:a.z.string().optional(),width:a.z.number().optional(),height:a.z.number().optional()})]).optional(),navbar:a.z.array(a.z.object({label:a.z.union([a.z.string(),a.z.record(a.z.string(),a.z.string())]),href:a.z.string(),items:a.z.array(a.z.object({label:a.z.union([a.z.string(),a.z.record(a.z.string(),a.z.string())]),href:a.z.string()})).optional()})).optional(),sidebar:a.z.record(a.z.string(),a.z.array(a.z.object({text:a.z.string(),link:a.z.string()}))).optional(),sidebarGroups:a.z.record(a.z.string(),a.z.object({title:a.z.union([a.z.string(),a.z.record(a.z.string(),a.z.string())]).optional(),icon:a.z.string().optional()})).optional(),socialLinks:a.z.array(l).optional(),editLink:a.z.string().refine(e=>!e||e.includes(`:path`),{message:`editLink must contain ':path' placeholder if specified`}).optional(),communityHelp:a.z.string().url().optional(),version:a.z.string().max(50).optional(),githubRepo:a.z.string().max(100).optional(),favicon:a.z.string().optional(),tabs:a.z.array(a.z.object({id:a.z.string(),text:a.z.union([a.z.string(),a.z.record(a.z.string(),a.z.string())]),icon:a.z.string().optional()})).optional(),codeTheme:a.z.union([a.z.string(),a.z.object({light:a.z.string(),dark:a.z.string()})]).optional()}),f=a.z.union([a.z.string(),a.z.object({rules:a.z.array(a.z.object({userAgent:a.z.string(),allow:a.z.union([a.z.string(),a.z.array(a.z.string())]).optional(),disallow:a.z.union([a.z.string(),a.z.array(a.z.string())]).optional()})).optional(),sitemaps:a.z.array(a.z.string().url()).optional()})]),p=a.z.object({defaultLocale:a.z.string(),locales:a.z.union([a.z.record(a.z.string(),a.z.string()),a.z.array(a.z.string())]).transform(e=>Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e),localeConfigs:a.z.record(a.z.string(),a.z.object({label:a.z.string().optional(),direction:a.z.enum([`ltr`,`rtl`]).optional(),htmlLang:a.z.string().optional(),calendar:a.z.string().optional()})).optional()}),m=a.z.object({defaultVersion:a.z.string(),prefix:a.z.string().optional(),versions:a.z.array(a.z.object({label:a.z.string(),path:a.z.string()}))}),h=a.z.object({headers:a.z.record(a.z.string(),a.z.string()).optional(),enableCSP:a.z.boolean().optional(),customHeaders:a.z.record(a.z.string(),a.z.string()).optional()}),g=a.z.object({metatags:a.z.record(a.z.string(),a.z.string()).optional(),indexing:a.z.enum([`all`,`public`]).optional(),thumbnails:a.z.object({background:a.z.string().optional()}).optional()}),_=a.z.object({measurementId:a.z.string().min(1,`Measurement ID is required for GA4`),debug:a.z.boolean().optional(),anonymizeIp:a.z.boolean().optional(),sendPageView:a.z.boolean().optional(),cookieFlags:a.z.string().optional(),autoTrack:a.z.object({pageViews:a.z.boolean().optional(),downloads:a.z.boolean().optional(),externalLinks:a.z.boolean().optional(),search:a.z.boolean().optional()}).optional()}),v=a.z.object({tagId:a.z.string().min(1,`Tag ID is required for GTM`),dataLayerName:a.z.string().optional(),preview:a.z.string().optional()}),y=a.z.object({appId:a.z.string().min(1,`Algolia App ID is required`),apiKey:a.z.string().min(1,`Algolia API Key is required`),indexName:a.z.string().min(1,`Algolia Index Name is required`)}),b=a.z.object({repo:a.z.string().min(1,`Giscus repository is required`),repoId:a.z.string().min(1,`Giscus repository ID is required`),category:a.z.string().optional(),categoryId:a.z.string().optional(),mapping:a.z.enum([`pathname`,`url`,`title`,`og:title`,`specific`,`number`]).optional(),strict:a.z.union([a.z.enum([`0`,`1`]),a.z.boolean()]).optional(),reactionsEnabled:a.z.union([a.z.enum([`0`,`1`]),a.z.boolean()]).optional(),emitMetadata:a.z.union([a.z.enum([`0`,`1`]),a.z.boolean()]).optional(),inputPosition:a.z.enum([`top`,`bottom`]).optional(),theme:a.z.string().optional(),darkTheme:a.z.string().optional(),lang:a.z.string().optional(),loading:a.z.enum([`lazy`,`eager`]).optional()}),x=a.z.object({enabled:a.z.boolean(),owner:a.z.string().min(1,`GitHub owner is required`),repo:a.z.string().min(1,`GitHub repository name is required`),categorySlug:a.z.string().optional(),endpoint:a.z.string().optional()}),S=a.z.object({ga4:_.optional(),gtm:v.optional(),algolia:y.optional(),feedback:a.z.object({giscus:b.optional(),custom:x.optional()}).optional()}),C=a.z.object({siteUrl:a.z.string().url().optional(),docsDir:a.z.string().optional(),base:a.z.string().optional(),theme:d.optional(),i18n:p.optional(),versions:m.optional(),plugins:a.z.array(u).optional(),robots:f.optional(),security:h.optional(),seo:g.optional(),integrations:S.optional(),vite:a.z.record(a.z.string(),a.z.unknown()).optional()}),w=[`boltdocs.config.js`,`boltdocs.config.mjs`,`boltdocs.config.ts`];async function T(e,n=process.cwd()){let a=n,c={docsDir:r.default.resolve(e),theme:{title:`Boltdocs`,description:`A Vite documentation framework`,navbar:[{label:`Home`,href:`/`},{label:`Documentation`,href:`/docs`}],codeTheme:{light:`github-light`,dark:`github-dark`}}},l={};for(let e of w){let t=r.default.resolve(a,e);if(i.default.existsSync(t))try{let e=await(0,s.loadConfigFromFile)({command:`serve`,mode:`development`},t,a);if(e){l=e.config;break}}catch(t){(0,o.warn)(`Failed to load config from ${e}:`,t)}}let u={title:l.title,description:l.description,logo:l.logo,favicon:l.favicon,navbar:l.navbar,sidebar:l.sidebar,sidebarGroups:l.theme?.sidebarGroups,socialLinks:l.socialLinks,githubRepo:l.githubRepo,tabs:l.tabs,codeTheme:l.codeTheme,communityHelp:l.communityHelp,version:l.version,editLink:l.editLink,...l.theme||{}},d=Object.fromEntries(Object.entries(u).filter(([e,t])=>t!==void 0));d.navbar&&=d.navbar.map(e=>({label:e.label||e.text||``,href:e.href||e.link||e.to||``,items:e.items}));let f={docsDir:r.default.resolve(e),theme:{...c.theme,...d},i18n:l.i18n?{...l.i18n,locales:Array.isArray(l.i18n.locales)?Object.fromEntries(l.i18n.locales.map(e=>[e,e])):l.i18n.locales}:void 0,versions:l.versions,siteUrl:l.siteUrl,base:l.base,seo:l.seo,plugins:l.plugins||[],robots:l.robots,security:l.security,integrations:l.integrations,vite:l.vite},p=C.safeParse(f);if(!p.success)throw new t.r(`Invalid Boltdocs configuration:\n${p.error.issues.map(e=>` - ${e.path.join(`.`)}: ${e.message}`).join(`
|
|
7
|
+
`)}`);return p.data}async function E(e,t=process.cwd()){let r=await T(e,t);return n.t(r,e,t),r}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return w}});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
import{r as e}from"./errors-C0Hx15Ag.mjs";import{t}from"./types-generator-BRyf4o9F.mjs";import n from"node:path";import r from"node:fs";import{z as i}from"zod";import{warn as a}from"@bdocs/dui";import{loadConfigFromFile as o}from"vite";function s(e){return e}const c=i.object({icon:i.string().max(50),link:i.string().url()});i.object({text:i.string().max(2e3).optional()});const l=i.object({name:i.string(),enforce:i.enum([`pre`,`post`]).optional(),version:i.string().optional(),boltdocsVersion:i.string().optional(),remarkPlugins:i.array(i.unknown()).optional(),rehypePlugins:i.array(i.unknown()).optional(),vitePlugins:i.array(i.unknown()).optional(),components:i.record(i.string(),i.string()).optional(),hooks:i.record(i.string(),i.unknown()).optional()}),u=i.object({title:i.union([i.string(),i.record(i.string(),i.string())]).optional(),description:i.union([i.string(),i.record(i.string(),i.string())]).optional(),logo:i.union([i.string(),i.object({dark:i.string(),light:i.string(),alt:i.string().optional(),width:i.number().optional(),height:i.number().optional()})]).optional(),navbar:i.array(i.object({label:i.union([i.string(),i.record(i.string(),i.string())]),href:i.string(),items:i.array(i.object({label:i.union([i.string(),i.record(i.string(),i.string())]),href:i.string()})).optional()})).optional(),sidebar:i.record(i.string(),i.array(i.object({text:i.string(),link:i.string()}))).optional(),sidebarGroups:i.record(i.string(),i.object({title:i.union([i.string(),i.record(i.string(),i.string())]).optional(),icon:i.string().optional()})).optional(),socialLinks:i.array(c).optional(),editLink:i.string().refine(e=>!e||e.includes(`:path`),{message:`editLink must contain ':path' placeholder if specified`}).optional(),communityHelp:i.string().url().optional(),version:i.string().max(50).optional(),githubRepo:i.string().max(100).optional(),favicon:i.string().optional(),tabs:i.array(i.object({id:i.string(),text:i.union([i.string(),i.record(i.string(),i.string())]),icon:i.string().optional()})).optional(),codeTheme:i.union([i.string(),i.object({light:i.string(),dark:i.string()})]).optional()}),d=i.union([i.string(),i.object({rules:i.array(i.object({userAgent:i.string(),allow:i.union([i.string(),i.array(i.string())]).optional(),disallow:i.union([i.string(),i.array(i.string())]).optional()})).optional(),sitemaps:i.array(i.string().url()).optional()})]),f=i.object({defaultLocale:i.string(),locales:i.union([i.record(i.string(),i.string()),i.array(i.string())]).transform(e=>Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e),localeConfigs:i.record(i.string(),i.object({label:i.string().optional(),direction:i.enum([`ltr`,`rtl`]).optional(),htmlLang:i.string().optional(),calendar:i.string().optional()})).optional()}),p=i.object({defaultVersion:i.string(),prefix:i.string().optional(),versions:i.array(i.object({label:i.string(),path:i.string()}))}),m=i.object({headers:i.record(i.string(),i.string()).optional(),enableCSP:i.boolean().optional(),customHeaders:i.record(i.string(),i.string()).optional()}),h=i.object({metatags:i.record(i.string(),i.string()).optional(),indexing:i.enum([`all`,`public`]).optional(),thumbnails:i.object({background:i.string().optional()}).optional()}),g=i.object({measurementId:i.string().min(1,`Measurement ID is required for GA4`),debug:i.boolean().optional(),anonymizeIp:i.boolean().optional(),sendPageView:i.boolean().optional(),cookieFlags:i.string().optional(),autoTrack:i.object({pageViews:i.boolean().optional(),downloads:i.boolean().optional(),externalLinks:i.boolean().optional(),search:i.boolean().optional()}).optional()}),_=i.object({tagId:i.string().min(1,`Tag ID is required for GTM`),dataLayerName:i.string().optional(),preview:i.string().optional()}),v=i.object({appId:i.string().min(1,`Algolia App ID is required`),apiKey:i.string().min(1,`Algolia API Key is required`),indexName:i.string().min(1,`Algolia Index Name is required`)}),y=i.object({repo:i.string().min(1,`Giscus repository is required`),repoId:i.string().min(1,`Giscus repository ID is required`),category:i.string().optional(),categoryId:i.string().optional(),mapping:i.enum([`pathname`,`url`,`title`,`og:title`,`specific`,`number`]).optional(),strict:i.union([i.enum([`0`,`1`]),i.boolean()]).optional(),reactionsEnabled:i.union([i.enum([`0`,`1`]),i.boolean()]).optional(),emitMetadata:i.union([i.enum([`0`,`1`]),i.boolean()]).optional(),inputPosition:i.enum([`top`,`bottom`]).optional(),theme:i.string().optional(),darkTheme:i.string().optional(),lang:i.string().optional(),loading:i.enum([`lazy`,`eager`]).optional()}),b=i.object({enabled:i.boolean(),owner:i.string().min(1,`GitHub owner is required`),repo:i.string().min(1,`GitHub repository name is required`),categorySlug:i.string().optional(),endpoint:i.string().optional()}),x=i.object({ga4:g.optional(),gtm:_.optional(),algolia:v.optional(),feedback:i.object({giscus:y.optional(),custom:b.optional()}).optional()}),S=i.object({siteUrl:i.string().url().optional(),docsDir:i.string().optional(),base:i.string().optional(),theme:u.optional(),i18n:f.optional(),versions:p.optional(),plugins:i.array(l).optional(),robots:d.optional(),security:m.optional(),seo:h.optional(),integrations:x.optional(),vite:i.record(i.string(),i.unknown()).optional()}),C=[`boltdocs.config.js`,`boltdocs.config.mjs`,`boltdocs.config.ts`];async function w(t,i=process.cwd()){let s=i,c={docsDir:n.resolve(t),theme:{title:`Boltdocs`,description:`A Vite documentation framework`,navbar:[{label:`Home`,href:`/`},{label:`Documentation`,href:`/docs`}],codeTheme:{light:`github-light`,dark:`github-dark`}}},l={};for(let e of C){let t=n.resolve(s,e);if(r.existsSync(t))try{let e=await o({command:`serve`,mode:`development`},t,s);if(e){l=e.config;break}}catch(t){a(`Failed to load config from ${e}:`,t)}}let u={title:l.title,description:l.description,logo:l.logo,favicon:l.favicon,navbar:l.navbar,sidebar:l.sidebar,sidebarGroups:l.theme?.sidebarGroups,socialLinks:l.socialLinks,githubRepo:l.githubRepo,tabs:l.tabs,codeTheme:l.codeTheme,communityHelp:l.communityHelp,version:l.version,editLink:l.editLink,...l.theme||{}},d=Object.fromEntries(Object.entries(u).filter(([e,t])=>t!==void 0));d.navbar&&=d.navbar.map(e=>({label:e.label||e.text||``,href:e.href||e.link||e.to||``,items:e.items}));let f={docsDir:n.resolve(t),theme:{...c.theme,...d},i18n:l.i18n?{...l.i18n,locales:Array.isArray(l.i18n.locales)?Object.fromEntries(l.i18n.locales.map(e=>[e,e])):l.i18n.locales}:void 0,versions:l.versions,siteUrl:l.siteUrl,base:l.base,seo:l.seo,plugins:l.plugins||[],robots:l.robots,security:l.security,integrations:l.integrations,vite:l.vite},p=S.safeParse(f);if(!p.success)throw new e(`Invalid Boltdocs configuration:\n${p.error.issues.map(e=>` - ${e.path.join(`.`)}: ${e.message}`).join(`
|
|
7
|
+
`)}`);return p.data}async function T(e,n=process.cwd()){let r=await w(e,n);return t(r,e,n),r}export{s as a,l as i,w as n,T as r,C as t};
|
|
@@ -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{a as e,n as t,r as n,t as r}from"./config-DBKBEj3j.mjs";export{r as CONFIG_FILES,e as defineConfig,t as resolveConfig,n as resolveConfigAndGenerateTypes};
|
|
@@ -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(`./config-BqZUYono.cjs`);exports.CONFIG_FILES=e.t,exports.defineConfig=e.a,exports.resolveConfig=e.n,exports.resolveConfigAndGenerateTypes=e.r;
|
|
@@ -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
|
+
var e=require(`./chunk-Ds5LZdWN.cjs`).t({getCSPHeader:()=>t});function t(e){let t=process.env.NODE_ENV===`development`,n={"default-src":[`'self'`],"script-src":[`'self'`,`'unsafe-inline'`],"style-src":[`'self'`,`'unsafe-inline'`],"img-src":[`'self'`,`data:`,`https:`],"font-src":[`'self'`],"connect-src":[`'self'`]};return t&&(n[`script-src`]=[`'self'`,`'unsafe-eval'`,`'unsafe-inline'`],n[`style-src`]=[`'self'`,`'unsafe-inline'`]),Object.entries(n).map(([e,t])=>`${e} ${t.join(` `)}`).join(`; `)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
|
|
@@ -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{P as e}from"./node-B7qbjtLl.mjs";var t=e({getCSPHeader:()=>n});function n(e){let t=process.env.NODE_ENV===`development`,n={"default-src":[`'self'`],"script-src":[`'self'`,`'unsafe-inline'`],"style-src":[`'self'`,`'unsafe-inline'`],"img-src":[`'self'`,`data:`,`https:`],"font-src":[`'self'`],"connect-src":[`'self'`]};return t&&(n[`script-src`]=[`'self'`,`'unsafe-eval'`,`'unsafe-inline'`],n[`style-src`]=[`'self'`,`'unsafe-inline'`]),Object.entries(n).map(([e,t])=>`${e} ${t.join(` `)}`).join(`; `)}export{n,t};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
import{P as e}from"./node-B7qbjtLl.mjs";import{a as t,d as n,g as r,u as i}from"./utils-DexBrwiP.mjs";import{n as a}from"./config-DBKBEj3j.mjs";import{t as o}from"./node/cli-entry.mjs";import s from"node:path";import c from"node:fs";import{bullet as l,colors as u,confirm as d,dividerLog as f,double as p,error as m,info as h,round as g,single as _,success as v,tasks as y,warn as b}from"@bdocs/dui";import{fdir as x}from"fdir";import S from"picomatch";import{distance as C}from"fastest-levenshtein";const w={$schema:`https://boltdocs.vercel.app/schemas/doctor-config.schema.json`,checks:{metadata:{enabled:!0,titleMin:10,titleMax:60,descriptionMin:50,required:[`title`,`description`],optional:[],validateDates:!1},links:{internal:!0,external:!1,timeout:1e4,concurrency:10,ignore:[]},i18n:{enabled:!0},performance:{enabled:!0,budgets:{maxJSBundleSize:`200kb`,maxCSSBundleSize:`30kb`,maxPageHTMLSize:`80kb`,maxImagesKB:500,maxBuildTime:3e4,maxFontCount:3}}},fix:{confirmChanges:!1,backupFiles:!1,backupPath:`.boltdocs/backups`},reporting:{format:`pretty`,outputFile:`.boltdocs/reports/doctor.json`,failOnError:!1,maxWarnings:-1},severity:{missingTranslation:`warning`,brokenLink:`high`,brokenAnchor:`warning`,largeFile:`warning`,orphanedPage:`low`,duplicateTitle:`low`,shortMetadata:`low`,missingMetadata:`warning`,malformedFrontmatter:`high`,invalidFrontmatter:`high`,budgetExceeded:`warning`},exclude:[]};function T(e,t){if(e==null)return t;if(typeof e==`number`)return e;let n=e.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);if(!n)return t;let r=Number.parseFloat(n[1]),i=n[2]||`b`;return Math.round(r*({b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024}[i]||1))}function E(e,t,n){return e.doctorConfig.severity[t]||n}async function D(e,t){c.existsSync(t)||c.mkdirSync(t,{recursive:!0});let n=s.basename(e),r=new Date().toISOString().replace(/[:.]/g,`-`),i=s.join(t,`${n}.${r}.bak`);c.copyFileSync(e,i)}const O=new Map;function k(e){let t=O.get(e);if(t)return t;let r=(async()=>{let t=await n(e,!1);return{raw:t.raw,data:t.data,content:t.content}})();return O.set(e,r),r}const A=new Map;function j(e){if(A.has(e))return A.get(e);let t=!1;try{t=c.existsSync(e)&&c.statSync(e).isFile()}catch{t=!1}return A.set(e,t),t}async function M(e){let t=s.resolve(e,`doctor.json`);if(c.existsSync(t))try{let e=JSON.parse(c.readFileSync(t,`utf-8`));return{...w,...e,checks:{...w.checks,...e.checks,metadata:{...w.checks.metadata,...e.checks?.metadata},links:{...w.checks.links,...e.checks?.links},i18n:{...w.checks.i18n,...e.checks?.i18n},performance:{...w.checks.performance,...e.checks?.performance,budgets:{...w.checks.performance?.budgets,...e.checks?.performance?.budgets}}},fix:{...w.fix,...e.fix},reporting:{...w.reporting,...e.reporting},severity:{...w.severity,...e.severity},exclude:[...w.exclude,...e.exclude||[]]}}catch(e){b(`Failed to parse doctor.json: ${e}`)}return w}async function N(e,n=process.cwd(),r,i){let a=s.resolve(n,`.boltdocs`,`generated`);c.existsSync(a)||c.mkdirSync(a,{recursive:!0});let o=i;o||=await new x().withFullPaths().filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)).crawl(e).withPromise();let l=r?.base||`/docs`,u=[];for(let n=0;n<o.length;n+=100){let r=o.slice(n,n+100),i=await Promise.all(r.map(async n=>{let r=s.isAbsolute(n)?n:s.resolve(e,n),i=s.relative(e,r),{data:a}=await k(r),o;return o=a.permalink?a.permalink.startsWith(`/`)?a.permalink:`/${a.permalink}`:t(i),l===`/`?o:(l.endsWith(`/`)?l:l+`/`)+(o.startsWith(`/`)?o.substring(1):o)}));u.push(...i)}u.includes(l)||u.push(l);let d={routes:Array.from(new Set(u)).sort(),timestamp:Date.now()};return c.writeFileSync(s.resolve(a,`link-tree.json`),JSON.stringify(d,null,2)),d}function P(e,t){if(e===t)return 1;if(!e||!t)return 0;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=n[n.length-1]||``,a=r[r.length-1]||``;if(i===a){let e=0;for(let t of n)r.includes(t)&&e++;return e>=2?.99:.9}if(i.length>3&&a.length>3&&(a.startsWith(i)||i.startsWith(a))&&Math.min(i.length,a.length)/Math.max(i.length,a.length)>.5)return .88;let o=1-C(i,a)/Math.max(i.length,a.length);return o>.8?o*.95:1-C(e,t)/Math.max(e.length,t.length)}const F=new Map;function I(e,t){if(F.has(e))return F.get(e);let n=e.length,r=``,i=0;for(let a of t){if(a===e)continue;let t=a.length,o=Math.max(n,t);if(o===0)continue;let s=1-Math.abs(n-t)/o;if(s<=.8&&s<=i)continue;let c=P(e,a);c>i&&(i=c,r=a)}let a={bestMatch:r,similarity:i};return F.set(e,a),a}async function L(e){let t=[];if(!e.doctorConfig.checks.metadata.enabled)return t;let{titleMin:n,titleMax:a,descriptionMin:o}=e.doctorConfig.checks.metadata,c=new Map;for(let l of e.files){let u=i(s.relative(e.docsDir,l));try{let{raw:i,data:s}=await k(l);if(i.trim().startsWith(`---`)&&i.split(`---`).length>=3&&Object.keys(s).length===0){let n=E(e,`malformedFrontmatter`,`high`);n!==`off`&&t.push({file:u,level:n,message:`Malformed frontmatter (YAML parsing failed).`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}let d=r.safeParse(s);if(!d.success){let n=E(e,`invalidFrontmatter`,`high`);if(n!==`off`)for(let e of d.error.issues)t.push({file:u,level:n,message:`Invalid frontmatter field "${e.path.join(`.`)}": ${e.message}`,suggestion:`Ensure the field follows the correct type.`})}let f=Array.from(new Set([`title`,...e.doctorConfig.checks.metadata.required]));for(let n of f)if(s[n]===void 0){let r=E(e,`missingMetadata`,`warning`);r!==`off`&&t.push({file:u,level:r,message:`Missing required frontmatter field: "${n}".`,suggestion:`Add the "${n}" field to your frontmatter.`})}if(e.doctorConfig.checks.metadata.validateDates){let n=[`date`,`lastUpdated`,...e.doctorConfig.checks.metadata.optional.filter(e=>e.toLowerCase().includes(`date`))];for(let r of n)if(s[r]&&Number.isNaN(Date.parse(String(s[r])))){let n=E(e,`invalidFrontmatter`,`high`);n!==`off`&&t.push({file:u,level:n,message:`Invalid date format in field "${r}": "${s[r]}".`,suggestion:`Use a valid ISO date format (e.g., YYYY-MM-DD).`})}}if(s.title){let r=String(s.title);if(r.length<n){let i=E(e,`shortMetadata`,`low`);i!==`off`&&t.push({file:u,level:i,message:`Title is too short (${r.length} chars).`,suggestion:`Titles should be at least ${n} characters for better SEO.`})}else if(r.length>a){let n=E(e,`shortMetadata`,`low`);n!==`off`&&t.push({file:u,level:n,message:`Title is too long (${r.length} chars).`,suggestion:`Titles should be under ${a} characters.`})}let i=c.get(r)||[];i.push(u),c.set(r,i)}if(s.description&&String(s.description).length<o){let n=E(e,`shortMetadata`,`low`);n!==`off`&&t.push({file:u,level:n,message:`Description is very short.`,suggestion:`Descriptions should ideally be at least ${o} characters.`})}}catch(n){if(n instanceof Error){let r=E(e,`malformedFrontmatter`,`high`);r!==`off`&&t.push({file:u,level:r,message:`Malformed frontmatter (YAML error): ${n.message}`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}}}for(let[n,r]of c.entries())if(r.length>1){let i=E(e,`duplicateTitle`,`low`);if(i!==`off`)for(let e of r)t.push({file:e,level:i,message:`Duplicate title found: "${n}"`,suggestion:`Ensure each page has a unique title. Also used in: ${r.filter(t=>t!==e).join(`, `)}`})}return t}async function R(e){let t=[],{internal:n,external:r,ignore:a,timeout:o,concurrency:l}=e.doctorConfig.checks.links;if(!n&&!r&&!e.options.checkExternal)return t;let d=/(?:\[.*?\]\((.*?)\))|(?:href=["']([^"']+)["'])/g,f=new Set,p=5e5;for(let o of e.files){let l=i(s.relative(e.docsDir,o)),{content:u}=await k(o),m=[...(u.length>p?u.slice(0,p):u).replace(/```[\s\S]*?```/g,``).replace(/`[^`\n]*`/g,``).matchAll(d)];for(let i of m){let u=i[1]||i[2],d=!!i[1];if(!u||a.some(e=>u.includes(e)))continue;if(/^https?:\/\//i.test(u)){(r||e.options.checkExternal)&&f.add({url:u,file:o});continue}if(!n||/^(mailto|tel|#)/i.test(u))continue;let p;try{p=decodeURIComponent(u.split(`#`)[0].split(`?`)[0])}catch{p=u.split(`#`)[0].split(`?`)[0]}if(!p)continue;let m=!1,h=``;if(p.startsWith(`/`))if(e.routeIndex.has(p)||e.routeIndexWithSlash.has(p)||e.routeIndexWithoutSlash.has(p))m=!0;else{let t=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);if(e.routeIndex.has(t)||e.routeIndexWithSlash.has(t))m=!1,h=t;else{let t=e.config.base!==`/`&&p.startsWith(e.config.base||`/`)?p.substring((e.config.base||`/`).length):p,n=t.startsWith(`/`)?t.substring(1):t;h=s.join(e.docsDir,n),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>j(h+e))}}else h=s.resolve(s.dirname(o),p),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>j(h+e));if(!m){let{bestMatch:n,similarity:r}=I(p,e.linkTree.routes),i=!1,a=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);(e.routeIndex.has(a)||e.routeIndexWithSlash.has(a))&&(n=a,r=1,i=!0);let s=r>.6||i,f=r>.75&&n!==p||i,m=E(e,`brokenLink`,`high`);m!==`off`&&t.push({file:l,level:m,message:`Broken internal link: "${u}"`,suggestion:s?`Did you mean "${n}"?`:`Ensure the target exists or check for typos.`,fix:f?async()=>{let e=u.includes(`#`)?`#`+u.split(`#`)[1]:``,t=d?`(${u})`:`href="${u}"`,r=d?`(${n}${e})`:`href="${n}${e}"`,i=c.readFileSync(o,`utf-8`).replace(t,r);c.writeFileSync(o,i),O.delete(o)}:void 0})}}}if(f.size>0){h(u.gray(`Verifying ${f.size} external links...`));let n=new Map;for(let e of f)n.has(e.url)||n.set(e.url,[]),n.get(e.url).push(e.file);let r=async e=>{try{let t=new AbortController,n=setTimeout(()=>t.abort(),o),r=await fetch(e,{method:`HEAD`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}});return clearTimeout(n),!r.ok&&r.status!==404?{url:e,ok:(await fetch(e,{method:`GET`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}})).ok}:{url:e,ok:r.ok}}catch(t){return{url:e,ok:!1,error:t.message}}},a=Array.from(n.keys()),c=[];for(let e=0;e<a.length;e+=l){let t=a.slice(e,e+l),n=await Promise.allSettled(t.map(r));c.push(...n.map(e=>e.status===`fulfilled`?e.value:{url:`unknown`,ok:!1,error:e.reason}))}for(let r of c)if(!r.ok){let a=E(e,`brokenLink`,`warning`);if(a!==`off`){let o=n.get(r.url)||[];for(let n of o)t.push({file:i(s.relative(e.docsDir,n)),level:a,message:`Broken external link: "${r.url}"`,suggestion:`Verify the URL or update it if it's permanently down. Error: ${r.error||`Status >= 400`}`})}}}return t}async function z(e){let t=[];if(!e.doctorConfig.checks.i18n.enabled||!e.config.i18n)return t;let{defaultLocale:n,locales:r}=e.config.i18n,a=Object.keys(r),o=a.filter(e=>e!==n);for(let r of e.files){let l=i(s.relative(e.docsDir,r)),u=l.split(`/`),d=u[0];if(d===n){let n=u.slice(1).join(`/`);for(let i of o){let a=s.join(e.docsDir,i,n);if(!j(a)){let o=E(e,`missingTranslation`,`warning`);o!==`off`&&t.push({file:l,level:o,message:`Missing translation for locale "${i}"`,suggestion:`Create a version at "${i}/${n}".`,fix:async()=>{let e=s.dirname(a);c.existsSync(e)||c.mkdirSync(e,{recursive:!0}),c.copyFileSync(r,a)}})}}}else if(a.includes(d)){let i=u.slice(1).join(`/`);if(!j(s.join(e.docsDir,n,i))){let a=E(e,`missingTranslation`,`low`);a!==`off`&&t.push({file:l,level:a,message:`Orphaned translation (source missing in "${n}")`,suggestion:`Remove this file or create the source at "${n}/${i}".`,fix:async()=>{c.unlinkSync(r)}})}}}return t}async function B(e){let t=[];if(!e.config.theme.sidebar)return t;let n=new Set,r=e.config.theme.sidebar;for(let[i,a]of Object.entries(r))for(let r of a){if(!r.text){let n=E(e,`invalidFrontmatter`,`warning`);n!==`off`&&t.push({file:`boltdocs.config.ts`,level:n,message:`Sidebar item in group "${i}" is missing a label.`,suggestion:`Add a "text" property to the sidebar item.`})}if(r.link&&(n.add(r.link),!e.routeIndex.has(r.link))){let{bestMatch:n,similarity:i}=I(r.link,e.linkTree.routes),a=i>.6,o=E(e,`brokenLink`,`high`);o!==`off`&&t.push({file:`boltdocs.config.ts`,level:o,message:`Broken sidebar link: "${r.link}"`,suggestion:a?`Did you mean "${n}"?`:`Ensure the route exists and is correctly formatted.`})}}for(let r of e.linkTree.routes)if(!(r===`/`||r===``)&&!n.has(r)){let n=E(e,`orphanedPage`,`low`);n!==`off`&&t.push({file:`Sidebar`,level:n,message:`Orphaned page found: "${r}" is not linked in the sidebar.`,suggestion:`Consider adding it to the sidebar for better discoverability.`})}return t}async function V(e){let t=[],n=e.doctorConfig.checks.performance;if(!n?.enabled)return t;let r=s.resolve(e.root,`.boltdocs`,`reports`,`performance.json`);if(!c.existsSync(r))return t.push({file:`(build)`,level:E(e,`budgetExceeded`,`warning`),message:"Performance metrics not found. Run `boltdocs build` first."}),t;let i;try{i=JSON.parse(c.readFileSync(r,`utf-8`))}catch{return t.push({file:`(build)`,level:E(e,`budgetExceeded`,`warning`),message:`Failed to parse performance metrics file.`}),t}let a=n.budgets,o=E(e,`budgetExceeded`,`warning`),l=T(a?.maxJSBundleSize,1/0),u=T(a?.maxCSSBundleSize,1/0),d=T(a?.maxPageHTMLSize,1/0),f=a?.maxImagesKB??1/0,p=a?.maxBuildTime??1/0,m=a?.maxFontCount??1/0;if(l!==1/0&&i.totalJSBundleSize>l){let e=(i.totalJSBundleSize/1024).toFixed(0),n=(l/1024).toFixed(0);t.push({file:`(build)`,level:o,message:`JS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Code-split large dependencies or lazy-load route components.`})}if(u!==1/0&&i.totalCSSBundleSize>u){let e=(i.totalCSSBundleSize/1024).toFixed(0),n=(u/1024).toFixed(0);t.push({file:`(build)`,level:o,message:`CSS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Remove unused styles or split CSS by route.`})}if(d!==1/0){for(let e of i.pages)if(e.htmlSize>d){let n=(e.htmlSize/1024).toFixed(0),r=(d/1024).toFixed(0);t.push({file:e.route,level:o,message:`Page HTML size exceeds budget: ${n}kb > ${r}kb`,suggestion:`Reduce the amount of inline content or split into sub-pages.`})}}let h=f*1024;if(f!==1/0&&i.totalImagesSize>h){let e=(i.totalImagesSize/1024).toFixed(0);t.push({file:`(build)`,level:o,message:`Image assets exceed budget: ${e}kb > ${f}kb`,suggestion:`Optimize images with lossy compression or use next-gen formats (webp/avif).`})}if(p!==1/0&&i.buildTime>p){let e=(i.buildTime/1e3).toFixed(1),n=(p/1e3).toFixed(1);t.push({file:`(build)`,level:o,message:`Build time exceeds budget: ${e}s > ${n}s`,suggestion:"Check for large unoptimized assets or increase `concurrency` in SSG options."})}return m!==1/0&&i.fontCount>m&&t.push({file:`(build)`,level:o,message:`Font files exceed budget: ${i.fontCount} > ${m}`,suggestion:`Reduce the number of font families or use variable fonts.`}),t}var H=e({DEFAULT_DOCTOR_CONFIG:()=>w,checkI18n:()=>z,checkLinks:()=>R,checkMetadata:()=>L,checkPerformance:()=>V,checkSidebar:()=>B,doctorAction:()=>W,doctorInit:()=>U,generateLinkTree:()=>N,loadDoctorConfig:()=>M});async function U(e){let t=s.resolve(e,`doctor.json`);if(c.existsSync(t)){b(`"doctor.json" already exists at ${e}.`);return}try{c.writeFileSync(t,JSON.stringify(w,null,2)),v(`Created "doctor.json" with default configuration.`)}catch(e){m(`Failed to create "doctor.json": ${e}`)}}async function W(e=process.cwd(),t={}){if(t.init){await U(e);return}o();try{let n=await M(e),{format:r}=n.reporting,i=performance.now(),o=await a(`docs`,e),b=s.resolve(e,`docs`);c.existsSync(b)||(r===`pretty`&&m(`Docs dir not found at ${b}`),process.exit(1)),r===`pretty`&&console.log(p([` ${u.dim(`Docs dir:`)} ${b}`,` ${u.dim(`Reports:`)} ${e}/.boltdocs/reports/`],{title:`✦ DOCTOR — Documentation Health Check`})),r===`pretty`&&h(u.dim(`🔍 Discovering files and routes...`));let C=S(n.exclude||[]),w=await new x().withFullPaths().filter(e=>{if(!(e.endsWith(`.md`)||e.endsWith(`.mdx`)))return!1;let t=s.relative(b,e).replace(/\\/g,`/`),n=t.split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`);return!C(t)&&!n}).crawl(b).withPromise();for(let e of w)A.set(e,!0);let T=await N(b,e,o,w),E=o.base||`/`,O=E===`/`?``:E.endsWith(`/`)?E.slice(0,-1):E,k={root:e,docsDir:b,config:o,doctorConfig:n,linkTree:T,files:w,options:t,routeIndex:new Set(T.routes),routeIndexWithSlash:new Set(T.routes.map(e=>e.endsWith(`/`)?e:e+`/`)),routeIndexWithoutSlash:new Set(T.routes.map(e=>e.endsWith(`/`)?e.slice(0,-1):e)),basePrefix:O};r===`pretty`&&h(u.dim(`🧪 Running diagnostic checks in parallel...`));let j=[L(k),R(k),z(k),B(k)];t.budget&&j.push(V(k));let[P,F,I,H,...U]=await Promise.all(j),W=t.budget?U[0]:[],G=[...P,...F,...I,...H,...W];if(r===`pretty`){let e=[{label:`Metadata checks ${P.length>0?`— ${P.length} issue${P.length===1?``:`s`}`:`— OK`}`,done:P.length===0},{label:`Link checks ${F.length>0?`— ${F.length} issue${F.length===1?``:`s`}`:`— OK`}`,done:F.length===0},{label:`i18n checks ${I.length>0?`— ${I.length} issue${I.length===1?``:`s`}`:`— OK`}`,done:I.length===0},{label:`Sidebar checks ${H.length>0?`— ${H.length} issue${H.length===1?``:`s`}`:`— OK`}`,done:H.length===0}];t.budget&&e.push({label:`Performance budget ${W.length>0?`— ${W.length} issue${W.length===1?``:`s`}`:`— OK`}`,done:W.length===0}),console.log(`\n${y(e)}`)}let K=0;if(t.fix){for(let e of G)if(e.fix){if(k.doctorConfig.fix.confirmChanges&&!await d(`Fix issue in "${e.file}": ${e.message}?`))continue;if(k.doctorConfig.fix.backupFiles){let t=s.resolve(k.docsDir,e.file);c.existsSync(t)&&await D(t,s.resolve(k.root,k.doctorConfig.fix.backupPath))}await e.fix(),K++}}let q=((performance.now()-i)/1e3).toFixed(2),J=G.filter(e=>e.level===`high`).length,Y=G.filter(e=>e.level===`warning`).length,X=G.filter(e=>e.level===`low`).length,Z={summary:{total:G.length,high:J,warning:Y,low:X,fixed:K,duration:q},issues:G.map(e=>({...e,fix:void 0}))};if(n.reporting.outputFile){let t=s.resolve(e,n.reporting.outputFile);c.existsSync(s.dirname(t))||c.mkdirSync(s.dirname(t),{recursive:!0}),c.writeFileSync(t,JSON.stringify(Z,null,2))}if(r===`json`)console.log(JSON.stringify(Z,null,2));else if(r===`pretty`){let e=G.reduce((e,t)=>(e[t.file]||(e[t.file]=[]),e[t.file].push(t),e),{});if(G.length>0){f();for(let[n,r]of Object.entries(e)){let e=[];for(let n of r){let r=n.level===`high`?`❌`:n.level===`warning`?`⚠️`:`ℹ️`,i=n.level===`high`?u.red:n.level===`warning`?u.yellow:u.blue;e.push(`${r} ${i(n.level.toUpperCase())}: ${n.message}`),n.suggestion&&e.push(` ${u.dim(`💡 ${n.suggestion}`)}`),t.fix&&n.fix&&e.push(` ${u.green(`✅ Fixed automatically`)}`)}console.log(`\n${_(e,{title:`📄 ${n}`})}`)}f()}if(G.length===0)console.log(g([` Everything looks perfect!`,` Your documentation is in great shape.`,``,` ${u.dim(`Scanned ${w.length} file${w.length===1?``:`s`} in ${q}s`)}`],{title:`✨ Documentation Health Check`}));else{let e=[];J>0&&e.push(u.red(`${J} Critical Error${J===1?``:`s`}`)),Y>0&&e.push(u.yellow(`${Y} Warning${Y===1?``:`s`}`)),X>0&&e.push(u.blue(`${X} Improvement${X===1?``:`s`}`));let t=[...l(e).split(`
|
|
7
|
+
`).map(e=>e.trimStart()),``,u.dim(`Scanned ${w.length} file${w.length===1?``:`s`} in ${q}s`)];console.log(`\n${p(t,{title:`Diagnosis Results`})}\n`),K>0&&v(`Successfully fixed ${K} issues automatically!`),J>0?m(`Please fix the critical errors before building for production.`):v(`No critical issues found. You are ready to go!`)}}n.reporting.failOnError&&J>0&&process.exit(1),n.reporting.maxWarnings!==-1&&Y>n.reporting.maxWarnings&&(r===`pretty`&&m(`Failed: Too many warnings (${Y} > ${n.reporting.maxWarnings})`),process.exit(1))}catch(e){m(`Doctor failed: ${e}`),process.exit(1)}}export{N as n,H as t};
|
|
@@ -0,0 +1,7 @@
|
|
|
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-Ds5LZdWN.cjs`),t=require(`./utils-BWy_8ASj.cjs`),n=require(`./config-BqZUYono.cjs`),r=require(`./node/cli-entry.cjs`);let i=require(`node:path`);i=e.n(i);let a=require(`node:fs`);a=e.n(a);let o=require(`@bdocs/dui`),s=require(`fdir`),c=require(`picomatch`);c=e.n(c);let l=require(`fastest-levenshtein`);const u={$schema:`https://boltdocs.vercel.app/schemas/doctor-config.schema.json`,checks:{metadata:{enabled:!0,titleMin:10,titleMax:60,descriptionMin:50,required:[`title`,`description`],optional:[],validateDates:!1},links:{internal:!0,external:!1,timeout:1e4,concurrency:10,ignore:[]},i18n:{enabled:!0},performance:{enabled:!0,budgets:{maxJSBundleSize:`200kb`,maxCSSBundleSize:`30kb`,maxPageHTMLSize:`80kb`,maxImagesKB:500,maxBuildTime:3e4,maxFontCount:3}}},fix:{confirmChanges:!1,backupFiles:!1,backupPath:`.boltdocs/backups`},reporting:{format:`pretty`,outputFile:`.boltdocs/reports/doctor.json`,failOnError:!1,maxWarnings:-1},severity:{missingTranslation:`warning`,brokenLink:`high`,brokenAnchor:`warning`,largeFile:`warning`,orphanedPage:`low`,duplicateTitle:`low`,shortMetadata:`low`,missingMetadata:`warning`,malformedFrontmatter:`high`,invalidFrontmatter:`high`,budgetExceeded:`warning`},exclude:[]};function d(e,t){if(e==null)return t;if(typeof e==`number`)return e;let n=e.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);if(!n)return t;let r=Number.parseFloat(n[1]),i=n[2]||`b`;return Math.round(r*({b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024}[i]||1))}function f(e,t,n){return e.doctorConfig.severity[t]||n}async function p(e,t){a.default.existsSync(t)||a.default.mkdirSync(t,{recursive:!0});let n=i.default.basename(e),r=new Date().toISOString().replace(/[:.]/g,`-`),o=i.default.join(t,`${n}.${r}.bak`);a.default.copyFileSync(e,o)}const m=new Map;function h(e){let n=m.get(e);if(n)return n;let r=(async()=>{let n=await t.d(e,!1);return{raw:n.raw,data:n.data,content:n.content}})();return m.set(e,r),r}const g=new Map;function _(e){if(g.has(e))return g.get(e);let t=!1;try{t=a.default.existsSync(e)&&a.default.statSync(e).isFile()}catch{t=!1}return g.set(e,t),t}async function v(e){let t=i.default.resolve(e,`doctor.json`);if(a.default.existsSync(t))try{let e=JSON.parse(a.default.readFileSync(t,`utf-8`));return{...u,...e,checks:{...u.checks,...e.checks,metadata:{...u.checks.metadata,...e.checks?.metadata},links:{...u.checks.links,...e.checks?.links},i18n:{...u.checks.i18n,...e.checks?.i18n},performance:{...u.checks.performance,...e.checks?.performance,budgets:{...u.checks.performance?.budgets,...e.checks?.performance?.budgets}}},fix:{...u.fix,...e.fix},reporting:{...u.reporting,...e.reporting},severity:{...u.severity,...e.severity},exclude:[...u.exclude,...e.exclude||[]]}}catch(e){(0,o.warn)(`Failed to parse doctor.json: ${e}`)}return u}async function y(e,n=process.cwd(),r,o){let c=i.default.resolve(n,`.boltdocs`,`generated`);a.default.existsSync(c)||a.default.mkdirSync(c,{recursive:!0});let l=o;l||=await new s.fdir().withFullPaths().filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)).crawl(e).withPromise();let u=r?.base||`/docs`,d=[];for(let n=0;n<l.length;n+=100){let r=l.slice(n,n+100),a=await Promise.all(r.map(async n=>{let r=i.default.isAbsolute(n)?n:i.default.resolve(e,n),a=i.default.relative(e,r),{data:o}=await h(r),s;return s=o.permalink?o.permalink.startsWith(`/`)?o.permalink:`/${o.permalink}`:t.a(a),u===`/`?s:(u.endsWith(`/`)?u:u+`/`)+(s.startsWith(`/`)?s.substring(1):s)}));d.push(...a)}d.includes(u)||d.push(u);let f={routes:Array.from(new Set(d)).sort(),timestamp:Date.now()};return a.default.writeFileSync(i.default.resolve(c,`link-tree.json`),JSON.stringify(f,null,2)),f}function b(e,t){if(e===t)return 1;if(!e||!t)return 0;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=n[n.length-1]||``,a=r[r.length-1]||``;if(i===a){let e=0;for(let t of n)r.includes(t)&&e++;return e>=2?.99:.9}if(i.length>3&&a.length>3&&(a.startsWith(i)||i.startsWith(a))&&Math.min(i.length,a.length)/Math.max(i.length,a.length)>.5)return .88;let o=1-(0,l.distance)(i,a)/Math.max(i.length,a.length);return o>.8?o*.95:1-(0,l.distance)(e,t)/Math.max(e.length,t.length)}const x=new Map;function S(e,t){if(x.has(e))return x.get(e);let n=e.length,r=``,i=0;for(let a of t){if(a===e)continue;let t=a.length,o=Math.max(n,t);if(o===0)continue;let s=1-Math.abs(n-t)/o;if(s<=.8&&s<=i)continue;let c=b(e,a);c>i&&(i=c,r=a)}let a={bestMatch:r,similarity:i};return x.set(e,a),a}async function C(e){let n=[];if(!e.doctorConfig.checks.metadata.enabled)return n;let{titleMin:r,titleMax:a,descriptionMin:o}=e.doctorConfig.checks.metadata,s=new Map;for(let c of e.files){let l=t.u(i.default.relative(e.docsDir,c));try{let{raw:i,data:u}=await h(c);if(i.trim().startsWith(`---`)&&i.split(`---`).length>=3&&Object.keys(u).length===0){let t=f(e,`malformedFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Malformed frontmatter (YAML parsing failed).`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}let d=t.g.safeParse(u);if(!d.success){let t=f(e,`invalidFrontmatter`,`high`);if(t!==`off`)for(let e of d.error.issues)n.push({file:l,level:t,message:`Invalid frontmatter field "${e.path.join(`.`)}": ${e.message}`,suggestion:`Ensure the field follows the correct type.`})}let p=Array.from(new Set([`title`,...e.doctorConfig.checks.metadata.required]));for(let t of p)if(u[t]===void 0){let r=f(e,`missingMetadata`,`warning`);r!==`off`&&n.push({file:l,level:r,message:`Missing required frontmatter field: "${t}".`,suggestion:`Add the "${t}" field to your frontmatter.`})}if(e.doctorConfig.checks.metadata.validateDates){let t=[`date`,`lastUpdated`,...e.doctorConfig.checks.metadata.optional.filter(e=>e.toLowerCase().includes(`date`))];for(let r of t)if(u[r]&&Number.isNaN(Date.parse(String(u[r])))){let t=f(e,`invalidFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Invalid date format in field "${r}": "${u[r]}".`,suggestion:`Use a valid ISO date format (e.g., YYYY-MM-DD).`})}}if(u.title){let t=String(u.title);if(t.length<r){let i=f(e,`shortMetadata`,`low`);i!==`off`&&n.push({file:l,level:i,message:`Title is too short (${t.length} chars).`,suggestion:`Titles should be at least ${r} characters for better SEO.`})}else if(t.length>a){let r=f(e,`shortMetadata`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Title is too long (${t.length} chars).`,suggestion:`Titles should be under ${a} characters.`})}let i=s.get(t)||[];i.push(l),s.set(t,i)}if(u.description&&String(u.description).length<o){let t=f(e,`shortMetadata`,`low`);t!==`off`&&n.push({file:l,level:t,message:`Description is very short.`,suggestion:`Descriptions should ideally be at least ${o} characters.`})}}catch(t){if(t instanceof Error){let r=f(e,`malformedFrontmatter`,`high`);r!==`off`&&n.push({file:l,level:r,message:`Malformed frontmatter (YAML error): ${t.message}`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}}}for(let[t,r]of s.entries())if(r.length>1){let i=f(e,`duplicateTitle`,`low`);if(i!==`off`)for(let e of r)n.push({file:e,level:i,message:`Duplicate title found: "${t}"`,suggestion:`Ensure each page has a unique title. Also used in: ${r.filter(t=>t!==e).join(`, `)}`})}return n}async function w(e){let n=[],{internal:r,external:s,ignore:c,timeout:l,concurrency:u}=e.doctorConfig.checks.links;if(!r&&!s&&!e.options.checkExternal)return n;let d=/(?:\[.*?\]\((.*?)\))|(?:href=["']([^"']+)["'])/g,p=new Set,g=5e5;for(let o of e.files){let l=t.u(i.default.relative(e.docsDir,o)),{content:u}=await h(o),v=[...(u.length>g?u.slice(0,g):u).replace(/```[\s\S]*?```/g,``).replace(/`[^`\n]*`/g,``).matchAll(d)];for(let t of v){let u=t[1]||t[2],d=!!t[1];if(!u||c.some(e=>u.includes(e)))continue;if(/^https?:\/\//i.test(u)){(s||e.options.checkExternal)&&p.add({url:u,file:o});continue}if(!r||/^(mailto|tel|#)/i.test(u))continue;let h;try{h=decodeURIComponent(u.split(`#`)[0].split(`?`)[0])}catch{h=u.split(`#`)[0].split(`?`)[0]}if(!h)continue;let g=!1,v=``;if(h.startsWith(`/`))if(e.routeIndex.has(h)||e.routeIndexWithSlash.has(h)||e.routeIndexWithoutSlash.has(h))g=!0;else{let t=e.basePrefix+(h.startsWith(`/`)?h:`/`+h);if(e.routeIndex.has(t)||e.routeIndexWithSlash.has(t))g=!1,v=t;else{let t=e.config.base!==`/`&&h.startsWith(e.config.base||`/`)?h.substring((e.config.base||`/`).length):h,n=t.startsWith(`/`)?t.substring(1):t;v=i.default.join(e.docsDir,n),g=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>_(v+e))}}else v=i.default.resolve(i.default.dirname(o),h),g=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>_(v+e));if(!g){let{bestMatch:t,similarity:r}=S(h,e.linkTree.routes),i=!1,s=e.basePrefix+(h.startsWith(`/`)?h:`/`+h);(e.routeIndex.has(s)||e.routeIndexWithSlash.has(s))&&(t=s,r=1,i=!0);let c=r>.6||i,p=r>.75&&t!==h||i,g=f(e,`brokenLink`,`high`);g!==`off`&&n.push({file:l,level:g,message:`Broken internal link: "${u}"`,suggestion:c?`Did you mean "${t}"?`:`Ensure the target exists or check for typos.`,fix:p?async()=>{let e=u.includes(`#`)?`#`+u.split(`#`)[1]:``,n=d?`(${u})`:`href="${u}"`,r=d?`(${t}${e})`:`href="${t}${e}"`,i=a.default.readFileSync(o,`utf-8`).replace(n,r);a.default.writeFileSync(o,i),m.delete(o)}:void 0})}}}if(p.size>0){(0,o.info)(o.colors.gray(`Verifying ${p.size} external links...`));let r=new Map;for(let e of p)r.has(e.url)||r.set(e.url,[]),r.get(e.url).push(e.file);let a=async e=>{try{let t=new AbortController,n=setTimeout(()=>t.abort(),l),r=await fetch(e,{method:`HEAD`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}});return clearTimeout(n),!r.ok&&r.status!==404?{url:e,ok:(await fetch(e,{method:`GET`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}})).ok}:{url:e,ok:r.ok}}catch(t){return{url:e,ok:!1,error:t.message}}},s=Array.from(r.keys()),c=[];for(let e=0;e<s.length;e+=u){let t=s.slice(e,e+u),n=await Promise.allSettled(t.map(a));c.push(...n.map(e=>e.status===`fulfilled`?e.value:{url:`unknown`,ok:!1,error:e.reason}))}for(let a of c)if(!a.ok){let o=f(e,`brokenLink`,`warning`);if(o!==`off`){let s=r.get(a.url)||[];for(let r of s)n.push({file:t.u(i.default.relative(e.docsDir,r)),level:o,message:`Broken external link: "${a.url}"`,suggestion:`Verify the URL or update it if it's permanently down. Error: ${a.error||`Status >= 400`}`})}}}return n}async function T(e){let n=[];if(!e.doctorConfig.checks.i18n.enabled||!e.config.i18n)return n;let{defaultLocale:r,locales:o}=e.config.i18n,s=Object.keys(o),c=s.filter(e=>e!==r);for(let o of e.files){let l=t.u(i.default.relative(e.docsDir,o)),u=l.split(`/`),d=u[0];if(d===r){let t=u.slice(1).join(`/`);for(let r of c){let s=i.default.join(e.docsDir,r,t);if(!_(s)){let c=f(e,`missingTranslation`,`warning`);c!==`off`&&n.push({file:l,level:c,message:`Missing translation for locale "${r}"`,suggestion:`Create a version at "${r}/${t}".`,fix:async()=>{let e=i.default.dirname(s);a.default.existsSync(e)||a.default.mkdirSync(e,{recursive:!0}),a.default.copyFileSync(o,s)}})}}}else if(s.includes(d)){let t=u.slice(1).join(`/`);if(!_(i.default.join(e.docsDir,r,t))){let i=f(e,`missingTranslation`,`low`);i!==`off`&&n.push({file:l,level:i,message:`Orphaned translation (source missing in "${r}")`,suggestion:`Remove this file or create the source at "${r}/${t}".`,fix:async()=>{a.default.unlinkSync(o)}})}}}return n}async function E(e){let t=[];if(!e.config.theme.sidebar)return t;let n=new Set,r=e.config.theme.sidebar;for(let[i,a]of Object.entries(r))for(let r of a){if(!r.text){let n=f(e,`invalidFrontmatter`,`warning`);n!==`off`&&t.push({file:`boltdocs.config.ts`,level:n,message:`Sidebar item in group "${i}" is missing a label.`,suggestion:`Add a "text" property to the sidebar item.`})}if(r.link&&(n.add(r.link),!e.routeIndex.has(r.link))){let{bestMatch:n,similarity:i}=S(r.link,e.linkTree.routes),a=i>.6,o=f(e,`brokenLink`,`high`);o!==`off`&&t.push({file:`boltdocs.config.ts`,level:o,message:`Broken sidebar link: "${r.link}"`,suggestion:a?`Did you mean "${n}"?`:`Ensure the route exists and is correctly formatted.`})}}for(let r of e.linkTree.routes)if(!(r===`/`||r===``)&&!n.has(r)){let n=f(e,`orphanedPage`,`low`);n!==`off`&&t.push({file:`Sidebar`,level:n,message:`Orphaned page found: "${r}" is not linked in the sidebar.`,suggestion:`Consider adding it to the sidebar for better discoverability.`})}return t}async function D(e){let t=[],n=e.doctorConfig.checks.performance;if(!n?.enabled)return t;let r=i.default.resolve(e.root,`.boltdocs`,`reports`,`performance.json`);if(!a.default.existsSync(r))return t.push({file:`(build)`,level:f(e,`budgetExceeded`,`warning`),message:"Performance metrics not found. Run `boltdocs build` first."}),t;let o;try{o=JSON.parse(a.default.readFileSync(r,`utf-8`))}catch{return t.push({file:`(build)`,level:f(e,`budgetExceeded`,`warning`),message:`Failed to parse performance metrics file.`}),t}let s=n.budgets,c=f(e,`budgetExceeded`,`warning`),l=d(s?.maxJSBundleSize,1/0),u=d(s?.maxCSSBundleSize,1/0),p=d(s?.maxPageHTMLSize,1/0),m=s?.maxImagesKB??1/0,h=s?.maxBuildTime??1/0,g=s?.maxFontCount??1/0;if(l!==1/0&&o.totalJSBundleSize>l){let e=(o.totalJSBundleSize/1024).toFixed(0),n=(l/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`JS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Code-split large dependencies or lazy-load route components.`})}if(u!==1/0&&o.totalCSSBundleSize>u){let e=(o.totalCSSBundleSize/1024).toFixed(0),n=(u/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`CSS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Remove unused styles or split CSS by route.`})}if(p!==1/0){for(let e of o.pages)if(e.htmlSize>p){let n=(e.htmlSize/1024).toFixed(0),r=(p/1024).toFixed(0);t.push({file:e.route,level:c,message:`Page HTML size exceeds budget: ${n}kb > ${r}kb`,suggestion:`Reduce the amount of inline content or split into sub-pages.`})}}let _=m*1024;if(m!==1/0&&o.totalImagesSize>_){let e=(o.totalImagesSize/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`Image assets exceed budget: ${e}kb > ${m}kb`,suggestion:`Optimize images with lossy compression or use next-gen formats (webp/avif).`})}if(h!==1/0&&o.buildTime>h){let e=(o.buildTime/1e3).toFixed(1),n=(h/1e3).toFixed(1);t.push({file:`(build)`,level:c,message:`Build time exceeds budget: ${e}s > ${n}s`,suggestion:"Check for large unoptimized assets or increase `concurrency` in SSG options."})}return g!==1/0&&o.fontCount>g&&t.push({file:`(build)`,level:c,message:`Font files exceed budget: ${o.fontCount} > ${g}`,suggestion:`Reduce the number of font families or use variable fonts.`}),t}async function O(e){let t=i.default.resolve(e,`doctor.json`);if(a.default.existsSync(t)){(0,o.warn)(`"doctor.json" already exists at ${e}.`);return}try{a.default.writeFileSync(t,JSON.stringify(u,null,2)),(0,o.success)(`Created "doctor.json" with default configuration.`)}catch(e){(0,o.error)(`Failed to create "doctor.json": ${e}`)}}async function k(e=process.cwd(),t={}){if(t.init){await O(e);return}r.t();try{let r=await v(e),{format:l}=r.reporting,u=performance.now(),d=await n.n(`docs`,e),f=i.default.resolve(e,`docs`);a.default.existsSync(f)||(l===`pretty`&&(0,o.error)(`Docs dir not found at ${f}`),process.exit(1)),l===`pretty`&&console.log((0,o.double)([` ${o.colors.dim(`Docs dir:`)} ${f}`,` ${o.colors.dim(`Reports:`)} ${e}/.boltdocs/reports/`],{title:`✦ DOCTOR — Documentation Health Check`})),l===`pretty`&&(0,o.info)(o.colors.dim(`🔍 Discovering files and routes...`));let m=(0,c.default)(r.exclude||[]),h=await new s.fdir().withFullPaths().filter(e=>{if(!(e.endsWith(`.md`)||e.endsWith(`.mdx`)))return!1;let t=i.default.relative(f,e).replace(/\\/g,`/`),n=t.split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`);return!m(t)&&!n}).crawl(f).withPromise();for(let e of h)g.set(e,!0);let _=await y(f,e,d,h),b=d.base||`/`,x=b===`/`?``:b.endsWith(`/`)?b.slice(0,-1):b,S={root:e,docsDir:f,config:d,doctorConfig:r,linkTree:_,files:h,options:t,routeIndex:new Set(_.routes),routeIndexWithSlash:new Set(_.routes.map(e=>e.endsWith(`/`)?e:e+`/`)),routeIndexWithoutSlash:new Set(_.routes.map(e=>e.endsWith(`/`)?e.slice(0,-1):e)),basePrefix:x};l===`pretty`&&(0,o.info)(o.colors.dim(`🧪 Running diagnostic checks in parallel...`));let O=[C(S),w(S),T(S),E(S)];t.budget&&O.push(D(S));let[k,A,j,M,...N]=await Promise.all(O),P=t.budget?N[0]:[],F=[...k,...A,...j,...M,...P];if(l===`pretty`){let e=[{label:`Metadata checks ${k.length>0?`— ${k.length} issue${k.length===1?``:`s`}`:`— OK`}`,done:k.length===0},{label:`Link checks ${A.length>0?`— ${A.length} issue${A.length===1?``:`s`}`:`— OK`}`,done:A.length===0},{label:`i18n checks ${j.length>0?`— ${j.length} issue${j.length===1?``:`s`}`:`— OK`}`,done:j.length===0},{label:`Sidebar checks ${M.length>0?`— ${M.length} issue${M.length===1?``:`s`}`:`— OK`}`,done:M.length===0}];t.budget&&e.push({label:`Performance budget ${P.length>0?`— ${P.length} issue${P.length===1?``:`s`}`:`— OK`}`,done:P.length===0}),console.log(`\n${(0,o.tasks)(e)}`)}let I=0;if(t.fix){for(let e of F)if(e.fix){if(S.doctorConfig.fix.confirmChanges&&!await(0,o.confirm)(`Fix issue in "${e.file}": ${e.message}?`))continue;if(S.doctorConfig.fix.backupFiles){let t=i.default.resolve(S.docsDir,e.file);a.default.existsSync(t)&&await p(t,i.default.resolve(S.root,S.doctorConfig.fix.backupPath))}await e.fix(),I++}}let L=((performance.now()-u)/1e3).toFixed(2),R=F.filter(e=>e.level===`high`).length,z=F.filter(e=>e.level===`warning`).length,B=F.filter(e=>e.level===`low`).length,V={summary:{total:F.length,high:R,warning:z,low:B,fixed:I,duration:L},issues:F.map(e=>({...e,fix:void 0}))};if(r.reporting.outputFile){let t=i.default.resolve(e,r.reporting.outputFile);a.default.existsSync(i.default.dirname(t))||a.default.mkdirSync(i.default.dirname(t),{recursive:!0}),a.default.writeFileSync(t,JSON.stringify(V,null,2))}if(l===`json`)console.log(JSON.stringify(V,null,2));else if(l===`pretty`){let e=F.reduce((e,t)=>(e[t.file]||(e[t.file]=[]),e[t.file].push(t),e),{});if(F.length>0){(0,o.dividerLog)();for(let[n,r]of Object.entries(e)){let e=[];for(let n of r){let r=n.level===`high`?`❌`:n.level===`warning`?`⚠️`:`ℹ️`,i=n.level===`high`?o.colors.red:n.level===`warning`?o.colors.yellow:o.colors.blue;e.push(`${r} ${i(n.level.toUpperCase())}: ${n.message}`),n.suggestion&&e.push(` ${o.colors.dim(`💡 ${n.suggestion}`)}`),t.fix&&n.fix&&e.push(` ${o.colors.green(`✅ Fixed automatically`)}`)}console.log(`\n${(0,o.single)(e,{title:`📄 ${n}`})}`)}(0,o.dividerLog)()}if(F.length===0)console.log((0,o.round)([` Everything looks perfect!`,` Your documentation is in great shape.`,``,` ${o.colors.dim(`Scanned ${h.length} file${h.length===1?``:`s`} in ${L}s`)}`],{title:`✨ Documentation Health Check`}));else{let e=[];R>0&&e.push(o.colors.red(`${R} Critical Error${R===1?``:`s`}`)),z>0&&e.push(o.colors.yellow(`${z} Warning${z===1?``:`s`}`)),B>0&&e.push(o.colors.blue(`${B} Improvement${B===1?``:`s`}`));let t=[...(0,o.bullet)(e).split(`
|
|
7
|
+
`).map(e=>e.trimStart()),``,o.colors.dim(`Scanned ${h.length} file${h.length===1?``:`s`} in ${L}s`)];console.log(`\n${(0,o.double)(t,{title:`Diagnosis Results`})}\n`),I>0&&(0,o.success)(`Successfully fixed ${I} issues automatically!`),R>0?(0,o.error)(`Please fix the critical errors before building for production.`):(0,o.success)(`No critical issues found. You are ready to go!`)}}r.reporting.failOnError&&R>0&&process.exit(1),r.reporting.maxWarnings!==-1&&z>r.reporting.maxWarnings&&(l===`pretty`&&(0,o.error)(`Failed: Too many warnings (${z} > ${r.reporting.maxWarnings})`),process.exit(1))}catch(e){(0,o.error)(`Doctor failed: ${e}`),process.exit(1)}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return 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
|
+
var e=class e extends Error{constructor(t){super(t),this.name=`SecurityViolationError`,Object.setPrototypeOf(this,e.prototype)}},t=class t extends e{constructor(e){super(e),this.name=`PathTraversalError`,Object.setPrototypeOf(this,t.prototype)}},n=class t extends e{constructor(e){super(e),this.name=`EncodingSecurityError`,Object.setPrototypeOf(this,t.prototype)}},r=class t extends e{constructor(e){super(e),this.name=`ValidationError`,Object.setPrototypeOf(this,t.prototype)}};export{t as n,r,n as t};
|
|
@@ -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
|
+
var e=class e extends Error{constructor(t){super(t),this.name=`SecurityViolationError`,Object.setPrototypeOf(this,e.prototype)}},t=class t extends e{constructor(e){super(e),this.name=`PathTraversalError`,Object.setPrototypeOf(this,t.prototype)}},n=class t extends e{constructor(e){super(e),this.name=`EncodingSecurityError`,Object.setPrototypeOf(this,t.prototype)}},r=class t extends e{constructor(e){super(e),this.name=`ValidationError`,Object.setPrototypeOf(this,t.prototype)}};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return n}});
|
|
@@ -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
|
+
var e=require(`./chunk-Ds5LZdWN.cjs`).t({SECURITY_HEADERS:()=>t});const t={"X-Content-Type-Options":`nosniff`,"X-Frame-Options":`DENY`,"X-XSS-Protection":`1; mode=block`,"Referrer-Policy":`strict-origin-when-cross-origin`,"Permissions-Policy":`camera=(), microphone=(), geolocation=()`,"Strict-Transport-Security":`max-age=31536000; includeSubDomains`};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t}});
|
|
@@ -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{P as e}from"./node-B7qbjtLl.mjs";var t=e({SECURITY_HEADERS:()=>n});const n={"X-Content-Type-Options":`nosniff`,"X-Frame-Options":`DENY`,"X-XSS-Protection":`1; mode=block`,"Referrer-Policy":`strict-origin-when-cross-origin`,"Permissions-Policy":`camera=(), microphone=(), geolocation=()`,"Strict-Transport-Security":`max-age=31536000; includeSubDomains`};export{t as n,n as t};
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
const e=require(`./chunk-Ds5LZdWN.cjs`);let t=require(`node:path`);t=e.n(t);let n=require(`
|
|
6
|
+
const e=require(`./chunk-Ds5LZdWN.cjs`);let t=require(`node:path`);t=e.n(t);let n=require(`@bdocs/dui`),r=require(`fdir`),i=require(`node:fs/promises`);i=e.n(i);async function a(e){let a={};try{let o=(await new r.fdir().withFullPaths().filter(e=>e.endsWith(`meta.json`)).crawl(e).withPromise()).filter(e=>{let n=t.default.basename(e);return n===`meta.json`||n===`_meta.json`}),s=await Promise.allSettled(o.map(async n=>{let r=await i.default.readFile(n,`utf-8`),a=t.default.relative(e,t.default.dirname(n)).replace(/\\/g,`/`);return{key:a===``?`.`:a,content:JSON.parse(r)}}));for(let e of s)e.status===`fulfilled`?a[e.value.key]=e.value.content:(0,n.warn)(`Failed to read meta.json:`,e.reason)}catch(e){(0,n.error)(`Error loading directory metadata:`,e)}return a}exports.loadDirectoryMeta=a;
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
import e from"node:path";import{
|
|
6
|
+
import e from"node:path";import{error as t,warn as n}from"@bdocs/dui";import{fdir as r}from"fdir";import i from"node:fs/promises";async function a(a){let o={};try{let t=(await new r().withFullPaths().filter(e=>e.endsWith(`meta.json`)).crawl(a).withPromise()).filter(t=>{let n=e.basename(t);return n===`meta.json`||n===`_meta.json`}),s=await Promise.allSettled(t.map(async t=>{let n=await i.readFile(t,`utf-8`),r=e.relative(a,e.dirname(t)).replace(/\\/g,`/`);return{key:r===``?`.`:r,content:JSON.parse(n)}}));for(let e of s)e.status===`fulfilled`?o[e.value.key]=e.value.content:n(`Failed to read meta.json:`,e.reason)}catch(e){t(`Error loading directory metadata:`,e)}return o}export{a as loadDirectoryMeta};
|
package/dist/node/cli-entry.cjs
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* Copyright (c) 2026 Jesus Alcala
|
|
5
5
|
* Licensed under the MIT License.
|
|
6
6
|
*/
|
|
7
|
-
const e=require(`../chunk-Ds5LZdWN.cjs`),t=require(`../
|
|
8
|
-
`+(0,
|
|
9
|
-
`
|
|
7
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Ds5LZdWN.cjs`),t=require(`../node-Dj3-2YYP.cjs`),n=require(`../config-BqZUYono.cjs`),r=require(`../cache-B19MLTpN.cjs`);let i=require(`node:path`);i=e.n(i);let a=require(`node:fs`);a=e.n(a);let o=require(`@bdocs/dui`),s=require(`vite`),c=require(`node:module`),l=require(`node:fs/promises`);l=e.n(l);let u=require(`@bdocs/ssg/node`),d=require(`cac`);d=e.n(d);let f=require(`node:os`);f=e.n(f);let p=require(`node:url`);function m(e){let t=e;for(;t&&t!==i.default.dirname(t);){if(a.default.existsSync(i.default.join(t,`.git`))||a.default.existsSync(i.default.join(t,`pnpm-workspace.yaml`)))return t;t=i.default.dirname(t)}t=e;let n=e;for(;t&&t!==i.default.dirname(t);)a.default.existsSync(i.default.join(t,`package.json`))&&(n=t),t=i.default.dirname(t);return n}let h=m(process.cwd());function g(e){if(!e)return;let t;if(typeof e==`string`)t=e;else if(e instanceof URL){if(e.protocol!==`file:`)return;t=e.pathname}else if(Buffer.isBuffer(e))t=e.toString();else return;let n=i.default.resolve(h,t),r=i.default.relative(h,n),a=r.startsWith(`..`)||i.default.isAbsolute(r),o=n.split(i.default.sep),s=o.some(e=>e.startsWith(`.env`)),c=o.some((e,t)=>{if(e===`node_modules`){let e=o[t+1];return!e||!e.startsWith(`.`)}return!1});if(a||s||c)throw Error(`[Boltdocs Security] Write/delete operation blocked on path: "${n}". Modifications are restricted to the project root, and cannot access .env or non-cache node_modules folders.`)}function _(e){return e==null?!1:typeof e==`number`?e!==0:typeof e==`string`?e.includes(`w`)||e.includes(`a`)||e.includes(`+`):!0}function v(){let e=a.default.writeFile;a.default.writeFile=((t,...n)=>{try{g(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return e.call(a.default,t,...n)});let t=a.default.writeFileSync;a.default.writeFileSync=(e,...n)=>(g(e),t.call(a.default,e,...n));let n=a.default.rm;a.default.rm=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return n.call(a.default,e,...t)});let r=a.default.rmSync;a.default.rmSync=(e,...t)=>(g(e),r.call(a.default,e,...t));let i=a.default.unlink;a.default.unlink=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return i.call(a.default,e,...t)});let o=a.default.unlinkSync;a.default.unlinkSync=(e,...t)=>(g(e),o.call(a.default,e,...t));let s=a.default.mkdir;a.default.mkdir=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return s.call(a.default,e,...t)});let c=a.default.mkdirSync;a.default.mkdirSync=(e,...t)=>(g(e),c.call(a.default,e,...t));let u=a.default.rmdir;a.default.rmdir=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return u.call(a.default,e,...t)});let d=a.default.rmdirSync;a.default.rmdirSync=(e,...t)=>(g(e),d.call(a.default,e,...t));let f=a.default.appendFile;a.default.appendFile=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return f.call(a.default,e,...t)});let p=a.default.appendFileSync;a.default.appendFileSync=(e,...t)=>(g(e),p.call(a.default,e,...t));let m=a.default.copyFile;a.default.copyFile=((e,t,...n)=>{try{g(e),g(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return m.call(a.default,e,t,...n)});let h=a.default.copyFileSync;a.default.copyFileSync=(e,t,...n)=>(g(e),g(t),h.call(a.default,e,t,...n));let v=a.default.rename;a.default.rename=((e,t,...n)=>{try{g(e),g(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return v.call(a.default,e,t,...n)});let y=a.default.renameSync;a.default.renameSync=(e,t,...n)=>(g(e),g(t),y.call(a.default,e,t,...n));let b=a.default.createWriteStream;a.default.createWriteStream=(e,...t)=>(g(e),b.call(a.default,e,...t));let x=a.default.open;a.default.open=((e,t,...n)=>{if(_(typeof t==`function`?void 0:t))try{g(e)}catch(e){let r=n[n.length-1],i=typeof t==`function`?t:typeof r==`function`?r:void 0;if(i){process.nextTick(()=>i(e));return}throw e}return x.call(a.default,e,t,...n)});let S=a.default.openSync;a.default.openSync=(e,t,...n)=>(_(t)&&g(e),S.call(a.default,e,t,...n));let C=e=>{if(!e)return;let t=e.writeFile;t&&(e.writeFile=async(n,...r)=>(g(n),t.call(e,n,...r)));let n=e.rm;n&&(e.rm=async(t,...r)=>(g(t),n.call(e,t,...r)));let r=e.mkdir;r&&(e.mkdir=async(t,...n)=>(g(t),r.call(e,t,...n)));let i=e.rmdir;i&&(e.rmdir=async(t,...n)=>(g(t),i.call(e,t,...n)));let a=e.unlink;a&&(e.unlink=async(t,...n)=>(g(t),a.call(e,t,...n)));let o=e.appendFile;o&&(e.appendFile=async(t,...n)=>(g(t),o.call(e,t,...n)));let s=e.copyFile;s&&(e.copyFile=async(t,n,...r)=>(g(t),g(n),s.call(e,t,n,...r)));let c=e.rename;c&&(e.rename=async(t,n,...r)=>(g(t),g(n),c.call(e,t,n,...r)));let l=e.open;l&&(e.open=async(t,n,...r)=>(_(n)&&g(t),l.call(e,t,n,...r)))};C(a.default.promises),C(l.default)}function y(e,t){let n=t?` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.cyan(t)}`:` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.gray(`use --host to expose`)}`;return`
|
|
8
|
+
`+(0,o.double)([` ${o.colors.green(`➜`)} ${o.colors.green(`Local:`)} ${o.colors.cyan(e)}`,n,``,` ${o.colors.dim(`press h + enter for help`)}`],{title:`boltdocs dev server`})+`
|
|
9
|
+
`}function b(e,t){let n=t?` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.cyan(t)}`:` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.gray(`use --host to expose`)}`;return`
|
|
10
|
+
`+(0,o.double)([` ${o.colors.green(`➜`)} ${o.colors.green(`Local:`)} ${o.colors.cyan(e)}`,n],{title:`boltdocs preview server`})+`
|
|
11
|
+
`}function x(e,t){return`
|
|
12
|
+
`+(0,o.double)([(0,o.padCenter)(`🚀 Update available!`,50),``,` ${o.colors.dim(`Current:`)} ${o.colors.red(e)} ${o.colors.gray(`→`)} ${o.colors.green(t)}`,``,` ${o.colors.dim(`Run:`)} ${o.colors.bold(`npm install boltdocs@latest`)}`])+`
|
|
13
|
+
`}const S=(0,c.createRequire)(require(`url`).pathToFileURL(__filename).href);function C(e,t){let n=e.split(`-`)[0].split(`.`).map(Number),r=t.split(`-`)[0].split(`.`).map(Number);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e]??0,i=r[e]??0;if(Number.isNaN(t)||Number.isNaN(i))return!1;if(t!==i)return t>i}return!1}async function w(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),2e3),n=await fetch(`https://registry.npmjs.org/boltdocs/latest`,{signal:e.signal,headers:{Accept:`application/vnd.npm.install-v1+json`}});return clearTimeout(t),n.ok?(await n.json()).version??null:null}catch{return null}}async function T(){try{let e=(0,p.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),t=i.default.dirname(e);for(let e=0;e<5;e++){let e=i.default.join(t,`package.json`);if(a.default.existsSync(e)){let t=JSON.parse(a.default.readFileSync(e,`utf-8`));if(t.name===`boltdocs`)return t.version}t=i.default.dirname(t)}}catch{}try{return S(`boltdocs/package.json`).version}catch{return`0.0.0`}}async function E(){let e=``;try{e=i.default.join(f.default.homedir(),`.boltdocs`,`update-check.json`)}catch{return}let t=0;try{if(a.default.existsSync(e)){let n=JSON.parse(a.default.readFileSync(e,`utf-8`));t=Number(n.lastCheck)||0}}catch{}let n=Date.now();if(n-t<864e5)return;try{a.default.mkdirSync(i.default.dirname(e),{recursive:!0}),a.default.writeFileSync(e,JSON.stringify({lastCheck:n}),`utf-8`)}catch{}let r=await T();if(r===`0.0.0`)return;let o=await w();o&&C(o,r)&&console.log(x(r,o))}let D=!1;async function O(e=process.cwd(),r={}){if(D)return;D=!0,E();let a;try{a=await n.n(i.default.resolve(e,`docs`),e),t.w(a,e)}catch{}try{let n=await t.n(e,`development`,a);n.logLevel=`warn`,n.clearScreen=!1,r.port!==void 0&&(n.server=n.server||{},n.server.port=Number(r.port)),r.host!==void 0&&(n.server=n.server||{},n.server.host=r.host),r.force&&(n.optimizeDeps=n.optimizeDeps||{},n.optimizeDeps.force=!0);let i=await(0,u.createServer)(n);await i.listen();let o=i.resolvedUrls;console.log(y(o?.local?.[0]??`http://localhost:${r.port??5173}`,o?.network?.[0]??null)),i.bindCLIShortcuts({print:!1})}catch(e){(0,o.error)(`Failed to start dev server:`,e),process.exit(1)}}async function k(e=process.cwd()){E();try{let n=await t.S().run({root:e,timing:{}});n.success||((0,o.error)(`Build failed at step "${n.failedStep}":`,n.error),await r.a(),process.exit(1)),console.log((0,o.double)([`SSG build completed in ${(Math.round(n.timing.total)/1e3).toFixed(1)}s`,``,`${o.colors.cyan(`boltdocs`)} documentation is ready at ${o.colors.green(`dist/`)}`])),await r.a(),process.exit(0)}catch(e){(0,o.error)(`Build failed:`,e),await r.a(),process.exit(1)}}async function A(e=process.cwd(),n={}){try{let r=await t.n(e,`production`);r.logLevel=`warn`,r.clearScreen=!1,n.port!==void 0&&(r.preview=r.preview||{},r.preview.port=Number(n.port)),n.host!==void 0&&(r.preview=r.preview||{},r.preview.host=n.host);let i=(await(0,s.preview)(r)).resolvedUrls;console.log(b(i?.local?.[0]??`http://localhost:${n.port??4173}`,i?.network?.[0]??null))}catch(e){(0,o.error)(`Failed to start preview server:`,e),process.exit(1)}}function j(e){let t=[];if(!a.default.existsSync(e))return t;try{let n=a.default.readdirSync(e);for(let r of n){let n=i.default.join(e,r);a.default.statSync(n).isDirectory()?r!==`node_modules`&&r!==`.git`&&r!==`dist`&&r!==`coverage`&&t.push(...j(n)):/\.(js|mjs|cjs|ts|tsx|jsx)$/.test(r)&&t.push(n)}}catch{}return t}async function M(e=process.cwd()){(0,o.info)(`Starting static security audit of Boltdocs plugins...`);let t;try{t=await n.n(i.default.resolve(e,`docs`),e)}catch(e){(0,o.error)(`Failed to load Boltdocs configuration for audit:`,e),process.exit(1)}let r=t.plugins||[];if(r.length===0){(0,o.success)(`No plugins configured. Nothing to audit.`);return}let s=[];for(let t of r){if(!t.name)continue;let n=null;try{let{createRequire:r}=await import(`node:module`),a=r(i.default.resolve(e,`package.json`)).resolve(`${t.name}/package.json`);n=i.default.dirname(a)}catch{let r=i.default.resolve(e,`node_modules`,t.name);a.default.existsSync(r)&&(n=r)}if(!n){s.push({name:o.colors.cyan(t.name),status:o.colors.red(`❓ Unresolved`),details:`Could not locate plugin files in node_modules.`});continue}let r=j(n),c=[];for(let e of r)try{let t=a.default.readFileSync(e,`utf-8`);t.includes(`fetch(`)&&c.push(`fetch`),t.includes(`axios`)&&c.push(`axios`),t.includes(`http.request`)&&c.push(`http.request`),t.includes(`https.request`)&&c.push(`https.request`),t.includes(`process.env`)&&c.push(`process.env`)}catch{}let l=Array.from(new Set(c));l.length>0?s.push({name:o.colors.cyan(t.name),status:o.colors.yellow(`⚠️ Warning`),details:`Contains network/env accesses: ${o.colors.bold(l.join(`, `))}. Ensure you trust the author.`}):s.push({name:o.colors.cyan(t.name),status:o.colors.green(`✅ Clean`),details:`No external network calls or env accesses detected.`})}let c=[`Plugin`,`Status`,`Audit Notes`],l=s.map(e=>[e.name,e.status,e.details]);console.log(`
|
|
14
|
+
`+(0,o.table)(c,l)+`
|
|
15
|
+
`),s.some(e=>e.status.includes(`Warning`))?(0,o.warn)(`⚠️ One or more plugins have security warnings. Review the flags above.`):(0,o.success)(`✓ All plugins passed the static security check!`)}const{emitWarning:N}=process;process.emitWarning=function(e,...t){if(!(e&&typeof e==`object`&&e.code===`DEP0205`)&&!(typeof e==`string`&&t.includes(`DEP0205`)))return Reflect.apply(N,process,[e,...t])},v(),(0,o.configure)({prefix:`boltdocs`});const P=(0,d.default)(`boltdocs`);P.command(`dev [root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(O),P.command(`[root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(O),P.command(`build [root]`,`Build for production`).action(k),P.command(`preview [root]`,`Preview production build`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(A),P.command(`audit [root]`,`Audit configured plugins for security warnings`).action(M),P.command(`doctor [root]`,`Check the health of your documentation`).option(`--fix`,`Automatically fix broken internal links and sync translations`).option(`--check-external`,`Verify external links (slower)`).option(`--init`,`Initialize doctor.json with default configuration`).option(`--budget`,`Check build performance against configured budgets`).action(async(e,t)=>{let{doctorAction:n}=await Promise.resolve().then(()=>require(`../doctor-D8fl3Sbg.cjs`));await n(e,t)}),P.command(`generate-changelog <file>`,`Generate changelog documentation from CHANGELOG.md`).option(`-o, --output <path>`,`Output folder (default: docs/changelog)`,{default:`docs/changelog`}).option(`-t, --title <text>`,`Title for changelog pages`,{default:`Changelog`}).option(`--infer-tab`,`Infer tab from folder name (default: true)`,{default:!0}).option(`-l, --limit <number>`,`Limit number of versions to generate`).action(async(e,t)=>{let{generateChangelog:n}=await Promise.resolve().then(()=>require(`../generator-DtUU3Cfk.cjs`));await n(e,{output:t.output,title:t.title,inferTab:t.inferTab,limit:t.limit?parseInt(String(t.limit),10):void 0})}),P.help(),P.version(`2.0.0`),P.parse(),exports.t=E;
|
package/dist/node/cli-entry.mjs
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* Copyright (c) 2026 Jesus Alcala
|
|
5
5
|
* Licensed under the MIT License.
|
|
6
6
|
*/
|
|
7
|
-
import{E as e,
|
|
8
|
-
`+
|
|
9
|
-
`
|
|
7
|
+
import{E as e,n as t,w as n}from"../node-B7qbjtLl.mjs";import{n as r}from"../config-DBKBEj3j.mjs";import{a as i}from"../cache-CfhOTR3Q.mjs";import{createRequire as a}from"node:module";import o from"node:path";import s from"node:fs";import{colors as c,configure as l,double as u,error as d,info as f,padCenter as p,success as m,table as h,warn as g}from"@bdocs/dui";import{preview as _}from"vite";import v from"node:fs/promises";import{createServer as y}from"@bdocs/ssg/node";import b from"cac";import x from"node:os";import{fileURLToPath as S}from"node:url";function C(e){let t=e;for(;t&&t!==o.dirname(t);){if(s.existsSync(o.join(t,`.git`))||s.existsSync(o.join(t,`pnpm-workspace.yaml`)))return t;t=o.dirname(t)}t=e;let n=e;for(;t&&t!==o.dirname(t);)s.existsSync(o.join(t,`package.json`))&&(n=t),t=o.dirname(t);return n}let w=C(process.cwd());function T(e){if(!e)return;let t;if(typeof e==`string`)t=e;else if(e instanceof URL){if(e.protocol!==`file:`)return;t=e.pathname}else if(Buffer.isBuffer(e))t=e.toString();else return;let n=o.resolve(w,t),r=o.relative(w,n),i=r.startsWith(`..`)||o.isAbsolute(r),a=n.split(o.sep),s=a.some(e=>e.startsWith(`.env`)),c=a.some((e,t)=>{if(e===`node_modules`){let e=a[t+1];return!e||!e.startsWith(`.`)}return!1});if(i||s||c)throw Error(`[Boltdocs Security] Write/delete operation blocked on path: "${n}". Modifications are restricted to the project root, and cannot access .env or non-cache node_modules folders.`)}function E(e){return e==null?!1:typeof e==`number`?e!==0:typeof e==`string`?e.includes(`w`)||e.includes(`a`)||e.includes(`+`):!0}function D(){let e=s.writeFile;s.writeFile=((t,...n)=>{try{T(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return e.call(s,t,...n)});let t=s.writeFileSync;s.writeFileSync=(e,...n)=>(T(e),t.call(s,e,...n));let n=s.rm;s.rm=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return n.call(s,e,...t)});let r=s.rmSync;s.rmSync=(e,...t)=>(T(e),r.call(s,e,...t));let i=s.unlink;s.unlink=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return i.call(s,e,...t)});let a=s.unlinkSync;s.unlinkSync=(e,...t)=>(T(e),a.call(s,e,...t));let o=s.mkdir;s.mkdir=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return o.call(s,e,...t)});let c=s.mkdirSync;s.mkdirSync=(e,...t)=>(T(e),c.call(s,e,...t));let l=s.rmdir;s.rmdir=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return l.call(s,e,...t)});let u=s.rmdirSync;s.rmdirSync=(e,...t)=>(T(e),u.call(s,e,...t));let d=s.appendFile;s.appendFile=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return d.call(s,e,...t)});let f=s.appendFileSync;s.appendFileSync=(e,...t)=>(T(e),f.call(s,e,...t));let p=s.copyFile;s.copyFile=((e,t,...n)=>{try{T(e),T(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return p.call(s,e,t,...n)});let m=s.copyFileSync;s.copyFileSync=(e,t,...n)=>(T(e),T(t),m.call(s,e,t,...n));let h=s.rename;s.rename=((e,t,...n)=>{try{T(e),T(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return h.call(s,e,t,...n)});let g=s.renameSync;s.renameSync=(e,t,...n)=>(T(e),T(t),g.call(s,e,t,...n));let _=s.createWriteStream;s.createWriteStream=(e,...t)=>(T(e),_.call(s,e,...t));let y=s.open;s.open=((e,t,...n)=>{if(E(typeof t==`function`?void 0:t))try{T(e)}catch(e){let r=n[n.length-1],i=typeof t==`function`?t:typeof r==`function`?r:void 0;if(i){process.nextTick(()=>i(e));return}throw e}return y.call(s,e,t,...n)});let b=s.openSync;s.openSync=(e,t,...n)=>(E(t)&&T(e),b.call(s,e,t,...n));let x=e=>{if(!e)return;let t=e.writeFile;t&&(e.writeFile=async(n,...r)=>(T(n),t.call(e,n,...r)));let n=e.rm;n&&(e.rm=async(t,...r)=>(T(t),n.call(e,t,...r)));let r=e.mkdir;r&&(e.mkdir=async(t,...n)=>(T(t),r.call(e,t,...n)));let i=e.rmdir;i&&(e.rmdir=async(t,...n)=>(T(t),i.call(e,t,...n)));let a=e.unlink;a&&(e.unlink=async(t,...n)=>(T(t),a.call(e,t,...n)));let o=e.appendFile;o&&(e.appendFile=async(t,...n)=>(T(t),o.call(e,t,...n)));let s=e.copyFile;s&&(e.copyFile=async(t,n,...r)=>(T(t),T(n),s.call(e,t,n,...r)));let c=e.rename;c&&(e.rename=async(t,n,...r)=>(T(t),T(n),c.call(e,t,n,...r)));let l=e.open;l&&(e.open=async(t,n,...r)=>(E(n)&&T(t),l.call(e,t,n,...r)))};x(s.promises),x(v)}function O(e,t){let n=t?` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.cyan(t)}`:` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.gray(`use --host to expose`)}`;return`
|
|
8
|
+
`+u([` ${c.green(`➜`)} ${c.green(`Local:`)} ${c.cyan(e)}`,n,``,` ${c.dim(`press h + enter for help`)}`],{title:`boltdocs dev server`})+`
|
|
9
|
+
`}function k(e,t){let n=t?` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.cyan(t)}`:` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.gray(`use --host to expose`)}`;return`
|
|
10
|
+
`+u([` ${c.green(`➜`)} ${c.green(`Local:`)} ${c.cyan(e)}`,n],{title:`boltdocs preview server`})+`
|
|
11
|
+
`}function A(e,t){return`
|
|
12
|
+
`+u([p(`🚀 Update available!`,50),``,` ${c.dim(`Current:`)} ${c.red(e)} ${c.gray(`→`)} ${c.green(t)}`,``,` ${c.dim(`Run:`)} ${c.bold(`npm install boltdocs@latest`)}`])+`
|
|
13
|
+
`}const j=a(import.meta.url);function M(e,t){let n=e.split(`-`)[0].split(`.`).map(Number),r=t.split(`-`)[0].split(`.`).map(Number);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e]??0,i=r[e]??0;if(Number.isNaN(t)||Number.isNaN(i))return!1;if(t!==i)return t>i}return!1}async function N(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),2e3),n=await fetch(`https://registry.npmjs.org/boltdocs/latest`,{signal:e.signal,headers:{Accept:`application/vnd.npm.install-v1+json`}});return clearTimeout(t),n.ok?(await n.json()).version??null:null}catch{return null}}async function P(){try{let e=S(import.meta.url),t=o.dirname(e);for(let e=0;e<5;e++){let e=o.join(t,`package.json`);if(s.existsSync(e)){let t=JSON.parse(s.readFileSync(e,`utf-8`));if(t.name===`boltdocs`)return t.version}t=o.dirname(t)}}catch{}try{return j(`boltdocs/package.json`).version}catch{return`0.0.0`}}async function F(){let e=``;try{e=o.join(x.homedir(),`.boltdocs`,`update-check.json`)}catch{return}let t=0;try{if(s.existsSync(e)){let n=JSON.parse(s.readFileSync(e,`utf-8`));t=Number(n.lastCheck)||0}}catch{}let n=Date.now();if(n-t<864e5)return;try{s.mkdirSync(o.dirname(e),{recursive:!0}),s.writeFileSync(e,JSON.stringify({lastCheck:n}),`utf-8`)}catch{}let r=await P();if(r===`0.0.0`)return;let i=await N();i&&M(i,r)&&console.log(A(r,i))}let I=!1;async function L(n=process.cwd(),i={}){if(I)return;I=!0,F();let a;try{a=await r(o.resolve(n,`docs`),n),e(a,n)}catch{}try{let e=await t(n,`development`,a);e.logLevel=`warn`,e.clearScreen=!1,i.port!==void 0&&(e.server=e.server||{},e.server.port=Number(i.port)),i.host!==void 0&&(e.server=e.server||{},e.server.host=i.host),i.force&&(e.optimizeDeps=e.optimizeDeps||{},e.optimizeDeps.force=!0);let r=await y(e);await r.listen();let o=r.resolvedUrls;console.log(O(o?.local?.[0]??`http://localhost:${i.port??5173}`,o?.network?.[0]??null)),r.bindCLIShortcuts({print:!1})}catch(e){d(`Failed to start dev server:`,e),process.exit(1)}}async function R(e=process.cwd()){F();try{let t=await n().run({root:e,timing:{}});t.success||(d(`Build failed at step "${t.failedStep}":`,t.error),await i(),process.exit(1)),console.log(u([`SSG build completed in ${(Math.round(t.timing.total)/1e3).toFixed(1)}s`,``,`${c.cyan(`boltdocs`)} documentation is ready at ${c.green(`dist/`)}`])),await i(),process.exit(0)}catch(e){d(`Build failed:`,e),await i(),process.exit(1)}}async function z(e=process.cwd(),n={}){try{let r=await t(e,`production`);r.logLevel=`warn`,r.clearScreen=!1,n.port!==void 0&&(r.preview=r.preview||{},r.preview.port=Number(n.port)),n.host!==void 0&&(r.preview=r.preview||{},r.preview.host=n.host);let i=(await _(r)).resolvedUrls;console.log(k(i?.local?.[0]??`http://localhost:${n.port??4173}`,i?.network?.[0]??null))}catch(e){d(`Failed to start preview server:`,e),process.exit(1)}}function B(e){let t=[];if(!s.existsSync(e))return t;try{let n=s.readdirSync(e);for(let r of n){let n=o.join(e,r);s.statSync(n).isDirectory()?r!==`node_modules`&&r!==`.git`&&r!==`dist`&&r!==`coverage`&&t.push(...B(n)):/\.(js|mjs|cjs|ts|tsx|jsx)$/.test(r)&&t.push(n)}}catch{}return t}async function V(e=process.cwd()){f(`Starting static security audit of Boltdocs plugins...`);let t;try{t=await r(o.resolve(e,`docs`),e)}catch(e){d(`Failed to load Boltdocs configuration for audit:`,e),process.exit(1)}let n=t.plugins||[];if(n.length===0){m(`No plugins configured. Nothing to audit.`);return}let i=[];for(let t of n){if(!t.name)continue;let n=null;try{let{createRequire:r}=await import(`node:module`),i=r(o.resolve(e,`package.json`)).resolve(`${t.name}/package.json`);n=o.dirname(i)}catch{let r=o.resolve(e,`node_modules`,t.name);s.existsSync(r)&&(n=r)}if(!n){i.push({name:c.cyan(t.name),status:c.red(`❓ Unresolved`),details:`Could not locate plugin files in node_modules.`});continue}let r=B(n),a=[];for(let e of r)try{let t=s.readFileSync(e,`utf-8`);t.includes(`fetch(`)&&a.push(`fetch`),t.includes(`axios`)&&a.push(`axios`),t.includes(`http.request`)&&a.push(`http.request`),t.includes(`https.request`)&&a.push(`https.request`),t.includes(`process.env`)&&a.push(`process.env`)}catch{}let l=Array.from(new Set(a));l.length>0?i.push({name:c.cyan(t.name),status:c.yellow(`⚠️ Warning`),details:`Contains network/env accesses: ${c.bold(l.join(`, `))}. Ensure you trust the author.`}):i.push({name:c.cyan(t.name),status:c.green(`✅ Clean`),details:`No external network calls or env accesses detected.`})}let a=[`Plugin`,`Status`,`Audit Notes`],l=i.map(e=>[e.name,e.status,e.details]);console.log(`
|
|
14
|
+
`+h(a,l)+`
|
|
15
|
+
`),i.some(e=>e.status.includes(`Warning`))?g(`⚠️ One or more plugins have security warnings. Review the flags above.`):m(`✓ All plugins passed the static security check!`)}const{emitWarning:H}=process;process.emitWarning=function(e,...t){if(!(e&&typeof e==`object`&&e.code===`DEP0205`)&&!(typeof e==`string`&&t.includes(`DEP0205`)))return Reflect.apply(H,process,[e,...t])},D(),l({prefix:`boltdocs`});const U=b(`boltdocs`);U.command(`dev [root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(L),U.command(`[root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(L),U.command(`build [root]`,`Build for production`).action(R),U.command(`preview [root]`,`Preview production build`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(z),U.command(`audit [root]`,`Audit configured plugins for security warnings`).action(V),U.command(`doctor [root]`,`Check the health of your documentation`).option(`--fix`,`Automatically fix broken internal links and sync translations`).option(`--check-external`,`Verify external links (slower)`).option(`--init`,`Initialize doctor.json with default configuration`).option(`--budget`,`Check build performance against configured budgets`).action(async(e,t)=>{let{doctorAction:n}=await import(`../doctor-C19DsI1e.mjs`).then(e=>e.t);await n(e,t)}),U.command(`generate-changelog <file>`,`Generate changelog documentation from CHANGELOG.md`).option(`-o, --output <path>`,`Output folder (default: docs/changelog)`,{default:`docs/changelog`}).option(`-t, --title <text>`,`Title for changelog pages`,{default:`Changelog`}).option(`--infer-tab`,`Infer tab from folder name (default: true)`,{default:!0}).option(`-l, --limit <number>`,`Limit number of versions to generate`).action(async(e,t)=>{let{generateChangelog:n}=await import(`../generator-B6lrnDZ-.mjs`);await n(e,{output:t.output,title:t.title,inferTab:t.inferTab,limit:t.limit?parseInt(String(t.limit),10):void 0})}),U.help(),U.version(`2.0.0`),U.parse();export{F as t};
|
package/dist/node/index.cjs
CHANGED
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}}),require(`../chunk-Ds5LZdWN.cjs`);const e=require(`../utils-
|
|
6
|
+
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}}),require(`../chunk-Ds5LZdWN.cjs`);const e=require(`../utils-BWy_8ASj.cjs`),t=require(`../node-Dj3-2YYP.cjs`),n=require(`../config-BqZUYono.cjs`),r=require(`../cache-B19MLTpN.cjs`),i=require(`../shiki-adapter-BB71nVsG.cjs`),a=require(`../handler-1LRMYeI4.cjs`);let o=require(`unist-util-visit`);exports.AssetCache=r.n,exports.BoltdocsPluginStore=t.E,exports.EXIT=o.EXIT,exports.MDX_NODES=i.o,exports.PluginCompatibilityError=t.D,exports.PluginError=t.O,exports.PluginHookError=t.k,exports.PluginLifecycleManager=t.x,exports.PluginValidationError=t.A,exports.SKIP=o.SKIP,exports.addNodeClass=t.c,exports.createMdxAttribute=t.l,exports.createMdxElement=t.u,exports.createPlugin=t.s,exports.createRehypeElement=t.d,exports.createViteConfig=t.n,exports.default=t.t,exports.defineConfig=n.a,exports.flushCache=r.a,exports.generateEntryCode=t.j,exports.getNodeProperty=t.f,exports.handleAwsFeedback=t.r,exports.handleFeedback=a.t,exports.handleNetlifyFeedback=t.a,exports.handleVercelFeedback=t.o,exports.handleWebFeedback=t.i,exports.hasNodeClass=t.p,exports.normalizePath=e.u,exports.parseMetaString=i.r,exports.removeNodeClass=t.m,exports.resolveConfig=n.n,exports.sanitizeFilename=e.f,exports.setNodeProperty=t.h,exports.validatePlugins=t.T,exports.visitMdxElements=t.g,exports.visitNodes=t._,exports.visitRehypeElements=t.v,exports.visitRemarkHeadings=t.y,exports.visitRemarkLinks=t.b;
|
package/dist/node/index.d.cts
CHANGED
|
@@ -236,7 +236,7 @@ interface BoltdocsIntegrationsConfig {
|
|
|
236
236
|
/**
|
|
237
237
|
* The root configuration object for Boltdocs.
|
|
238
238
|
*/
|
|
239
|
-
interface BoltdocsConfig
|
|
239
|
+
interface BoltdocsConfig {
|
|
240
240
|
siteUrl?: string;
|
|
241
241
|
docsDir?: string;
|
|
242
242
|
base?: string;
|
|
@@ -282,7 +282,7 @@ type BoltdocsRoutePathWithFallback = BoltdocsRoutePath extends never ? string :
|
|
|
282
282
|
*
|
|
283
283
|
* @param config - The Boltdocs configuration object
|
|
284
284
|
*/
|
|
285
|
-
declare function defineConfig(config: BoltdocsConfig
|
|
285
|
+
declare function defineConfig(config: BoltdocsConfig): BoltdocsConfig;
|
|
286
286
|
//#endregion
|
|
287
287
|
//#region src/node/config.d.ts
|
|
288
288
|
/**
|
|
@@ -293,7 +293,7 @@ declare function defineConfig(config: BoltdocsConfig$1): BoltdocsConfig$1;
|
|
|
293
293
|
* @param root - The project root directory (defaults to process.cwd())
|
|
294
294
|
* @returns The merged configuration object
|
|
295
295
|
*/
|
|
296
|
-
declare function resolveConfig(docsDir: string, root?: string): Promise<BoltdocsConfig
|
|
296
|
+
declare function resolveConfig(docsDir: string, root?: string): Promise<BoltdocsConfig>;
|
|
297
297
|
//#endregion
|
|
298
298
|
//#region src/node/plugin/types.d.ts
|
|
299
299
|
/**
|
|
@@ -313,7 +313,7 @@ interface BoltdocsPluginOptions {
|
|
|
313
313
|
* @param config - The resolved Boltdocs configuration containing custom plugins and components
|
|
314
314
|
* @returns A string of JavaScript code to be evaluated by the browser
|
|
315
315
|
*/
|
|
316
|
-
declare function generateEntryCode(options: BoltdocsPluginOptions, config?: BoltdocsConfig
|
|
316
|
+
declare function generateEntryCode(options: BoltdocsPluginOptions, config?: BoltdocsConfig): string;
|
|
317
317
|
//#endregion
|
|
318
318
|
//#region src/node/routes/types.d.ts
|
|
319
319
|
/**
|
|
@@ -419,7 +419,7 @@ declare function flushCache(): Promise<void>;
|
|
|
419
419
|
//#endregion
|
|
420
420
|
//#region src/node/plugins/plugin-types.d.ts
|
|
421
421
|
interface PluginContext {
|
|
422
|
-
readonly config: BoltdocsConfig
|
|
422
|
+
readonly config: BoltdocsConfig;
|
|
423
423
|
readonly logger: PluginLogger;
|
|
424
424
|
readonly store: PluginStore;
|
|
425
425
|
readonly meta: PluginMeta;
|
|
@@ -537,7 +537,7 @@ declare class PluginLifecycleManager {
|
|
|
537
537
|
private store;
|
|
538
538
|
private docsDir;
|
|
539
539
|
private rootDir;
|
|
540
|
-
constructor(plugins: SecureBoltdocsPlugin[], config: BoltdocsConfig
|
|
540
|
+
constructor(plugins: SecureBoltdocsPlugin[], config: BoltdocsConfig, docsDir?: string, rootDir?: string);
|
|
541
541
|
runHook(hookName: keyof PluginLifecycleHooks, ...args: unknown[]): Promise<void>;
|
|
542
542
|
runChain<TParams>(hookName: keyof PluginLifecycleHooks, initialParams: TParams): Promise<TParams>;
|
|
543
543
|
private getSortedPlugins;
|
|
@@ -1037,4 +1037,4 @@ declare function boltdocs(options?: BoltdocsPluginOptions): Promise<Plugin[]>;
|
|
|
1037
1037
|
*/
|
|
1038
1038
|
declare function createViteConfig(root: string, mode?: 'development' | 'production', preResolvedConfig?: BoltdocsConfig): Promise<InlineConfig>;
|
|
1039
1039
|
//#endregion
|
|
1040
|
-
export { AssetCache, type BoltdocsConfig
|
|
1040
|
+
export { AssetCache, type BoltdocsConfig, type BoltdocsPlugin, type BoltdocsPluginOptions, BoltdocsPluginStore, type BoltdocsThemeConfig, EXIT, MDX_NODES, NodeWithHProperties, PluginCompatibilityError, PluginContext, PluginError, PluginHookError, PluginLifecycleHooks, PluginLifecycleManager, PluginLogger, PluginMeta, PluginStore, PluginValidationError, type RouteMeta, SKIP, SecureBoltdocsPlugin, addNodeClass, createMdxAttribute, createMdxElement, createPlugin, createRehypeElement, createViteConfig, boltdocs as default, defineConfig, flushCache, generateEntryCode, getNodeProperty, handleAwsFeedback, handleFeedback, handleNetlifyFeedback, handleVercelFeedback, handleWebFeedback, hasNodeClass, normalizePath, parseMetaString, removeNodeClass, resolveConfig, sanitizeFilename, setNodeProperty, validatePlugins, visitMdxElements, visitNodes, visitRehypeElements, visitRemarkHeadings, visitRemarkLinks };
|