vitepress-plugin-diagrams 1.3.0 → 1.3.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/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # VitePress Diagrams Plugin
2
2
 
3
- [English](README.md) | [Español](README.es.md) | [中文](README.zh.md) | [Українська](README.uk.md) | [Русский](README.ru.md)
4
-
5
3
  A VitePress plugin that adds support for various diagram types using the Kroki service. The plugin automatically converts diagram code blocks into SVG images, caches them locally, and provides a clean, customizable display with optional captions.
6
4
 
7
5
 
package/bin/cli.js CHANGED
File without changes
@@ -0,0 +1,36 @@
1
+ import type { BuildTimeDiagramPluginOptions } from "./types.js";
2
+ import type { MarkdownRenderer } from "vitepress";
3
+ /**
4
+ * Create a pair of plugins for build-time diagram generation.
5
+ *
6
+ * Unlike the default dev-time mode (which writes a placeholder SVG and fetches
7
+ * asynchronously), this mode defers all HTTP calls and processes them during the
8
+ * Vite build (`generateBundle`) or dev server request (`configureServer`).
9
+ *
10
+ * This is useful for CI/CD pipelines where diagrams must be generated reliably
11
+ * at build time, and a build failure is expected when a diagram cannot be generated.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { createBuildTimeDiagramsPlugin } from "vitepress-plugin-diagrams";
16
+ *
17
+ * const { configureMarkdown, vitePlugin } = createBuildTimeDiagramsPlugin({
18
+ * diagramsDir: "docs/public/diagrams",
19
+ * diagramsDistDir: "diagrams",
20
+ * publicPath: "/diagrams",
21
+ * });
22
+ *
23
+ * export default defineConfig({
24
+ * markdown: { config: (md) => configureMarkdown(md) },
25
+ * vite: { plugins: [vitePlugin()] },
26
+ * });
27
+ * ```
28
+ */
29
+ export declare function createBuildTimeDiagramsPlugin(options?: BuildTimeDiagramPluginOptions): {
30
+ configureMarkdown: (md: MarkdownRenderer) => void;
31
+ vitePlugin: () => {
32
+ name: string;
33
+ configureServer(server: any): void;
34
+ generateBundle(this: any): Promise<void>;
35
+ };
36
+ };
package/dist/index.cjs CHANGED
@@ -1,18 +1,45 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const J=require("node:fs"),Y=require("node:path"),X=require("node:crypto"),K=require("node:process");function v(t){const u=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const s=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(u,e,s.get?s:{enumerable:!0,get:()=>t[e]})}}return u.default=t,Object.freeze(u)}const E=v(J),l=v(Y),I=v(X),m=v(K),w=["blockdiag","bpmn","bytefield","seqdiag","actdiag","nwdiag","packetdiag","rackdiag","c4plantuml","d2","dbml","ditaa","erd","excalidraw","graphviz","mermaid","nomnoml","pikchr","plantuml","structurizr","svgbob","symbolator","tikz","umlet","vega","vega-lite","wavedrom","wireviz"],Q=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/,V=/[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/;function k(t){switch(t){case 9:case 32:return!0}return!1}function P(t){if(t>=8192&&t<=8202)return!0;switch(t){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function _(t){return Q.test(t)||V.test(t)}function M(t){switch(t){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function d(t,u,e){this.type=t,this.tag=u,this.attrs=null,this.map=null,this.nesting=e,this.level=0,this.children=null,this.content="",this.markup="",this.info="",this.meta=null,this.block=!1,this.hidden=!1}d.prototype.attrIndex=function(u){if(!this.attrs)return-1;const e=this.attrs;for(let s=0,r=e.length;s<r;s++)if(e[s][0]===u)return s;return-1};d.prototype.attrPush=function(u){this.attrs?this.attrs.push(u):this.attrs=[u]};d.prototype.attrSet=function(u,e){const s=this.attrIndex(u),r=[u,e];s<0?this.attrPush(r):this.attrs[s]=r};d.prototype.attrGet=function(u){const e=this.attrIndex(u);let s=null;return e>=0&&(s=this.attrs[e][1]),s};d.prototype.attrJoin=function(u,e){const s=this.attrIndex(u);s<0?this.attrPush([u,e]):this.attrs[s][1]=this.attrs[s][1]+" "+e};function uu(t,u,e){this.src=t,this.env=e,this.tokens=[],this.inlineMode=!1,this.md=u}uu.prototype.Token=d;function f(t,u,e,s){this.src=t,this.md=u,this.env=e,this.tokens=s,this.bMarks=[],this.eMarks=[],this.tShift=[],this.sCount=[],this.bsCount=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.ddIndent=-1,this.listIndent=-1,this.parentType="root",this.level=0;const r=this.src;for(let o=0,i=0,D=0,n=0,c=r.length,a=!1;i<c;i++){const F=r.charCodeAt(i);if(!a)if(k(F)){D++,F===9?n+=4-n%4:n++;continue}else a=!0;(F===10||i===c-1)&&(F!==10&&i++,this.bMarks.push(o),this.eMarks.push(i),this.tShift.push(D),this.sCount.push(n),this.bsCount.push(0),a=!1,D=0,n=0,o=i+1)}this.bMarks.push(r.length),this.eMarks.push(r.length),this.tShift.push(0),this.sCount.push(0),this.bsCount.push(0),this.lineMax=this.bMarks.length-1}f.prototype.push=function(t,u,e){const s=new d(t,u,e);return s.block=!0,e<0&&this.level--,s.level=this.level,e>0&&this.level++,this.tokens.push(s),s};f.prototype.isEmpty=function(u){return this.bMarks[u]+this.tShift[u]>=this.eMarks[u]};f.prototype.skipEmptyLines=function(u){for(let e=this.lineMax;u<e&&!(this.bMarks[u]+this.tShift[u]<this.eMarks[u]);u++);return u};f.prototype.skipSpaces=function(u){for(let e=this.src.length;u<e;u++){const s=this.src.charCodeAt(u);if(!k(s))break}return u};f.prototype.skipSpacesBack=function(u,e){if(u<=e)return u;for(;u>e;)if(!k(this.src.charCodeAt(--u)))return u+1;return u};f.prototype.skipChars=function(u,e){for(let s=this.src.length;u<s&&this.src.charCodeAt(u)===e;u++);return u};f.prototype.skipCharsBack=function(u,e,s){if(u<=s)return u;for(;u>s;)if(e!==this.src.charCodeAt(--u))return u+1;return u};f.prototype.getLines=function(u,e,s,r){if(u>=e)return"";const o=new Array(e-u);for(let i=0,D=u;D<e;D++,i++){let n=0;const c=this.bMarks[D];let a=c,F;for(D+1<e||r?F=this.eMarks[D]+1:F=this.eMarks[D];a<F&&n<s;){const h=this.src.charCodeAt(a);if(k(h))h===9?n+=4-(n+this.bsCount[D])%4:n++;else if(a-c<this.tShift[D])n++;else break;a++}n>s?o[i]=new Array(n-s+1).join(" ")+this.src.slice(a,F):o[i]=this.src.slice(a,F)}return o.join("")};f.prototype.Token=d;const tu=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],eu="[a-zA-Z_:][a-zA-Z0-9:._-]*",su="[^\"'=<>`\\x00-\\x20]+",ru="'[^']*'",iu='"[^"]*"',nu="(?:"+su+"|"+ru+"|"+iu+")",ou="(?:\\s+"+eu+"(?:\\s*=\\s*"+nu+")?)",Du="<[A-Za-z][A-Za-z0-9\\-]*"+ou+"*\\s*\\/?>",au="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",cu=new RegExp("^(?:"+Du+"|"+au+")");new RegExp("^</?("+tu.join("|")+")(?=(\\s|/?>|$))","i"),new RegExp(cu.source+"\\s*$");function S(t,u,e,s){this.src=t,this.env=e,this.md=u,this.tokens=s,this.tokens_meta=Array(s.length),this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache={},this.delimiters=[],this._prev_delimiters=[],this.backticks={},this.backticksScanned=!1,this.linkLevel=0}S.prototype.pushPending=function(){const t=new d("text","",0);return t.content=this.pending,t.level=this.pendingLevel,this.tokens.push(t),this.pending="",t};S.prototype.push=function(t,u,e){this.pending&&this.pushPending();const s=new d(t,u,e);let r=null;return e<0&&(this.level--,this.delimiters=this._prev_delimiters.pop()),s.level=this.level,e>0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],r={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(s),this.tokens_meta.push(r),s};S.prototype.scanDelims=function(t,u){const e=this.posMax,s=this.src.charCodeAt(t),r=t>0?this.src.charCodeAt(t-1):32;let o=t;for(;o<e&&this.src.charCodeAt(o)===s;)o++;const i=o-t,D=o<e?this.src.charCodeAt(o):32,n=M(r)||_(String.fromCharCode(r)),c=M(D)||_(String.fromCharCode(D)),a=P(r),F=P(D),h=!F&&(!c||a||n),C=!a&&(!n||F||c);return{can_open:h&&(u||!C||n),can_close:C&&(u||!h||c),length:i}};S.prototype.Token=d;const L=[];for(let t=0;t<256;t++)L.push(0);"\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(t){L[t.charCodeAt(0)]=1});function Fu(t,u){var s,r;const e=t[u+1];if(e&&e.type==="html_block"){const o=e.content.match(/<!--\s*diagram(?:\s+id="([^"]+)")?/),i=e.content.match(/\s+caption="([^"]+)"/);return{id:(s=o==null?void 0:o[1])==null?void 0:s.trim(),caption:((r=i==null?void 0:i[1])==null?void 0:r.trim())||""}}return{caption:"",id:void 0}}function z(t,u,e,s,r){const o=r!==void 0?`${u}${r}`:u,i=I.createHash("md5").update(o).digest("hex");return e?`${t}-${e}-${i}.svg`:s?`${t}-${s}-${i}.svg`:`${t}-${i}.svg`}function lu(t){var e;const u=((e=m==null?void 0:m.cwd)==null?void 0:e.call(m))||m.env.PWD||m.env.INIT_CWD||".";return t?l.resolve(u,t):l.resolve(u,"docs/public/diagrams")}function q(t,u,e,s,r,o){try{const i=E.readdirSync(t);let D=[];if(e)D=i.filter(n=>n.startsWith(`${u}-${e}-`)&&n!==s);else if(o)D=i.filter(n=>n.startsWith(`${u}-${o}-`)&&n!==s);else if(r){const n=I.createHash("md5").update(r).digest("hex"),c=`${u}-${n}.svg`;D=i.filter(a=>{if(!a.startsWith(`${u}-`)||!a.endsWith(".svg")||a===s||a===c)return!1;const h=a.slice(0,-4).split("-");return h.length===2&&h[0]===u})}D.forEach(n=>{const c=l.join(t,n);E.existsSync(c)&&(E.unlinkSync(c),console.log(`Removed old diagram file: ${n}`))})}catch(i){console.warn(`Failed to remove old diagram files: ${i}`)}}const hu=[".exe",".bat",".cmd",".sh",".bash",".ps1",".vbs",".js",".ts",".php",".py",".rb",".pl",".com",".msi",".jar",".pif",".scr",".wsf",".wsc",".wsh",".hta",".cpl",".inf",".reg",".lnk"];function W(t){const u=l.extname(t).toLowerCase();return hu.includes(u)}function j(t){return t.trim().startsWith("@file:")}function R(t){const u=t.trim();return u.startsWith("@file:")&&u.split(`
2
- `)[0].slice(6).trim()||null}function O(t,u){if(t.startsWith("/"))return t;const e=l.dirname(u);return l.resolve(e,t)}function G(t,u){if(!u||u.length===0)return!0;try{const e=E.realpathSync(l.resolve(t));for(const s of u){const r=l.resolve(s),o=E.realpathSync(r);if(e.startsWith(o+l.sep)||e===o)return!0}}catch{const s=l.resolve(t);for(const r of u){const o=l.resolve(r);if(s.startsWith(o+l.sep)||s===o)return!0}}return!1}function T(t){try{if(W(t))throw new Error(`File extension not allowed: ${l.extname(t)}`);const u=E.statSync(t);if(!u.isFile())throw new Error(`Path is not a file: ${t}`);const e=E.realpathSync(t);return{content:E.readFileSync(e,"utf-8"),filePath:e,mtime:u.mtimeMs}}catch(u){const e=u instanceof Error?u.message:String(u);throw new Error(`Failed to read file import: ${e}`)}}function U(t,u,e,s,r={},o,i){try{const D=t.replaceAll(`\r
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ut=require("node:fs"),et=require("node:path"),st=require("node:crypto"),rt=require("node:process");function P(u){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(u){for(const e in u)if(e!=="default"){const s=Object.getOwnPropertyDescriptor(u,e);Object.defineProperty(t,e,s.get?s:{enumerable:!0,get:()=>u[e]})}}return t.default=u,Object.freeze(t)}const E=P(ut),d=P(et),J=P(st),k=P(rt),y=["blockdiag","bpmn","bytefield","seqdiag","actdiag","nwdiag","packetdiag","rackdiag","c4plantuml","d2","dbml","ditaa","erd","excalidraw","graphviz","mermaid","nomnoml","pikchr","plantuml","structurizr","svgbob","symbolator","tikz","umlet","vega","vega-lite","wavedrom","wireviz"],it=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/,nt=/[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/;function _(u){switch(u){case 9:case 32:return!0}return!1}function T(u){if(u>=8192&&u<=8202)return!0;switch(u){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function Z(u){return it.test(u)||nt.test(u)}function H(u){switch(u){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function C(u,t,e){this.type=u,this.tag=t,this.attrs=null,this.map=null,this.nesting=e,this.level=0,this.children=null,this.content="",this.markup="",this.info="",this.meta=null,this.block=!1,this.hidden=!1}C.prototype.attrIndex=function(t){if(!this.attrs)return-1;const e=this.attrs;for(let s=0,a=e.length;s<a;s++)if(e[s][0]===t)return s;return-1};C.prototype.attrPush=function(t){this.attrs?this.attrs.push(t):this.attrs=[t]};C.prototype.attrSet=function(t,e){const s=this.attrIndex(t),a=[t,e];s<0?this.attrPush(a):this.attrs[s]=a};C.prototype.attrGet=function(t){const e=this.attrIndex(t);let s=null;return e>=0&&(s=this.attrs[e][1]),s};C.prototype.attrJoin=function(t,e){const s=this.attrIndex(t);s<0?this.attrPush([t,e]):this.attrs[s][1]=this.attrs[s][1]+" "+e};function at(u,t,e){this.src=u,this.env=e,this.tokens=[],this.inlineMode=!1,this.md=t}at.prototype.Token=C;function x(u,t,e,s){this.src=u,this.md=t,this.env=e,this.tokens=s,this.bMarks=[],this.eMarks=[],this.tShift=[],this.sCount=[],this.bsCount=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.ddIndent=-1,this.listIndent=-1,this.parentType="root",this.level=0;const a=this.src;for(let l=0,r=0,n=0,i=0,D=a.length,o=!1;r<D;r++){const c=a.charCodeAt(r);if(!o)if(_(c)){n++,c===9?i+=4-i%4:i++;continue}else o=!0;(c===10||r===D-1)&&(c!==10&&r++,this.bMarks.push(l),this.eMarks.push(r),this.tShift.push(n),this.sCount.push(i),this.bsCount.push(0),o=!1,n=0,i=0,l=r+1)}this.bMarks.push(a.length),this.eMarks.push(a.length),this.tShift.push(0),this.sCount.push(0),this.bsCount.push(0),this.lineMax=this.bMarks.length-1}x.prototype.push=function(u,t,e){const s=new C(u,t,e);return s.block=!0,e<0&&this.level--,s.level=this.level,e>0&&this.level++,this.tokens.push(s),s};x.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]};x.prototype.skipEmptyLines=function(t){for(let e=this.lineMax;t<e&&!(this.bMarks[t]+this.tShift[t]<this.eMarks[t]);t++);return t};x.prototype.skipSpaces=function(t){for(let e=this.src.length;t<e;t++){const s=this.src.charCodeAt(t);if(!_(s))break}return t};x.prototype.skipSpacesBack=function(t,e){if(t<=e)return t;for(;t>e;)if(!_(this.src.charCodeAt(--t)))return t+1;return t};x.prototype.skipChars=function(t,e){for(let s=this.src.length;t<s&&this.src.charCodeAt(t)===e;t++);return t};x.prototype.skipCharsBack=function(t,e,s){if(t<=s)return t;for(;t>s;)if(e!==this.src.charCodeAt(--t))return t+1;return t};x.prototype.getLines=function(t,e,s,a){if(t>=e)return"";const l=new Array(e-t);for(let r=0,n=t;n<e;n++,r++){let i=0;const D=this.bMarks[n];let o=D,c;for(n+1<e||a?c=this.eMarks[n]+1:c=this.eMarks[n];o<c&&i<s;){const F=this.src.charCodeAt(o);if(_(F))F===9?i+=4-(i+this.bsCount[n])%4:i++;else if(o-D<this.tShift[n])i++;else break;o++}i>s?l[r]=new Array(i-s+1).join(" ")+this.src.slice(o,c):l[r]=this.src.slice(o,c)}return l.join("")};x.prototype.Token=C;const ot=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],ct="[a-zA-Z_:][a-zA-Z0-9:._-]*",lt="[^\"'=<>`\\x00-\\x20]+",Dt="'[^']*'",Ft='"[^"]*"',ht="(?:"+lt+"|"+Dt+"|"+Ft+")",dt="(?:\\s+"+ct+"(?:\\s*=\\s*"+ht+")?)",ft="<[A-Za-z][A-Za-z0-9\\-]*"+dt+"*\\s*\\/?>",Et="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",mt=new RegExp("^(?:"+ft+"|"+Et+")");new RegExp("^</?("+ot.join("|")+")(?=(\\s|/?>|$))","i"),new RegExp(mt.source+"\\s*$");function M(u,t,e,s){this.src=u,this.env=e,this.md=t,this.tokens=s,this.tokens_meta=Array(s.length),this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache={},this.delimiters=[],this._prev_delimiters=[],this.backticks={},this.backticksScanned=!1,this.linkLevel=0}M.prototype.pushPending=function(){const u=new C("text","",0);return u.content=this.pending,u.level=this.pendingLevel,this.tokens.push(u),this.pending="",u};M.prototype.push=function(u,t,e){this.pending&&this.pushPending();const s=new C(u,t,e);let a=null;return e<0&&(this.level--,this.delimiters=this._prev_delimiters.pop()),s.level=this.level,e>0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],a={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(s),this.tokens_meta.push(a),s};M.prototype.scanDelims=function(u,t){const e=this.posMax,s=this.src.charCodeAt(u),a=u>0?this.src.charCodeAt(u-1):32;let l=u;for(;l<e&&this.src.charCodeAt(l)===s;)l++;const r=l-u,n=l<e?this.src.charCodeAt(l):32,i=H(a)||Z(String.fromCharCode(a)),D=H(n)||Z(String.fromCharCode(n)),o=T(a),c=T(n),F=!c&&(!D||o||i),h=!o&&(!i||c||D);return{can_open:F&&(t||!h||i),can_close:h&&(t||!F||D),length:r}};M.prototype.Token=C;const Y=[];for(let u=0;u<256;u++)Y.push(0);"\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(u){Y[u.charCodeAt(0)]=1});function K(u,t){var s,a;const e=u[t+1];if(e&&e.type==="html_block"){const l=e.content.match(/<!--\s*diagram(?:\s+id="([^"]+)")?/),r=e.content.match(/\s+caption="([^"]+)"/);return{id:(s=l==null?void 0:l[1])==null?void 0:s.trim(),caption:((a=r==null?void 0:r[1])==null?void 0:a.trim())||""}}return{caption:"",id:void 0}}function z(u,t,e,s,a){const l=a!==void 0?`${t}${a}`:t,r=J.createHash("md5").update(l).digest("hex");return e?`${u}-${e}-${r}.svg`:s?`${u}-${s}-${r}.svg`:`${u}-${r}.svg`}function X(u){var e;const t=((e=k==null?void 0:k.cwd)==null?void 0:e.call(k))||k.env.PWD||k.env.INIT_CWD||".";return u?d.resolve(t,u):d.resolve(t,"docs/public/diagrams")}function j(u,t,e,s,a,l){try{const r=E.readdirSync(u);let n=[];if(e)n=r.filter(i=>i.startsWith(`${t}-${e}-`)&&i!==s);else if(l)n=r.filter(i=>i.startsWith(`${t}-${l}-`)&&i!==s);else if(a){const i=J.createHash("md5").update(a).digest("hex"),D=`${t}-${i}.svg`;n=r.filter(o=>{if(!o.startsWith(`${t}-`)||!o.endsWith(".svg")||o===s||o===D)return!1;const F=o.slice(0,-4).split("-");return F.length===2&&F[0]===t})}n.forEach(i=>{const D=d.join(u,i);E.existsSync(D)&&(E.unlinkSync(D),console.log(`Removed old diagram file: ${i}`))})}catch(r){console.warn(`Failed to remove old diagram files: ${r}`)}}const pt=[".exe",".bat",".cmd",".sh",".bash",".ps1",".vbs",".js",".ts",".php",".py",".rb",".pl",".com",".msi",".jar",".pif",".scr",".wsf",".wsc",".wsh",".hta",".cpl",".inf",".reg",".lnk"];function Q(u){const t=d.extname(u).toLowerCase();return pt.includes(t)}function R(u){return u.trim().startsWith("@file:")}function W(u){const t=u.trim();return t.startsWith("@file:")&&t.split(`
2
+ `)[0].slice(6).trim()||null}function U(u,t){if(u.startsWith("/"))return u;const e=d.dirname(t);return d.resolve(e,u)}function G(u,t){if(!t||t.length===0)return!0;try{const e=E.realpathSync(d.resolve(u));for(const s of t){const a=d.resolve(s),l=E.realpathSync(a);if(e.startsWith(l+d.sep)||e===l)return!0}}catch{const s=d.resolve(u);for(const a of t){const l=d.resolve(a);if(s.startsWith(l+d.sep)||s===l)return!0}}return!1}function O(u){try{if(Q(u))throw new Error(`File extension not allowed: ${d.extname(u)}`);const t=E.statSync(u);if(!t.isFile())throw new Error(`Path is not a file: ${u}`);const e=E.realpathSync(u);return{content:E.readFileSync(e,"utf-8"),filePath:e,mtime:t.mtimeMs}}catch(t){const e=t instanceof Error?t.message:String(t);throw new Error(`Failed to read file import: ${e}`)}}function Ct(u={}){const t=[];function e(r){const n=r.renderer.rules.fence;r.renderer.rules.fence=(i,D,o,c,F)=>{const h=i[D],m=h.info.trim().toLowerCase(),f=u.excludedDiagramTypes??[],g=y.includes(m),p=f.includes(m);if(g&&!p){let B=h.content.trim();const{caption:I,id:A}=K(i,D),w=u.enableFileImports??!0;let S;if(w&&R(B))try{const v=W(B);if(v){const b=(c==null?void 0:c.path)||"";if(!b)return'<div class="diagram-error">Cannot resolve file import: markdown file path is not available</div>';const q=U(v,b),tt=u.allowedImportDirs;if(!G(q,tt))return`<div class="diagram-error">File import not allowed: ${v}. Path is outside allowed directories.</div>`;const N=O(q);B=N.content,S=N.mtime}}catch(v){const b=v instanceof Error?v.message:String(v);return`<div class="diagram-error">Error loading diagram file in ${(c==null?void 0:c.path)||"unknown"}: ${b}</div>`}const L=(c==null?void 0:c.path)||"unknown",$=`${d.basename(L,".md")}-${D}`;return s(B,m,I,A,$,S)}return n(i,D,o,c,F)}}function s(r,n,i,D,o,c){try{const F=r.replaceAll(`\r
3
3
  `,`
4
- `);if(!w.includes(u))throw new Error(`Unsupported diagram type: ${u}`);const n=lu(r.diagramsDir);E.mkdirSync(n,{recursive:!0});const c=z(u,D,s,o,i),a=l.join(n,c),F=E.existsSync(a);let h=!1;if(F&&(h=E.readFileSync(a,"utf-8").includes("<!-- vpd-placeholder -->")),!F||h){q(n,u,s,c,D,o);const x=`<?xml version="1.0" encoding="UTF-8"?>
4
+ `);if(!y.includes(n))throw new Error(`Unsupported diagram type: ${n}`);const h=X(u.diagramsDir);E.mkdirSync(h,{recursive:!0});const m=z(n,F,D,o,c),f=d.join(h,m);!E.existsSync(f)&&!t.some(B=>B.filepath===f)&&t.push(a(n,h,F,m,f,D,o));const p=u.publicPath??"/diagrams";return`<figure
5
+ class="vpd-diagram vpd-diagram--${n}"
6
+ onclick="
7
+ const figure = this;
8
+ const isFullscreen = figure.classList.contains('vpd-diagram--fullscreen');
9
+
10
+ document.querySelectorAll('.vpd-diagram').forEach(diagram => {
11
+ diagram.classList.remove('vpd-diagram--fullscreen');
12
+ });
13
+
14
+ if (!isFullscreen) {
15
+ figure.classList.add('vpd-diagram--fullscreen');
16
+ }
17
+ "
18
+ >
19
+ <img
20
+ :src="\`${p}/${m}\`"
21
+ alt="${n} Diagram"
22
+ class="vpd-diagram-image"
23
+ />
24
+ ${i?`<figcaption class="vpd-diagram-caption">
25
+ ${i}
26
+ </figcaption>`:""}
27
+ </figure>`}catch(F){const h=F instanceof Error?F.message:String(F);return console.error(`Error converting ${n} diagram:`,h),`<div class="diagram-error">Error converting diagram: ${h}</div>`}}function a(r,n,i,D,o,c,F){const h=u.krokiServerUrl??"https://kroki.io",m=u.diagramsDistDir;return{filepath:o,getDiagram:async()=>{const f=await fetch(`${h}/${r}`,{method:"POST",headers:{Accept:"image/svg+xml","Content-Type":"text/plain"},body:i});if(!f.ok)throw new Error(`Kroki returned ${f.status} for ${r} diagram (${o}): ${await f.text()}`);const g=await f.text();if(j(n,r,c,D,i,F),E.writeFileSync(o,g),console.log(`✓ Generated diagram: ${o}`),m)return{type:"asset",fileName:`${m}/${D}`,source:g}}}}function l(){return{name:"vitepress-build-time-diagrams",configureServer(r){r.middlewares.use(async(n,i,D)=>{const o=t.splice(0);o.length>0&&await Promise.all(o.map(c=>c.getDiagram())),D()})},async generateBundle(){const r=t.splice(0);r.length!==0&&(console.log(`
28
+ Generating ${r.length} diagram(s) at build time...`),await Promise.all(r.map(async n=>{const i=await n.getDiagram();i&&this.emitFile(i)})),console.log(`✓ All diagrams generated successfully.
29
+ `))}}}return{configureMarkdown:e,vitePlugin:l}}function V(u,t,e,s,a={},l,r){try{const n=u.replaceAll(`\r
30
+ `,`
31
+ `);if(!y.includes(t))throw new Error(`Unsupported diagram type: ${t}`);const i=X(a.diagramsDir);E.mkdirSync(i,{recursive:!0});const D=z(t,n,s,l,r),o=d.join(i,D),c=E.existsSync(o);let F=!1;if(c&&(F=E.readFileSync(o,"utf-8").includes("<!-- vpd-placeholder -->")),!c||F){j(i,t,s,D,n,l);const f=`<?xml version="1.0" encoding="UTF-8"?>
5
32
  <svg width="100%" height="120" xmlns="http://www.w3.org/2000/svg">
6
33
  <!-- vpd-placeholder -->
7
34
  <rect width="100%" height="120" fill="#f5f5f5"/>
8
35
  <text x="50%" y="45%" font-family="system-ui" font-size="14" fill="#666" text-anchor="middle" dominant-baseline="middle">
9
- Generating ${u} diagram...
36
+ Generating ${t} diagram...
10
37
  </text>
11
38
  <text x="50%" y="65%" font-family="system-ui" font-size="14" fill="#666" text-anchor="middle" dominant-baseline="middle">
12
39
  Refresh the page.
13
40
  </text>
14
- </svg>`;E.writeFileSync(a,x);const y=r.krokiServerUrl??"https://kroki.io";fetch(`${y}/${u}`,{method:"POST",headers:{Accept:"image/svg+xml","Content-Type":"text/plain"},body:D}).then(p=>p.text()).then(p=>(E.writeFileSync(a,p),p))}const g=r.publicPath??"/diagrams";return`<figure
15
- class="vpd-diagram vpd-diagram--${u}"
41
+ </svg>`;E.writeFileSync(o,f);const g=a.krokiServerUrl??"https://kroki.io";fetch(`${g}/${t}`,{method:"POST",headers:{Accept:"image/svg+xml","Content-Type":"text/plain"},body:n}).then(p=>p.text()).then(p=>(E.writeFileSync(o,p),p))}const m=a.publicPath??"/diagrams";return`<figure
42
+ class="vpd-diagram vpd-diagram--${t}"
16
43
  onclick="
17
44
  const figure = this;
18
45
  const isFullscreen = figure.classList.contains('vpd-diagram--fullscreen');
@@ -27,11 +54,11 @@
27
54
  "
28
55
  >
29
56
  <img
30
- :src="\`${g}/${c}\`"
31
- alt="${u} Diagram"
57
+ :src="\`${m}/${D}\`"
58
+ alt="${t} Diagram"
32
59
  class="vpd-diagram-image"
33
60
  />
34
61
  ${e?`<figcaption class="vpd-diagram-caption">
35
62
  ${e}
36
63
  </figcaption>`:""}
37
- </figure>`}catch(D){const n=D instanceof Error?D.message:String(D);return console.error(`Error converting ${u} diagram:`,n),`<div class="diagram-error">Error converting diagram: ${n}</div>`}}function Eu(t,u={}){const e=t.renderer.rules.fence;t.renderer.rules.fence=(s,r,o,i,D)=>{const n=s[r],c=n.info.trim().toLowerCase(),a=u.excludedDiagramTypes??[],F=w.includes(c),h=a.includes(c);if(F&&!h){let C=n.content.trim();const{caption:g,id:x}=Fu(s,r),y=u.enableFileImports??!0;let p;if(y&&j(C))try{const A=R(C);if(A){const B=(i==null?void 0:i.path)||"";if(!B)return'<div class="diagram-error">Cannot resolve file import: markdown file path is not available</div>';const b=O(A,B),H=u.allowedImportDirs;if(!G(b,H))return`<div class="diagram-error">File import not allowed: ${A}. Path is outside allowed directories.</div>`;const $=T(b);C=$.content,p=$.mtime}}catch(A){const B=A instanceof Error?A.message:String(A);return`<div class="diagram-error">Error loading diagram file in ${(i==null?void 0:i.path)||"unknown"}: ${B}</div>`}const N=(i==null?void 0:i.path)||"unknown",Z=`${l.basename(N,".md")}-${r}`;return U(C,c,g,x,u,Z,p)}return e(s,r,o,i,D)}}exports.SUPPORTED_DIAGRAM_TYPES=w;exports.configureDiagramsPlugin=Eu;exports.diagramToSvg=U;exports.generateUniqueFilename=z;exports.hasDangerousExtension=W;exports.isFileImportSyntax=j;exports.parseFileImportPath=R;exports.readFileImport=T;exports.removeOldDiagramFiles=q;exports.resolveFileImportPath=O;exports.validateFileImportPath=G;
64
+ </figure>`}catch(n){const i=n instanceof Error?n.message:String(n);return console.error(`Error converting ${t} diagram:`,i),`<div class="diagram-error">Error converting diagram: ${i}</div>`}}function gt(u,t={}){const e=u.renderer.rules.fence;u.renderer.rules.fence=(s,a,l,r,n)=>{const i=s[a],D=i.info.trim().toLowerCase(),o=t.excludedDiagramTypes??[],c=y.includes(D),F=o.includes(D);if(c&&!F){let h=i.content.trim();const{caption:m,id:f}=K(s,a),g=t.enableFileImports??!0;let p;if(g&&R(h))try{const A=W(h);if(A){const w=(r==null?void 0:r.path)||"";if(!w)return'<div class="diagram-error">Cannot resolve file import: markdown file path is not available</div>';const S=U(A,w),L=t.allowedImportDirs;if(!G(S,L))return`<div class="diagram-error">File import not allowed: ${A}. Path is outside allowed directories.</div>`;const $=O(S);h=$.content,p=$.mtime}}catch(A){const w=A instanceof Error?A.message:String(A);return`<div class="diagram-error">Error loading diagram file in ${(r==null?void 0:r.path)||"unknown"}: ${w}</div>`}const B=(r==null?void 0:r.path)||"unknown",I=`${d.basename(B,".md")}-${a}`;return V(h,D,m,f,t,I,p)}return e(s,a,l,r,n)}}exports.SUPPORTED_DIAGRAM_TYPES=y;exports.configureDiagramsPlugin=gt;exports.createBuildTimeDiagramsPlugin=Ct;exports.diagramToSvg=V;exports.generateUniqueFilename=z;exports.hasDangerousExtension=Q;exports.isFileImportSyntax=R;exports.parseFileImportPath=W;exports.readFileImport=O;exports.removeOldDiagramFiles=j;exports.resolveFileImportPath=U;exports.validateFileImportPath=G;
package/dist/index.d.ts CHANGED
@@ -19,5 +19,6 @@ export declare function diagramToSvg(diagram: string, diagramType: string, capti
19
19
  */
20
20
  export declare function configureDiagramsPlugin(md: MarkdownRenderer, diagramsPluginOptions?: DiagramPluginOptions): void;
21
21
  export { SUPPORTED_DIAGRAM_TYPES } from "./constants";
22
- export type { DiagramMetadata, DiagramPluginOptions } from "./types";
22
+ export type { DiagramMetadata, DiagramPluginOptions, BuildTimeDiagramPluginOptions } from "./types";
23
23
  export { generateUniqueFilename, removeOldDiagramFiles, isFileImportSyntax, parseFileImportPath, resolveFileImportPath, validateFileImportPath, readFileImport, hasDangerousExtension, type FileImportResult, } from "./utils";
24
+ export { createBuildTimeDiagramsPlugin } from "./build-time";
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as E from "node:fs";
2
- import * as l from "node:path";
3
- import * as P from "node:crypto";
4
- import * as m from "node:process";
5
- const M = [
2
+ import * as d from "node:path";
3
+ import * as G from "node:crypto";
4
+ import * as v from "node:process";
5
+ const b = [
6
6
  "blockdiag",
7
7
  "bpmn",
8
8
  "bytefield",
@@ -31,19 +31,19 @@ const M = [
31
31
  "vega-lite",
32
32
  "wavedrom",
33
33
  "wireviz"
34
- ], R = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/, q = /[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/;
35
- function k(t) {
36
- switch (t) {
34
+ ], Q = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/, V = /[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/;
35
+ function P(u) {
36
+ switch (u) {
37
37
  case 9:
38
38
  case 32:
39
39
  return !0;
40
40
  }
41
41
  return !1;
42
42
  }
43
- function b(t) {
44
- if (t >= 8192 && t <= 8202)
43
+ function W(u) {
44
+ if (u >= 8192 && u <= 8202)
45
45
  return !0;
46
- switch (t) {
46
+ switch (u) {
47
47
  case 9:
48
48
  // \t
49
49
  case 10:
@@ -64,11 +64,11 @@ function b(t) {
64
64
  }
65
65
  return !1;
66
66
  }
67
- function $(t) {
68
- return R.test(t) || q.test(t);
67
+ function R(u) {
68
+ return Q.test(u) || V.test(u);
69
69
  }
70
- function _(t) {
71
- switch (t) {
70
+ function q(u) {
71
+ switch (u) {
72
72
  case 33:
73
73
  case 34:
74
74
  case 35:
@@ -106,118 +106,118 @@ function _(t) {
106
106
  return !1;
107
107
  }
108
108
  }
109
- function C(t, u, e) {
110
- this.type = t, this.tag = u, this.attrs = null, this.map = null, this.nesting = e, this.level = 0, this.children = null, this.content = "", this.markup = "", this.info = "", this.meta = null, this.block = !1, this.hidden = !1;
109
+ function p(u, t, e) {
110
+ this.type = u, this.tag = t, this.attrs = null, this.map = null, this.nesting = e, this.level = 0, this.children = null, this.content = "", this.markup = "", this.info = "", this.meta = null, this.block = !1, this.hidden = !1;
111
111
  }
112
- C.prototype.attrIndex = function(u) {
112
+ p.prototype.attrIndex = function(t) {
113
113
  if (!this.attrs)
114
114
  return -1;
115
115
  const e = this.attrs;
116
- for (let s = 0, r = e.length; s < r; s++)
117
- if (e[s][0] === u)
116
+ for (let s = 0, a = e.length; s < a; s++)
117
+ if (e[s][0] === t)
118
118
  return s;
119
119
  return -1;
120
120
  };
121
- C.prototype.attrPush = function(u) {
122
- this.attrs ? this.attrs.push(u) : this.attrs = [u];
121
+ p.prototype.attrPush = function(t) {
122
+ this.attrs ? this.attrs.push(t) : this.attrs = [t];
123
123
  };
124
- C.prototype.attrSet = function(u, e) {
125
- const s = this.attrIndex(u), r = [u, e];
126
- s < 0 ? this.attrPush(r) : this.attrs[s] = r;
124
+ p.prototype.attrSet = function(t, e) {
125
+ const s = this.attrIndex(t), a = [t, e];
126
+ s < 0 ? this.attrPush(a) : this.attrs[s] = a;
127
127
  };
128
- C.prototype.attrGet = function(u) {
129
- const e = this.attrIndex(u);
128
+ p.prototype.attrGet = function(t) {
129
+ const e = this.attrIndex(t);
130
130
  let s = null;
131
131
  return e >= 0 && (s = this.attrs[e][1]), s;
132
132
  };
133
- C.prototype.attrJoin = function(u, e) {
134
- const s = this.attrIndex(u);
135
- s < 0 ? this.attrPush([u, e]) : this.attrs[s][1] = this.attrs[s][1] + " " + e;
133
+ p.prototype.attrJoin = function(t, e) {
134
+ const s = this.attrIndex(t);
135
+ s < 0 ? this.attrPush([t, e]) : this.attrs[s][1] = this.attrs[s][1] + " " + e;
136
136
  };
137
- function G(t, u, e) {
138
- this.src = t, this.env = e, this.tokens = [], this.inlineMode = !1, this.md = u;
137
+ function tt(u, t, e) {
138
+ this.src = u, this.env = e, this.tokens = [], this.inlineMode = !1, this.md = t;
139
139
  }
140
- G.prototype.Token = C;
141
- function d(t, u, e, s) {
142
- this.src = t, this.md = u, this.env = e, this.tokens = s, this.bMarks = [], this.eMarks = [], this.tShift = [], this.sCount = [], this.bsCount = [], this.blkIndent = 0, this.line = 0, this.lineMax = 0, this.tight = !1, this.ddIndent = -1, this.listIndent = -1, this.parentType = "root", this.level = 0;
143
- const r = this.src;
144
- for (let D = 0, i = 0, o = 0, n = 0, c = r.length, a = !1; i < c; i++) {
145
- const F = r.charCodeAt(i);
146
- if (!a)
147
- if (k(F)) {
148
- o++, F === 9 ? n += 4 - n % 4 : n++;
140
+ tt.prototype.Token = p;
141
+ function x(u, t, e, s) {
142
+ this.src = u, this.md = t, this.env = e, this.tokens = s, this.bMarks = [], this.eMarks = [], this.tShift = [], this.sCount = [], this.bsCount = [], this.blkIndent = 0, this.line = 0, this.lineMax = 0, this.tight = !1, this.ddIndent = -1, this.listIndent = -1, this.parentType = "root", this.level = 0;
143
+ const a = this.src;
144
+ for (let D = 0, r = 0, n = 0, i = 0, l = a.length, o = !1; r < l; r++) {
145
+ const c = a.charCodeAt(r);
146
+ if (!o)
147
+ if (P(c)) {
148
+ n++, c === 9 ? i += 4 - i % 4 : i++;
149
149
  continue;
150
150
  } else
151
- a = !0;
152
- (F === 10 || i === c - 1) && (F !== 10 && i++, this.bMarks.push(D), this.eMarks.push(i), this.tShift.push(o), this.sCount.push(n), this.bsCount.push(0), a = !1, o = 0, n = 0, D = i + 1);
151
+ o = !0;
152
+ (c === 10 || r === l - 1) && (c !== 10 && r++, this.bMarks.push(D), this.eMarks.push(r), this.tShift.push(n), this.sCount.push(i), this.bsCount.push(0), o = !1, n = 0, i = 0, D = r + 1);
153
153
  }
154
- this.bMarks.push(r.length), this.eMarks.push(r.length), this.tShift.push(0), this.sCount.push(0), this.bsCount.push(0), this.lineMax = this.bMarks.length - 1;
154
+ this.bMarks.push(a.length), this.eMarks.push(a.length), this.tShift.push(0), this.sCount.push(0), this.bsCount.push(0), this.lineMax = this.bMarks.length - 1;
155
155
  }
156
- d.prototype.push = function(t, u, e) {
157
- const s = new C(t, u, e);
156
+ x.prototype.push = function(u, t, e) {
157
+ const s = new p(u, t, e);
158
158
  return s.block = !0, e < 0 && this.level--, s.level = this.level, e > 0 && this.level++, this.tokens.push(s), s;
159
159
  };
160
- d.prototype.isEmpty = function(u) {
161
- return this.bMarks[u] + this.tShift[u] >= this.eMarks[u];
160
+ x.prototype.isEmpty = function(t) {
161
+ return this.bMarks[t] + this.tShift[t] >= this.eMarks[t];
162
162
  };
163
- d.prototype.skipEmptyLines = function(u) {
164
- for (let e = this.lineMax; u < e && !(this.bMarks[u] + this.tShift[u] < this.eMarks[u]); u++)
163
+ x.prototype.skipEmptyLines = function(t) {
164
+ for (let e = this.lineMax; t < e && !(this.bMarks[t] + this.tShift[t] < this.eMarks[t]); t++)
165
165
  ;
166
- return u;
166
+ return t;
167
167
  };
168
- d.prototype.skipSpaces = function(u) {
169
- for (let e = this.src.length; u < e; u++) {
170
- const s = this.src.charCodeAt(u);
171
- if (!k(s))
168
+ x.prototype.skipSpaces = function(t) {
169
+ for (let e = this.src.length; t < e; t++) {
170
+ const s = this.src.charCodeAt(t);
171
+ if (!P(s))
172
172
  break;
173
173
  }
174
- return u;
174
+ return t;
175
175
  };
176
- d.prototype.skipSpacesBack = function(u, e) {
177
- if (u <= e)
178
- return u;
179
- for (; u > e; )
180
- if (!k(this.src.charCodeAt(--u)))
181
- return u + 1;
182
- return u;
176
+ x.prototype.skipSpacesBack = function(t, e) {
177
+ if (t <= e)
178
+ return t;
179
+ for (; t > e; )
180
+ if (!P(this.src.charCodeAt(--t)))
181
+ return t + 1;
182
+ return t;
183
183
  };
184
- d.prototype.skipChars = function(u, e) {
185
- for (let s = this.src.length; u < s && this.src.charCodeAt(u) === e; u++)
184
+ x.prototype.skipChars = function(t, e) {
185
+ for (let s = this.src.length; t < s && this.src.charCodeAt(t) === e; t++)
186
186
  ;
187
- return u;
187
+ return t;
188
188
  };
189
- d.prototype.skipCharsBack = function(u, e, s) {
190
- if (u <= s)
191
- return u;
192
- for (; u > s; )
193
- if (e !== this.src.charCodeAt(--u))
194
- return u + 1;
195
- return u;
189
+ x.prototype.skipCharsBack = function(t, e, s) {
190
+ if (t <= s)
191
+ return t;
192
+ for (; t > s; )
193
+ if (e !== this.src.charCodeAt(--t))
194
+ return t + 1;
195
+ return t;
196
196
  };
197
- d.prototype.getLines = function(u, e, s, r) {
198
- if (u >= e)
197
+ x.prototype.getLines = function(t, e, s, a) {
198
+ if (t >= e)
199
199
  return "";
200
- const D = new Array(e - u);
201
- for (let i = 0, o = u; o < e; o++, i++) {
202
- let n = 0;
203
- const c = this.bMarks[o];
204
- let a = c, F;
205
- for (o + 1 < e || r ? F = this.eMarks[o] + 1 : F = this.eMarks[o]; a < F && n < s; ) {
206
- const h = this.src.charCodeAt(a);
207
- if (k(h))
208
- h === 9 ? n += 4 - (n + this.bsCount[o]) % 4 : n++;
209
- else if (a - c < this.tShift[o])
210
- n++;
200
+ const D = new Array(e - t);
201
+ for (let r = 0, n = t; n < e; n++, r++) {
202
+ let i = 0;
203
+ const l = this.bMarks[n];
204
+ let o = l, c;
205
+ for (n + 1 < e || a ? c = this.eMarks[n] + 1 : c = this.eMarks[n]; o < c && i < s; ) {
206
+ const F = this.src.charCodeAt(o);
207
+ if (P(F))
208
+ F === 9 ? i += 4 - (i + this.bsCount[n]) % 4 : i++;
209
+ else if (o - l < this.tShift[n])
210
+ i++;
211
211
  else
212
212
  break;
213
- a++;
213
+ o++;
214
214
  }
215
- n > s ? D[i] = new Array(n - s + 1).join(" ") + this.src.slice(a, F) : D[i] = this.src.slice(a, F);
215
+ i > s ? D[r] = new Array(i - s + 1).join(" ") + this.src.slice(o, c) : D[r] = this.src.slice(o, c);
216
216
  }
217
217
  return D.join("");
218
218
  };
219
- d.prototype.Token = C;
220
- const j = [
219
+ x.prototype.Token = p;
220
+ const ut = [
221
221
  "address",
222
222
  "article",
223
223
  "aside",
@@ -280,91 +280,91 @@ const j = [
280
280
  "tr",
281
281
  "track",
282
282
  "ul"
283
- ], N = "[a-zA-Z_:][a-zA-Z0-9:._-]*", U = "[^\"'=<>`\\x00-\\x20]+", Z = "'[^']*'", H = '"[^"]*"', T = "(?:" + U + "|" + Z + "|" + H + ")", J = "(?:\\s+" + N + "(?:\\s*=\\s*" + T + ")?)", O = "<[A-Za-z][A-Za-z0-9\\-]*" + J + "*\\s*\\/?>", X = "<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>", Y = new RegExp("^(?:" + O + "|" + X + ")");
284
- new RegExp("^</?(" + j.join("|") + ")(?=(\\s|/?>|$))", "i"), new RegExp(Y.source + "\\s*$");
285
- function v(t, u, e, s) {
286
- this.src = t, this.env = e, this.md = u, this.tokens = s, this.tokens_meta = Array(s.length), this.pos = 0, this.posMax = this.src.length, this.level = 0, this.pending = "", this.pendingLevel = 0, this.cache = {}, this.delimiters = [], this._prev_delimiters = [], this.backticks = {}, this.backticksScanned = !1, this.linkLevel = 0;
283
+ ], et = "[a-zA-Z_:][a-zA-Z0-9:._-]*", st = "[^\"'=<>`\\x00-\\x20]+", rt = "'[^']*'", it = '"[^"]*"', nt = "(?:" + st + "|" + rt + "|" + it + ")", at = "(?:\\s+" + et + "(?:\\s*=\\s*" + nt + ")?)", ot = "<[A-Za-z][A-Za-z0-9\\-]*" + at + "*\\s*\\/?>", ct = "<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>", Dt = new RegExp("^(?:" + ot + "|" + ct + ")");
284
+ new RegExp("^</?(" + ut.join("|") + ")(?=(\\s|/?>|$))", "i"), new RegExp(Dt.source + "\\s*$");
285
+ function _(u, t, e, s) {
286
+ this.src = u, this.env = e, this.md = t, this.tokens = s, this.tokens_meta = Array(s.length), this.pos = 0, this.posMax = this.src.length, this.level = 0, this.pending = "", this.pendingLevel = 0, this.cache = {}, this.delimiters = [], this._prev_delimiters = [], this.backticks = {}, this.backticksScanned = !1, this.linkLevel = 0;
287
287
  }
288
- v.prototype.pushPending = function() {
289
- const t = new C("text", "", 0);
290
- return t.content = this.pending, t.level = this.pendingLevel, this.tokens.push(t), this.pending = "", t;
288
+ _.prototype.pushPending = function() {
289
+ const u = new p("text", "", 0);
290
+ return u.content = this.pending, u.level = this.pendingLevel, this.tokens.push(u), this.pending = "", u;
291
291
  };
292
- v.prototype.push = function(t, u, e) {
292
+ _.prototype.push = function(u, t, e) {
293
293
  this.pending && this.pushPending();
294
- const s = new C(t, u, e);
295
- let r = null;
296
- return e < 0 && (this.level--, this.delimiters = this._prev_delimiters.pop()), s.level = this.level, e > 0 && (this.level++, this._prev_delimiters.push(this.delimiters), this.delimiters = [], r = { delimiters: this.delimiters }), this.pendingLevel = this.level, this.tokens.push(s), this.tokens_meta.push(r), s;
294
+ const s = new p(u, t, e);
295
+ let a = null;
296
+ return e < 0 && (this.level--, this.delimiters = this._prev_delimiters.pop()), s.level = this.level, e > 0 && (this.level++, this._prev_delimiters.push(this.delimiters), this.delimiters = [], a = { delimiters: this.delimiters }), this.pendingLevel = this.level, this.tokens.push(s), this.tokens_meta.push(a), s;
297
297
  };
298
- v.prototype.scanDelims = function(t, u) {
299
- const e = this.posMax, s = this.src.charCodeAt(t), r = t > 0 ? this.src.charCodeAt(t - 1) : 32;
300
- let D = t;
298
+ _.prototype.scanDelims = function(u, t) {
299
+ const e = this.posMax, s = this.src.charCodeAt(u), a = u > 0 ? this.src.charCodeAt(u - 1) : 32;
300
+ let D = u;
301
301
  for (; D < e && this.src.charCodeAt(D) === s; )
302
302
  D++;
303
- const i = D - t, o = D < e ? this.src.charCodeAt(D) : 32, n = _(r) || $(String.fromCharCode(r)), c = _(o) || $(String.fromCharCode(o)), a = b(r), F = b(o), h = !F && (!c || a || n), f = !a && (!n || F || c);
304
- return { can_open: h && (u || !f || n), can_close: f && (u || !h || c), length: i };
303
+ const r = D - u, n = D < e ? this.src.charCodeAt(D) : 32, i = q(a) || R(String.fromCharCode(a)), l = q(n) || R(String.fromCharCode(n)), o = W(a), c = W(n), F = !c && (!l || o || i), h = !o && (!i || c || l);
304
+ return { can_open: F && (t || !h || i), can_close: h && (t || !F || l), length: r };
305
305
  };
306
- v.prototype.Token = C;
307
- const I = [];
308
- for (let t = 0; t < 256; t++)
309
- I.push(0);
310
- "\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(t) {
311
- I[t.charCodeAt(0)] = 1;
306
+ _.prototype.Token = p;
307
+ const U = [];
308
+ for (let u = 0; u < 256; u++)
309
+ U.push(0);
310
+ "\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(u) {
311
+ U[u.charCodeAt(0)] = 1;
312
312
  });
313
- function K(t, u) {
314
- var s, r;
315
- const e = t[u + 1];
313
+ function j(u, t) {
314
+ var s, a;
315
+ const e = u[t + 1];
316
316
  if (e && e.type === "html_block") {
317
317
  const D = e.content.match(
318
318
  /<!--\s*diagram(?:\s+id="([^"]+)")?/
319
- ), i = e.content.match(/\s+caption="([^"]+)"/);
319
+ ), r = e.content.match(/\s+caption="([^"]+)"/);
320
320
  return {
321
321
  id: (s = D == null ? void 0 : D[1]) == null ? void 0 : s.trim(),
322
- caption: ((r = i == null ? void 0 : i[1]) == null ? void 0 : r.trim()) || ""
322
+ caption: ((a = r == null ? void 0 : r[1]) == null ? void 0 : a.trim()) || ""
323
323
  };
324
324
  }
325
325
  return { caption: "", id: void 0 };
326
326
  }
327
- function Q(t, u, e, s, r) {
328
- const D = r !== void 0 ? `${u}${r}` : u, i = P.createHash("md5").update(D).digest("hex");
329
- return e ? `${t}-${e}-${i}.svg` : s ? `${t}-${s}-${i}.svg` : `${t}-${i}.svg`;
327
+ function N(u, t, e, s, a) {
328
+ const D = a !== void 0 ? `${t}${a}` : t, r = G.createHash("md5").update(D).digest("hex");
329
+ return e ? `${u}-${e}-${r}.svg` : s ? `${u}-${s}-${r}.svg` : `${u}-${r}.svg`;
330
330
  }
331
- function V(t) {
331
+ function Z(u) {
332
332
  var e;
333
- const u = ((e = m == null ? void 0 : m.cwd) == null ? void 0 : e.call(m)) || m.env.PWD || m.env.INIT_CWD || ".";
334
- return t ? l.resolve(u, t) : l.resolve(u, "docs/public/diagrams");
333
+ const t = ((e = v == null ? void 0 : v.cwd) == null ? void 0 : e.call(v)) || v.env.PWD || v.env.INIT_CWD || ".";
334
+ return u ? d.resolve(t, u) : d.resolve(t, "docs/public/diagrams");
335
335
  }
336
- function uu(t, u, e, s, r, D) {
336
+ function H(u, t, e, s, a, D) {
337
337
  try {
338
- const i = E.readdirSync(t);
339
- let o = [];
338
+ const r = E.readdirSync(u);
339
+ let n = [];
340
340
  if (e)
341
- o = i.filter(
342
- (n) => n.startsWith(`${u}-${e}-`) && n !== s
341
+ n = r.filter(
342
+ (i) => i.startsWith(`${t}-${e}-`) && i !== s
343
343
  );
344
344
  else if (D)
345
- o = i.filter(
346
- (n) => n.startsWith(`${u}-${D}-`) && n !== s
345
+ n = r.filter(
346
+ (i) => i.startsWith(`${t}-${D}-`) && i !== s
347
347
  );
348
- else if (r) {
349
- const n = P.createHash("md5").update(r).digest("hex"), c = `${u}-${n}.svg`;
350
- o = i.filter(
351
- (a) => {
352
- if (!a.startsWith(`${u}-`) || !a.endsWith(".svg") || a === s || a === c)
348
+ else if (a) {
349
+ const i = G.createHash("md5").update(a).digest("hex"), l = `${t}-${i}.svg`;
350
+ n = r.filter(
351
+ (o) => {
352
+ if (!o.startsWith(`${t}-`) || !o.endsWith(".svg") || o === s || o === l)
353
353
  return !1;
354
- const h = a.slice(0, -4).split("-");
355
- return h.length === 2 && h[0] === u;
354
+ const F = o.slice(0, -4).split("-");
355
+ return F.length === 2 && F[0] === t;
356
356
  }
357
357
  );
358
358
  }
359
- o.forEach((n) => {
360
- const c = l.join(t, n);
361
- E.existsSync(c) && (E.unlinkSync(c), console.log(`Removed old diagram file: ${n}`));
359
+ n.forEach((i) => {
360
+ const l = d.join(u, i);
361
+ E.existsSync(l) && (E.unlinkSync(l), console.log(`Removed old diagram file: ${i}`));
362
362
  });
363
- } catch (i) {
364
- console.warn(`Failed to remove old diagram files: ${i}`);
363
+ } catch (r) {
364
+ console.warn(`Failed to remove old diagram files: ${r}`);
365
365
  }
366
366
  }
367
- const tu = [
367
+ const lt = [
368
368
  ".exe",
369
369
  ".bat",
370
370
  ".cmd",
@@ -392,115 +392,275 @@ const tu = [
392
392
  ".reg",
393
393
  ".lnk"
394
394
  ];
395
- function eu(t) {
396
- const u = l.extname(t).toLowerCase();
397
- return tu.includes(u);
395
+ function Ft(u) {
396
+ const t = d.extname(u).toLowerCase();
397
+ return lt.includes(t);
398
398
  }
399
- function su(t) {
400
- return t.trim().startsWith("@file:");
399
+ function O(u) {
400
+ return u.trim().startsWith("@file:");
401
401
  }
402
- function ru(t) {
403
- const u = t.trim();
404
- return u.startsWith("@file:") && u.split(`
402
+ function T(u) {
403
+ const t = u.trim();
404
+ return t.startsWith("@file:") && t.split(`
405
405
  `)[0].slice(6).trim() || null;
406
406
  }
407
- function iu(t, u) {
408
- if (t.startsWith("/"))
409
- return t;
410
- const e = l.dirname(u);
411
- return l.resolve(e, t);
407
+ function J(u, t) {
408
+ if (u.startsWith("/"))
409
+ return u;
410
+ const e = d.dirname(t);
411
+ return d.resolve(e, u);
412
412
  }
413
- function nu(t, u) {
414
- if (!u || u.length === 0)
413
+ function K(u, t) {
414
+ if (!t || t.length === 0)
415
415
  return !0;
416
416
  try {
417
- const e = E.realpathSync(l.resolve(t));
418
- for (const s of u) {
419
- const r = l.resolve(s), D = E.realpathSync(r);
420
- if (e.startsWith(D + l.sep) || e === D)
417
+ const e = E.realpathSync(d.resolve(u));
418
+ for (const s of t) {
419
+ const a = d.resolve(s), D = E.realpathSync(a);
420
+ if (e.startsWith(D + d.sep) || e === D)
421
421
  return !0;
422
422
  }
423
423
  } catch {
424
- const s = l.resolve(t);
425
- for (const r of u) {
426
- const D = l.resolve(r);
427
- if (s.startsWith(D + l.sep) || s === D)
424
+ const s = d.resolve(u);
425
+ for (const a of t) {
426
+ const D = d.resolve(a);
427
+ if (s.startsWith(D + d.sep) || s === D)
428
428
  return !0;
429
429
  }
430
430
  }
431
431
  return !1;
432
432
  }
433
- function Du(t) {
433
+ function X(u) {
434
434
  try {
435
- if (eu(t))
436
- throw new Error(`File extension not allowed: ${l.extname(t)}`);
437
- const u = E.statSync(t);
438
- if (!u.isFile())
439
- throw new Error(`Path is not a file: ${t}`);
440
- const e = E.realpathSync(t);
435
+ if (Ft(u))
436
+ throw new Error(`File extension not allowed: ${d.extname(u)}`);
437
+ const t = E.statSync(u);
438
+ if (!t.isFile())
439
+ throw new Error(`Path is not a file: ${u}`);
440
+ const e = E.realpathSync(u);
441
441
  return {
442
442
  content: E.readFileSync(e, "utf-8"),
443
443
  filePath: e,
444
- mtime: u.mtimeMs
444
+ mtime: t.mtimeMs
445
445
  };
446
- } catch (u) {
447
- const e = u instanceof Error ? u.message : String(u);
446
+ } catch (t) {
447
+ const e = t instanceof Error ? t.message : String(t);
448
448
  throw new Error(`Failed to read file import: ${e}`);
449
449
  }
450
450
  }
451
- function ou(t, u, e, s, r = {}, D, i) {
451
+ function dt(u = {}) {
452
+ const t = [];
453
+ function e(r) {
454
+ const n = r.renderer.rules.fence;
455
+ r.renderer.rules.fence = (i, l, o, c, F) => {
456
+ const h = i[l], m = h.info.trim().toLowerCase(), f = u.excludedDiagramTypes ?? [], A = b.includes(m), C = f.includes(m);
457
+ if (A && !C) {
458
+ let B = h.content.trim();
459
+ const { caption: M, id: g } = j(i, l), w = u.enableFileImports ?? !0;
460
+ let $;
461
+ if (w && O(B))
462
+ try {
463
+ const k = T(B);
464
+ if (k) {
465
+ const y = (c == null ? void 0 : c.path) || "";
466
+ if (!y)
467
+ return '<div class="diagram-error">Cannot resolve file import: markdown file path is not available</div>';
468
+ const I = J(k, y), Y = u.allowedImportDirs;
469
+ if (!K(I, Y))
470
+ return `<div class="diagram-error">File import not allowed: ${k}. Path is outside allowed directories.</div>`;
471
+ const z = X(I);
472
+ B = z.content, $ = z.mtime;
473
+ }
474
+ } catch (k) {
475
+ const y = k instanceof Error ? k.message : String(k);
476
+ return `<div class="diagram-error">Error loading diagram file in ${(c == null ? void 0 : c.path) || "unknown"}: ${y}</div>`;
477
+ }
478
+ const L = (c == null ? void 0 : c.path) || "unknown", S = `${d.basename(L, ".md")}-${l}`;
479
+ return s(
480
+ B,
481
+ m,
482
+ M,
483
+ g,
484
+ S,
485
+ $
486
+ );
487
+ }
488
+ return n(i, l, o, c, F);
489
+ };
490
+ }
491
+ function s(r, n, i, l, o, c) {
492
+ try {
493
+ const F = r.replaceAll(`\r
494
+ `, `
495
+ `);
496
+ if (!b.includes(n))
497
+ throw new Error(`Unsupported diagram type: ${n}`);
498
+ const h = Z(u.diagramsDir);
499
+ E.mkdirSync(h, { recursive: !0 });
500
+ const m = N(
501
+ n,
502
+ F,
503
+ l,
504
+ o,
505
+ c
506
+ ), f = d.join(h, m);
507
+ !E.existsSync(f) && !t.some((B) => B.filepath === f) && t.push(
508
+ a(
509
+ n,
510
+ h,
511
+ F,
512
+ m,
513
+ f,
514
+ l,
515
+ o
516
+ )
517
+ );
518
+ const C = u.publicPath ?? "/diagrams";
519
+ return `<figure
520
+ class="vpd-diagram vpd-diagram--${n}"
521
+ onclick="
522
+ const figure = this;
523
+ const isFullscreen = figure.classList.contains('vpd-diagram--fullscreen');
524
+
525
+ document.querySelectorAll('.vpd-diagram').forEach(diagram => {
526
+ diagram.classList.remove('vpd-diagram--fullscreen');
527
+ });
528
+
529
+ if (!isFullscreen) {
530
+ figure.classList.add('vpd-diagram--fullscreen');
531
+ }
532
+ "
533
+ >
534
+ <img
535
+ :src="\`${C}/${m}\`"
536
+ alt="${n} Diagram"
537
+ class="vpd-diagram-image"
538
+ />
539
+ ${i ? `<figcaption class="vpd-diagram-caption">
540
+ ${i}
541
+ </figcaption>` : ""}
542
+ </figure>`;
543
+ } catch (F) {
544
+ const h = F instanceof Error ? F.message : String(F);
545
+ return console.error(`Error converting ${n} diagram:`, h), `<div class="diagram-error">Error converting diagram: ${h}</div>`;
546
+ }
547
+ }
548
+ function a(r, n, i, l, o, c, F) {
549
+ const h = u.krokiServerUrl ?? "https://kroki.io", m = u.diagramsDistDir;
550
+ return {
551
+ filepath: o,
552
+ getDiagram: async () => {
553
+ const f = await fetch(`${h}/${r}`, {
554
+ method: "POST",
555
+ headers: {
556
+ Accept: "image/svg+xml",
557
+ "Content-Type": "text/plain"
558
+ },
559
+ body: i
560
+ });
561
+ if (!f.ok)
562
+ throw new Error(
563
+ `Kroki returned ${f.status} for ${r} diagram (${o}): ${await f.text()}`
564
+ );
565
+ const A = await f.text();
566
+ if (H(
567
+ n,
568
+ r,
569
+ c,
570
+ l,
571
+ i,
572
+ F
573
+ ), E.writeFileSync(o, A), console.log(`✓ Generated diagram: ${o}`), m)
574
+ return {
575
+ type: "asset",
576
+ fileName: `${m}/${l}`,
577
+ source: A
578
+ };
579
+ }
580
+ };
581
+ }
582
+ function D() {
583
+ return {
584
+ name: "vitepress-build-time-diagrams",
585
+ // Dev mode: generate diagrams before serving the page
586
+ configureServer(r) {
587
+ r.middlewares.use(async (n, i, l) => {
588
+ const o = t.splice(0);
589
+ o.length > 0 && await Promise.all(o.map((c) => c.getDiagram())), l();
590
+ });
591
+ },
592
+ // Build mode: generate all diagrams and emit assets
593
+ async generateBundle() {
594
+ const r = t.splice(0);
595
+ r.length !== 0 && (console.log(`
596
+ Generating ${r.length} diagram(s) at build time...`), await Promise.all(
597
+ r.map(async (n) => {
598
+ const i = await n.getDiagram();
599
+ i && this.emitFile(i);
600
+ })
601
+ ), console.log(`✓ All diagrams generated successfully.
602
+ `));
603
+ }
604
+ };
605
+ }
606
+ return {
607
+ configureMarkdown: e,
608
+ vitePlugin: D
609
+ };
610
+ }
611
+ function ht(u, t, e, s, a = {}, D, r) {
452
612
  try {
453
- const o = t.replaceAll(`\r
613
+ const n = u.replaceAll(`\r
454
614
  `, `
455
615
  `);
456
- if (!M.includes(u))
457
- throw new Error(`Unsupported diagram type: ${u}`);
458
- const n = V(
459
- r.diagramsDir
616
+ if (!b.includes(t))
617
+ throw new Error(`Unsupported diagram type: ${t}`);
618
+ const i = Z(
619
+ a.diagramsDir
460
620
  );
461
- E.mkdirSync(n, { recursive: !0 });
462
- const c = Q(
463
- u,
464
- o,
621
+ E.mkdirSync(i, { recursive: !0 });
622
+ const l = N(
623
+ t,
624
+ n,
465
625
  s,
466
626
  D,
467
- i
468
- ), a = l.join(n, c), F = E.existsSync(a);
469
- let h = !1;
470
- if (F && (h = E.readFileSync(a, "utf-8").includes("<!-- vpd-placeholder -->")), !F || h) {
471
- uu(
472
- n,
473
- u,
627
+ r
628
+ ), o = d.join(i, l), c = E.existsSync(o);
629
+ let F = !1;
630
+ if (c && (F = E.readFileSync(o, "utf-8").includes("<!-- vpd-placeholder -->")), !c || F) {
631
+ H(
632
+ i,
633
+ t,
474
634
  s,
475
- c,
476
- o,
635
+ l,
636
+ n,
477
637
  D
478
638
  );
479
- const x = `<?xml version="1.0" encoding="UTF-8"?>
639
+ const f = `<?xml version="1.0" encoding="UTF-8"?>
480
640
  <svg width="100%" height="120" xmlns="http://www.w3.org/2000/svg">
481
641
  <!-- vpd-placeholder -->
482
642
  <rect width="100%" height="120" fill="#f5f5f5"/>
483
643
  <text x="50%" y="45%" font-family="system-ui" font-size="14" fill="#666" text-anchor="middle" dominant-baseline="middle">
484
- Generating ${u} diagram...
644
+ Generating ${t} diagram...
485
645
  </text>
486
646
  <text x="50%" y="65%" font-family="system-ui" font-size="14" fill="#666" text-anchor="middle" dominant-baseline="middle">
487
647
  Refresh the page.
488
648
  </text>
489
649
  </svg>`;
490
- E.writeFileSync(a, x);
491
- const w = r.krokiServerUrl ?? "https://kroki.io";
492
- fetch(`${w}/${u}`, {
650
+ E.writeFileSync(o, f);
651
+ const A = a.krokiServerUrl ?? "https://kroki.io";
652
+ fetch(`${A}/${t}`, {
493
653
  method: "POST",
494
654
  headers: {
495
655
  Accept: "image/svg+xml",
496
656
  "Content-Type": "text/plain"
497
657
  },
498
- body: o
499
- }).then((A) => A.text()).then((A) => (E.writeFileSync(a, A), A));
658
+ body: n
659
+ }).then((C) => C.text()).then((C) => (E.writeFileSync(o, C), C));
500
660
  }
501
- const B = r.publicPath ?? "/diagrams";
661
+ const m = a.publicPath ?? "/diagrams";
502
662
  return `<figure
503
- class="vpd-diagram vpd-diagram--${u}"
663
+ class="vpd-diagram vpd-diagram--${t}"
504
664
  onclick="
505
665
  const figure = this;
506
666
  const isFullscreen = figure.classList.contains('vpd-diagram--fullscreen');
@@ -515,68 +675,69 @@ function ou(t, u, e, s, r = {}, D, i) {
515
675
  "
516
676
  >
517
677
  <img
518
- :src="\`${B}/${c}\`"
519
- alt="${u} Diagram"
678
+ :src="\`${m}/${l}\`"
679
+ alt="${t} Diagram"
520
680
  class="vpd-diagram-image"
521
681
  />
522
682
  ${e ? `<figcaption class="vpd-diagram-caption">
523
683
  ${e}
524
684
  </figcaption>` : ""}
525
685
  </figure>`;
526
- } catch (o) {
527
- const n = o instanceof Error ? o.message : String(o);
528
- return console.error(`Error converting ${u} diagram:`, n), `<div class="diagram-error">Error converting diagram: ${n}</div>`;
686
+ } catch (n) {
687
+ const i = n instanceof Error ? n.message : String(n);
688
+ return console.error(`Error converting ${t} diagram:`, i), `<div class="diagram-error">Error converting diagram: ${i}</div>`;
529
689
  }
530
690
  }
531
- function au(t, u = {}) {
532
- const e = t.renderer.rules.fence;
533
- t.renderer.rules.fence = (s, r, D, i, o) => {
534
- const n = s[r], c = n.info.trim().toLowerCase(), a = u.excludedDiagramTypes ?? [], F = M.includes(c), h = a.includes(c);
535
- if (F && !h) {
536
- let f = n.content.trim();
537
- const { caption: B, id: x } = K(s, r), w = u.enableFileImports ?? !0;
538
- let A;
539
- if (w && su(f))
691
+ function ft(u, t = {}) {
692
+ const e = u.renderer.rules.fence;
693
+ u.renderer.rules.fence = (s, a, D, r, n) => {
694
+ const i = s[a], l = i.info.trim().toLowerCase(), o = t.excludedDiagramTypes ?? [], c = b.includes(l), F = o.includes(l);
695
+ if (c && !F) {
696
+ let h = i.content.trim();
697
+ const { caption: m, id: f } = j(s, a), A = t.enableFileImports ?? !0;
698
+ let C;
699
+ if (A && O(h))
540
700
  try {
541
- const p = ru(f);
542
- if (p) {
543
- const g = (i == null ? void 0 : i.path) || "";
544
- if (!g)
701
+ const g = T(h);
702
+ if (g) {
703
+ const w = (r == null ? void 0 : r.path) || "";
704
+ if (!w)
545
705
  return '<div class="diagram-error">Cannot resolve file import: markdown file path is not available</div>';
546
- const S = iu(p, g), W = u.allowedImportDirs;
547
- if (!nu(S, W))
548
- return `<div class="diagram-error">File import not allowed: ${p}. Path is outside allowed directories.</div>`;
549
- const y = Du(S);
550
- f = y.content, A = y.mtime;
706
+ const $ = J(g, w), L = t.allowedImportDirs;
707
+ if (!K($, L))
708
+ return `<div class="diagram-error">File import not allowed: ${g}. Path is outside allowed directories.</div>`;
709
+ const S = X($);
710
+ h = S.content, C = S.mtime;
551
711
  }
552
- } catch (p) {
553
- const g = p instanceof Error ? p.message : String(p);
554
- return `<div class="diagram-error">Error loading diagram file in ${(i == null ? void 0 : i.path) || "unknown"}: ${g}</div>`;
712
+ } catch (g) {
713
+ const w = g instanceof Error ? g.message : String(g);
714
+ return `<div class="diagram-error">Error loading diagram file in ${(r == null ? void 0 : r.path) || "unknown"}: ${w}</div>`;
555
715
  }
556
- const L = (i == null ? void 0 : i.path) || "unknown", z = `${l.basename(L, ".md")}-${r}`;
557
- return ou(
716
+ const B = (r == null ? void 0 : r.path) || "unknown", M = `${d.basename(B, ".md")}-${a}`;
717
+ return ht(
718
+ h,
719
+ l,
720
+ m,
558
721
  f,
559
- c,
560
- B,
561
- x,
562
- u,
563
- z,
564
- A
722
+ t,
723
+ M,
724
+ C
565
725
  );
566
726
  }
567
- return e(s, r, D, i, o);
727
+ return e(s, a, D, r, n);
568
728
  };
569
729
  }
570
730
  export {
571
- M as SUPPORTED_DIAGRAM_TYPES,
572
- au as configureDiagramsPlugin,
573
- ou as diagramToSvg,
574
- Q as generateUniqueFilename,
575
- eu as hasDangerousExtension,
576
- su as isFileImportSyntax,
577
- ru as parseFileImportPath,
578
- Du as readFileImport,
579
- uu as removeOldDiagramFiles,
580
- iu as resolveFileImportPath,
581
- nu as validateFileImportPath
731
+ b as SUPPORTED_DIAGRAM_TYPES,
732
+ ft as configureDiagramsPlugin,
733
+ dt as createBuildTimeDiagramsPlugin,
734
+ ht as diagramToSvg,
735
+ N as generateUniqueFilename,
736
+ Ft as hasDangerousExtension,
737
+ O as isFileImportSyntax,
738
+ T as parseFileImportPath,
739
+ X as readFileImport,
740
+ H as removeOldDiagramFiles,
741
+ J as resolveFileImportPath,
742
+ K as validateFileImportPath
582
743
  };
package/dist/types.d.ts CHANGED
@@ -36,6 +36,31 @@ export interface DiagramPluginOptions {
36
36
  */
37
37
  allowedImportDirs?: string[];
38
38
  }
39
+ /**
40
+ * Options for build-time diagram generation.
41
+ * Extends the standard plugin options with build-specific settings.
42
+ * Used with `createBuildTimeDiagramsPlugin()`.
43
+ */
44
+ export interface BuildTimeDiagramPluginOptions extends DiagramPluginOptions {
45
+ /**
46
+ * Directory name where SVG files are emitted in the build output.
47
+ * This is relative to the Vite/Rollup output directory.
48
+ * @example "diagrams"
49
+ */
50
+ diagramsDistDir?: string;
51
+ }
52
+ /**
53
+ * A deferred diagram generation call, used internally by the build-time plugin.
54
+ * @internal
55
+ */
56
+ export interface DeferredDiagramCall {
57
+ filepath: string;
58
+ getDiagram: () => Promise<void | {
59
+ type: 'asset';
60
+ fileName: string;
61
+ source: string;
62
+ }>;
63
+ }
39
64
  /**
40
65
  * Extracted diagram metadata from markdown tokens
41
66
  */
package/package.json CHANGED
@@ -1,66 +1,66 @@
1
- {
2
- "name": "vitepress-plugin-diagrams",
3
- "version": "1.3.0",
4
- "description": "VitePress plugin for generating diagrams from text (PlantUML, Mermaid, etc.)",
5
- "author": "Ruslan Makarov <ruslan.makarov@gmail.com>",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/altrusl/vitepress-plugin-diagrams.git"
10
- },
11
- "bugs": {
12
- "url": "https://github.com/altrusl/vitepress-plugin-diagrams/issues"
13
- },
14
- "homepage": "https://github.com/altrusl/vitepress-plugin-diagrams",
15
- "type": "module",
16
- "main": "./dist/index.cjs",
17
- "module": "./dist/index.js",
18
- "types": "./dist/index.d.ts",
19
- "exports": {
20
- ".": {
21
- "import": "./dist/index.js",
22
- "require": "./dist/index.cjs"
23
- }
24
- },
25
- "keywords": [
26
- "vite",
27
- "vitepress-plugin",
28
- "diagrams",
29
- "plantuml",
30
- "mermaid"
31
- ],
32
- "files": [
33
- "bin",
34
- "dist"
35
- ],
36
- "bin": "bin/cli.js",
37
- "scripts": {
38
- "build": "vite build && pnpm run build:types",
39
- "build:types": "tsc -p tsconfig.types.json",
40
- "build:cli": "tsc",
41
- "test": "vitest",
42
- "test:run": "vitest run",
43
- "demo:dev": "pnpm --filter vitepress-diagrams-demo dev",
44
- "demo:build": "pnpm --filter vitepress-diagrams-demo build",
45
- "publish": "pnpm publish --access public"
46
- },
47
- "dependencies": {
48
- "markdown-it": "^14.1.0",
49
- "commander": "^14.0.0"
50
- },
51
- "devDependencies": {
52
- "@sxzz/eslint-config": "^4.6.0",
53
- "@types/node": "^22.13.1",
54
- "esbuild": "^0.25.5",
55
- "eslint": "^9.20.0",
56
- "typescript": "^5.7.3",
57
- "undici-types": "^7.10.0",
58
- "vite": "^6.1.0",
59
- "vitepress": "^1.6.3",
60
- "vitest": "^3.0.0"
61
- },
62
- "peerDependencies": {
63
- "vite": ">= 4.0.0",
64
- "vitepress": ">= 1.0.0"
65
- }
66
- }
1
+ {
2
+ "name": "vitepress-plugin-diagrams",
3
+ "version": "1.3.1",
4
+ "description": "VitePress plugin for generating diagrams from text (PlantUML, Mermaid, etc.)",
5
+ "author": "Ruslan Makarov <ruslan.makarov@gmail.com>",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/vuesence/vitepress-plugin-diagrams.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/vuesence/vitepress-plugin-diagrams/issues"
13
+ },
14
+ "homepage": "https://github.com/vuesence/vitepress-plugin-diagrams",
15
+ "type": "module",
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs"
23
+ }
24
+ },
25
+ "keywords": [
26
+ "vite",
27
+ "vitepress-plugin",
28
+ "diagrams",
29
+ "plantuml",
30
+ "mermaid"
31
+ ],
32
+ "files": [
33
+ "bin",
34
+ "dist"
35
+ ],
36
+ "bin": "bin/cli.js",
37
+ "dependencies": {
38
+ "commander": "^14.0.0",
39
+ "markdown-it": "^14.1.0",
40
+ "rimraf": "^6.1.3"
41
+ },
42
+ "devDependencies": {
43
+ "@sxzz/eslint-config": "^4.6.0",
44
+ "@types/node": "^22.13.1",
45
+ "esbuild": "^0.25.5",
46
+ "eslint": "^9.20.0",
47
+ "typescript": "^5.7.3",
48
+ "undici-types": "^7.10.0",
49
+ "vite": "^6.1.0",
50
+ "vitepress": "^1.6.3",
51
+ "vitest": "^3.0.0"
52
+ },
53
+ "peerDependencies": {
54
+ "vite": ">= 4.0.0",
55
+ "vitepress": ">= 1.0.0"
56
+ },
57
+ "scripts": {
58
+ "build": "vite build && pnpm run build:types",
59
+ "build:types": "tsc -p tsconfig.types.json",
60
+ "build:cli": "tsc",
61
+ "test": "vitest",
62
+ "test:run": "vitest run",
63
+ "demo:dev": "pnpm --filter vitepress-diagrams-demo dev",
64
+ "demo:build": "pnpm --filter vitepress-diagrams-demo build"
65
+ }
66
+ }