diagrams-js 0.5.0 → 0.5.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/index.js CHANGED
@@ -12,7 +12,7 @@ var t=(()=>{var e=import.meta.url;return(function(t={}){var n,r=t,i,a,o=new Prom
12
12
  <svg xmlns="http://www.w3.org/2000/svg" width="${t.width}" height="${t.height}"></svg>
13
13
  `;return e.FS.createPath(`/`,e.PATH.dirname(n)),e.FS.writeFile(n,r),n}):[]}function u(e,t){for(let n of t)e.FS.analyzePath(n).exists&&e.FS.unlink(n)}function d(e,t,n){let r;try{let n=e.lengthBytesUTF8(t);return r=e.ccall(`malloc`,`number`,[`number`],[n+1]),e.stringToUTF8(t,r,n+1),e.ccall(`viz_read_one_graph`,`number`,[`number`],[r])}finally{r&&e.ccall(`free`,`number`,[`number`],[r])}}function f(e,t,n){let r=e.ccall(`viz_create_graph`,`number`,[`string`,`number`,`number`],[t.name,t.directed===void 0?!0:t.directed,t.strict===void 0?!1:t.strict]);return p(e,r,t),r}function p(e,t,n){m(e,t,n),n.nodes&&n.nodes.forEach(n=>{if(n.name===void 0)throw Error(`nodes must have a name`);let r=e.ccall(`viz_add_node`,`number`,[`number`,`string`],[t,String(n.name)]);n.attributes&&h(e,t,r,n.attributes)}),n.edges&&n.edges.forEach(n=>{if(n.tail===void 0)throw Error(`edges must have a tail`);if(n.head===void 0)throw Error(`edges must have a head`);let r=e.ccall(`viz_add_edge`,`number`,[`number`,`string`,`string`],[t,String(n.tail),String(n.head)]);n.attributes&&h(e,t,r,n.attributes)}),n.subgraphs&&n.subgraphs.forEach(n=>{p(e,e.ccall(`viz_add_subgraph`,`number`,[`number`,`string`],[t,n.name===void 0?0:String(n.name)]),n)})}function m(e,t,n){if(n.graphAttributes)for(let[r,i]of Object.entries(n.graphAttributes))g(e,t,i,n=>{e.ccall(`viz_set_default_graph_attribute`,`number`,[`number`,`string`,`number`],[t,r,n])});if(n.nodeAttributes)for(let[r,i]of Object.entries(n.nodeAttributes))g(e,t,i,n=>{e.ccall(`viz_set_default_node_attribute`,`number`,[`number`,`string`,`number`],[t,r,n])});if(n.edgeAttributes)for(let[r,i]of Object.entries(n.edgeAttributes))g(e,t,i,n=>{e.ccall(`viz_set_default_edge_attribute`,`number`,[`number`,`string`,`number`],[t,r,n])})}function h(e,t,n,r){for(let[i,a]of Object.entries(r))g(e,t,a,t=>{e.ccall(`viz_set_attribute`,`number`,[`number`,`string`,`number`],[n,i,t])})}function g(e,t,n,r){let i;if(i=typeof n==`object`&&`html`in n?e.ccall(`viz_string_dup_html`,`number`,[`number`,`string`],[t,String(n.html)]):e.ccall(`viz_string_dup`,`number`,[`number`,`string`],[t,String(n)]),i==0)throw Error(`couldn't dup string`);r(i),typeof n==`object`&&`html`in n?e.ccall(`viz_string_free_html`,`number`,[`number`,`number`],[t,i]):e.ccall(`viz_string_free`,`number`,[`number`,`number`],[t,i])}var _=class{constructor(e){this.module=e}get graphvizVersion(){return a(this.module)}get formats(){return o(this.module,`device`)}get engines(){return o(this.module,`layout`)}renderFormats(e,t,n={}){return s(this.module,e,t,{engine:`dot`,...n})}render(e,t={}){let n;n=t.format===void 0?`dot`:t.format;let r=s(this.module,e,[n],{engine:`dot`,...t});return r.status===`success`&&(r.output=r.output[n]),r}renderString(e,t={}){let n=this.render(e,t);if(n.status!==`success`)throw Error(n.errors.find(e=>e.level==`error`)?.message||`render failed`);return n.output}renderSVGElement(e,t={}){let n=this.renderString(e,{...t,format:`svg`}),r;return r=t.trustedTypePolicy===void 0?n:t.trustedTypePolicy.createHTML(n),new DOMParser().parseFromString(r,`image/svg+xml`).documentElement}renderJSON(e,t={}){let n=this.renderString(e,{...t,format:`json`});return JSON.parse(n)}};function v(){return t().then(e=>new _(e))}var y=class{stack=[];get(){return this.stack[this.stack.length-1]}push(e){this.stack.push(e)}pop(){return this.stack.pop()}};const b=new y;new y;function x(e){b.push(e)}const S={shape:`box`,style:`rounded`,labeljust:`l`,fontname:`Sans-Serif`,fontsize:`12`};function C(e=`cluster`,t=`LR`,n,r,i){let a=new Map,o=[],s=`cluster_${e.replace(/\s+/g,`_`)}`;if(!r)throw Error(`Cluster must be created through diagram.cluster() or cluster.cluster()`);let c=r.themeConfig,l={...S};l.label=e,l.pencolor=c.pencolor;let u=i?i.depth+1:0,d=c.bgcolor;l.bgcolor=d[u%d.length],n&&Object.assign(l,n);let f={label:e,name:s,depth:u,graphAttr:l,get clusterAttrs(){return l},set clusterAttrs(e){for(let e of Object.keys(l))delete l[e];Object.assign(l,e)},get diagram(){return r},"~node"(e,t,n){a.set(e,{label:t,attrs:n})},add(e){return e[`~register`](f),e},subgraph(e){o.push(e)},cluster(e){let t=C(e,`LR`,void 0,r,f);return o.push(t),t},getNodes(){return a},getSubgraphs(){return o},getParent(){return i},getDiagram(){return r}};return f}const w={pastel:{bgcolor:[`#E5F5FD`,`#EBF3E7`,`#ECE8F6`,`#FDF7E3`],pencolor:`#AEB6BE`,edgecolor:`#7B8894`},neutral:{bgcolor:[`#F8F9FA`,`#F1F3F5`,`#E9ECEF`,`#DEE2E6`],pencolor:`#ADB5BD`,edgecolor:`#495057`},blues:{bgcolor:[`#E7F5FF`,`#D0EBFF`,`#A5D8FF`,`#74C0FC`],pencolor:`#339AF0`,edgecolor:`#1971C2`},greens:{bgcolor:[`#EBFBEE`,`#D3F9D8`,`#B2F2BB`,`#8CE99A`],pencolor:`#40C057`,edgecolor:`#2F9E44`},orange:{bgcolor:[`#FFF4E6`,`#FFE8CC`,`#FFD8A8`,`#FFC078`],pencolor:`#FD7E14`,edgecolor:`#E8590C`}};function T(){return typeof window<`u`&&typeof document<`u`}function E(e){let t=e.match(/translate\(\s*([^,\s]+)[,\s]+([^\s)]+)\s*\)/);return t?{x:parseFloat(t[1]),y:parseFloat(t[2])}:null}function D(e){let t=e.match(/transform="([^"]+)"/);if(t){let e=E(t[1]);if(e)return e}let n=e.match(/<ellipse[^>]+cx="([^"]+)"[^>]+cy="([^"]+)"/);if(n)return{x:parseFloat(n[1]),y:parseFloat(n[2])};let r=e.match(/<polygon[^>]+points="([^"]+)"/);if(r){let e=r[1].match(/[-\d.]+/g);if(e&&e.length>=4){let t=0,n=0,r=0;for(let i=0;i<e.length;i+=2)t+=parseFloat(e[i]),n+=parseFloat(e[i+1]),r++;return{x:t/r,y:n/r}}}let i=e.match(/<path[^>]+d="([^"]+)"/);if(i){let e=i[1].match(/[-\d.]+/g);if(e&&e.length>=4){let t=[],n=[];for(let r=0;r<e.length;r+=2){let i=parseFloat(e[r]),a=parseFloat(e[r+1]);!isNaN(i)&&!isNaN(a)&&(t.push(i),n.push(a))}if(t.length>0&&n.length>0)return{x:(Math.min(...t)+Math.max(...t))/2,y:(Math.min(...n)+Math.max(...n))/2}}}let a=e.match(/<text[^>]*\sx="([^"]+)"/),o=e.match(/<text[^>]*\sy="([^"]+)"/);if(a&&o){let t=e.match(/font-size="([^"]+)"/),n=t?parseFloat(t[1]):13;return{x:parseFloat(a[1]),y:parseFloat(o[1])-n-32}}return null}function O(e){let t=e.match(/<title>([^<]*)<\/title>/);return t?t[1].replace(/&#(\d+);/g,(e,t)=>String.fromCharCode(parseInt(t,10))):null}function k(e){let t=0;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t=(t<<5)-t+r,t&=t}return`icon-${Math.abs(t).toString(36)}`}function A(e,t,n){return!n||Object.keys(n).length===0||t.length===0?e:T()?ee(e,t,n):te(e,t,n)}function ee(e,t,n){let r=new DOMParser().parseFromString(e,`image/svg+xml`).querySelector(`svg`);if(!r)return console.warn(`No SVG element found`),e;let i=r.querySelector(`defs`);i||(i=document.createElementNS(`http://www.w3.org/2000/svg`,`defs`),r.insertBefore(i,r.firstChild));let a=new Map;return r.querySelectorAll(`g.node`).forEach(e=>{let r=e.querySelector(`title`);if(!r)return;let o=r.textContent,s=t.find(e=>e.node.nodeId===o);if(!s||!n[s.icon])return;let c=n[s.icon],l;if(a.has(c))l=a.get(c);else{l=k(c),a.set(c,l);let e=document.createElementNS(`http://www.w3.org/2000/svg`,`g`);e.setAttribute(`id`,l);let t=document.createElementNS(`http://www.w3.org/2000/svg`,`image`);t.setAttribute(`x`,`-24`),t.setAttribute(`y`,`-24`),t.setAttribute(`width`,`48`),t.setAttribute(`height`,`48`),t.setAttribute(`href`,c),t.setAttribute(`preserveAspectRatio`,`xMidYMid meet`),e.appendChild(t),i.appendChild(e)}let u,d,f=e.getAttribute(`transform`);if(f&&f!==`null`){let e=f.match(/translate\(\s*([^,\s]+)[,\s]+([^\s)]+)\s*\)/);if(!e)return;u=parseFloat(e[1]),d=parseFloat(e[2])}else{let t=e.querySelector(`ellipse`),n=e.querySelector(`polygon`),r=e.querySelector(`path`),i=e.querySelector(`text`);if(t){let e=t.getAttribute(`cx`),n=t.getAttribute(`cy`);if(!e||!n)return;u=parseFloat(e),d=parseFloat(n)}else if(n){let e=n.getAttribute(`points`);if(!e)return;let t=e.match(/[-\d.]+/g);if(!t||t.length<4)return;let r=0,i=0,a=0;for(let e=0;e<t.length;e+=2)r+=parseFloat(t[e]),i+=parseFloat(t[e+1]),a++;u=r/a,d=i/a}else if(r){let e=r.getAttribute(`d`);if(!e)return;let t=e.match(/[-\d.]+/g);if(!t||t.length<4)return;let n=[],i=[];for(let e=0;e<t.length;e+=2){let r=parseFloat(t[e]),a=parseFloat(t[e+1]);!isNaN(r)&&!isNaN(a)&&(n.push(r),i.push(a))}if(n.length===0||i.length===0)return;u=(Math.min(...n)+Math.max(...n))/2,d=(Math.min(...i)+Math.max(...i))/2}else if(i){let e=i.getAttribute(`x`),t=i.getAttribute(`y`),n=i.getAttribute(`font-size`);if(!e||!t)return;u=parseFloat(e),d=parseFloat(t)-(n?parseFloat(n):13)-32}else return}let p=document.createElementNS(`http://www.w3.org/2000/svg`,`use`);p.setAttribute(`href`,`#${l}`),p.setAttribute(`x`,String(u)),p.setAttribute(`y`,String(d+6)),e.appendChild(p)}),new XMLSerializer().serializeToString(r)}function te(e,t,n){let r=new Map,i=[],a=/<g[^>]*class="node"[^>]*>([\s\S]*?)<\/g>/g,o=e,s,c=[];for(;(s=a.exec(e))!==null;){let e=s[0],a=O(e);if(!a)continue;let o=t.find(e=>e.node.nodeId===a);if(!o||!n[o.icon])continue;let l=n[o.icon],u;if(r.has(l))u=r.get(l);else{u=k(l),r.set(l,u);let e=`<g id="${u}"><image x="-24" y="-24" width="48" height="48" href="${l}" preserveAspectRatio="xMidYMid meet"/></g>`;i.push(e)}let d=D(e);if(!d)continue;let f=`<use href="#${u}" x="${d.x}" y="${d.y+6}"/>`,p=e.replace(/<\/g>$/,`${f}</g>`);c.push({original:e,replacement:p})}for(let{original:e,replacement:t}of c)o=o.replace(e,t);if(i.length>0){let e=`<defs>\n${i.join(`
14
14
  `)}\n</defs>`;o=o.replace(/(<svg[^>]*>)/,`$1\n${e}`)}return o}function j(e={}){let t=e.node,n=e.forward??!1,r=e.reverse??!1,i={};e.label&&(i.label=e.label),e.color&&(i.color=e.color),e.style&&(i.style=e.style);for(let[t,n]of Object.entries(e))t!==`node`&&t!==`forward`&&t!==`reverse`&&t!==`label`&&t!==`color`&&t!==`style`&&(i[t]=String(n));let a={get node(){return t},set node(e){t=e},get forward(){return n},set forward(e){n=e},get reverse(){return r},set reverse(e){r=e},get attrs(){let e;return e=n&&r?`both`:n?`forward`:r?`back`:`none`,{...i,dir:e}},to(e){return n=!0,ne(e)?(Object.assign(i,e.attrs),a):t?(t[`~connect`](e,a),e):(t=e,e)},get edgeAttrs(){return i},set edgeAttrs(e){for(let e of Object.keys(i))delete i[e];Object.assign(i,e)},from(e){return r=!0,ne(e)?(Object.assign(i,e.attrs),a):t?(e[`~connect`](t,a),e):(t=e,e)}};return a}function ne(e){return typeof e==`object`&&!!e&&`attrs`in e&&`forward`in e&&`reverse`in e}function re(e){return j({label:e})}function M(e){return j({color:e})}function ie(e){return j({style:e})}j.label=re,j.color=M,j.style=ie;function ae(e){return typeof e==`object`&&!!e&&`attrs`in e&&`forward`in e&&`reverse`in e}function oe(){return`${Date.now().toString(36)}_${Math.random().toString(36).substr(2,9)}`}function N(e=``,t={}){let n=t.nodeId??oe(),r=null,i,a={},o=null,s={},c=t[`~iconDataUrl`];c&&(o=c);let l={shape:t.shape!==void 0,height:t.height!==void 0,width:t.width!==void 0,fixedsize:t.fixedsize!==void 0,margin:t.margin!==void 0,labelloc:t.labelloc!==void 0,imagescale:t.imagescale!==void 0};l.shape?a.shape=String(t.shape):o&&(a.shape=`none`);for(let[e,n]of Object.entries(t))e.startsWith(`~`)||e===`nodeId`||e===`shape`||(a[e]=String(n));o&&Object.assign(a,{height:`0.9`,width:`0.8`,fixedsize:`true`,margin:`0,0`,labelloc:`b`,imagescale:`true`});let u={label:e,"~id":n,"~diagram":null,"~cluster":void 0,"~attrs":a,get"~iconDataUrl"(){return o},set"~iconDataUrl"(e){o=e},get nodeId(){return n},get nodeAttrs(){return a},set nodeAttrs(e){for(let e of Object.keys(a))delete a[e];Object.assign(a,e)},get provider(){return u[`~provider`]},set provider(e){u[`~provider`]=e},get type(){return u[`~type`]},set type(e){u[`~type`]=e},get resource(){return u[`~resource`]},set resource(e){u[`~resource`]=e},get metadata(){return s},set metadata(e){s=e},get cluster(){return i},"~register"(o){if(P(o)?(i=o,r=o.diagram):r=o,r[`~trackNode`](this),r&&r.autolabel){let n=t[`~type`]??`Node`;e?u.label=n+`
15
- `+e:u.label=n}let s=u[`~iconDataUrl`];if(s&&(l.shape||(r[`~userNodeAttr`]?.shape?a.shape=r[`~userNodeAttr`].shape:a.shape=`none`),l.height||(r[`~userNodeAttr`]?.height?a.height=r[`~userNodeAttr`].height:a.height=`0.9`),l.width||(r[`~userNodeAttr`]?.width?a.width=r[`~userNodeAttr`].width:a.width=`0.8`),l.fixedsize||(r[`~userNodeAttr`]?.fixedsize?a.fixedsize=r[`~userNodeAttr`].fixedsize:a.fixedsize=`true`),l.margin||(r[`~userNodeAttr`]?.margin?a.margin=r[`~userNodeAttr`].margin:a.margin=`0,0`),l.labelloc||(r[`~userNodeAttr`]?.labelloc?a.labelloc=r[`~userNodeAttr`].labelloc:a.labelloc=`b`),l.imagescale||(r[`~userNodeAttr`]?.imagescale?a.imagescale=r[`~userNodeAttr`].imagescale:a.imagescale=`true`),r[`~trackNodeWithIcon`](u,s)),P(o),o[`~node`](n,u.label,a),se(this)&&r){let e=ce(this,r);r[`~trackPendingIconLoad`](e)}},to(e,t){if(ae(e)){if(e.node=u,e.forward=!0,t===void 0)return e;let n=t;if(Array.isArray(n)){for(let t of n){let n=j({...e.attrs,node:u,forward:!0});u[`~connect`](t,n)}return n}return u[`~connect`](n,e)}let n=e;if(Array.isArray(n)){for(let e of n){let t=j({node:u,forward:!0});u[`~connect`](e,t)}return n}let r=j({node:u,forward:!0});return u[`~connect`](n,r)},from(e,t){if(ae(e)){e.node=u,e.reverse=!0;let n=t;if(Array.isArray(n)){for(let t of n){let n=j({...e.attrs,node:u,reverse:!0});u[`~connect`](t,n)}return u}return u[`~connect`](n,e)}let n=e;if(Array.isArray(n)){for(let e of n){let t=j({node:e,reverse:!0});u[`~connect`](e,t)}return u}let r=j({node:n,reverse:!0});return u[`~connect`](n,r)},with(e,t){if(ae(e)){e.node=u;let n=t;if(Array.isArray(n)){for(let t of n){let n=j({...e.attrs,node:u});u[`~connect`](t,n)}return n}return u[`~connect`](n,e)}let n=e,r=j({node:u});if(Array.isArray(n)){for(let e of n)u[`~connect`](e,r);return n}return u[`~connect`](n,r)},"~connect"(e,t){if(!e||typeof e!=`object`||!(`nodeId`in e))throw Error(`${String(e)} is not a valid Node`);if(!t||typeof t!=`object`||!(`attrs`in t))throw Error(`${String(t)} is not a valid Edge`);if(!r)throw Error(`Node is not registered with a diagram`);return r[`~connect`](u,e,t),e}};return u}function P(e){return typeof e==`object`&&!!e&&`getNodes`in e&&typeof e.getNodes==`function`}function se(e){return`~getIconUrl`in e&&typeof e[`~getIconUrl`]==`function`}async function ce(e,t){let n=e,r=n[`~getIconUrl`]();if(r.startsWith(`data:`)){t[`~trackNodeWithIcon`](e,r);return}try{let r=await n.loadIcon();r&&t[`~trackNodeWithIcon`](e,r)}catch(t){console.warn(`Failed to load custom icon for node ${e.nodeId}:`,t)}}const le=new Map;function F(e,t,n){let r=t.startsWith(`data:`);return{...N(e,{shape:`none`,height:`0.9`,width:`0.8`,fixedsize:`true`,margin:`0,0`,labelloc:`b`,imagescale:`true`,...n,...r?{"~iconDataUrl":t}:{}}),"~iconUrl":t,get"~iconDataUrl"(){return t.startsWith(`data:`)?t:null},set"~iconDataUrl"(e){},"~getIconUrl"(){return t},async loadIcon(){if(ue(t))return t;if(le.has(t))return le.get(t);let e;return e=de(t)?fe(t):pe(t),le.set(t,e),e.then(()=>{}).catch(()=>{le.delete(t)}),e}}}function ue(e){return e.startsWith(`data:`)}function de(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}async function fe(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),1e4),r=await globalThis.fetch(e,{signal:t.signal});if(clearTimeout(n),!r.ok)return console.warn(`Failed to fetch icon: ${e}`),null;if(typeof Blob<`u`&&typeof FileReader<`u`)return me(await r.blob());let i=await r.arrayBuffer(),a=Buffer.from(i);return`data:${r.headers.get(`content-type`)||`image/png`};base64,${a.toString(`base64`)}`}catch(t){return console.warn(`Error fetching icon: ${e}`,t),null}}async function pe(e){try{let t=await import(`node:fs/promises`),n=await import(`node:path`),r=await t.readFile(e),i=n.extname(e).toLowerCase(),a=`image/png`;return i===`.svg`?a=`image/svg+xml`:i===`.jpg`||i===`.jpeg`?a=`image/jpeg`:i===`.gif`?a=`image/gif`:i===`.webp`&&(a=`image/webp`),`data:${a};base64,${r.toString(`base64`)}`}catch(t){return console.warn(`Error loading local icon: ${e}`,t),null}}function me(e){return new Promise((t,n)=>{let r=new FileReader;r.onloadend=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function he(e,t){return F(e,`https://api.iconify.design/${t}.svg`)}let I=null;async function ge(e,t){let n=e=>e.filter(e=>e!=null).join(`/`);if(I===`relative`||!I&&!import.meta.url.endsWith(`.js`))try{let r=await import(n([`.`,e,t]));return I=`relative`,r}catch{}if(I===`direct`||!I)try{let r=await import(n([`.`,`providers`,e,t])+`.js`);return I=`direct`,r}catch{}if(I===`bare`||!I)try{let r=await import(n([`diagrams-js`,e,t]));return I=`bare`,r}catch{}if(I===`cdn`||!I)try{let r=await import(n([`https://esm.sh`,`diagrams-js`,e,t]));return I=`cdn`,r}catch{}return null}async function _e(e){let t=new Map;for(let[n,r]of e){let e=await ge(n,r);if(e)for(let[n,r]of Object.entries(e))typeof r==`function`&&!n.startsWith(`_`)&&t.set(n,r)}return t}async function ve(){return await ge(`resources-list`)}async function ye(){return await ge(`yaml`)}const be=new Set([`shape`,`height`,`width`,`fixedsize`,`margin`,`labelloc`,`imagescale`]),xe={shape:`none`,height:`0.9`,width:`0.8`,fixedsize:`true`,margin:`0,0`,labelloc:`b`,imagescale:`true`};function L(e,t,n,r){let i={id:e};if(t&&(i.label=t),r){let e=r,t=e[`~provider`],n=e[`~type`],a=e[`~resource`];t&&(i.provider=t),n&&(i.type=n),a&&(i.resource=a),`~getIconUrl`in e&&typeof e[`~getIconUrl`]==`function`&&(i.iconUrl=e[`~getIconUrl`]()),r.metadata&&Object.keys(r.metadata).length>0&&(i.metadata=r.metadata)}let a=i.provider!=null,o=i.iconUrl!=null,s=a||o,c={};for(let[e,t]of Object.entries(n))if(!e.startsWith(`~`)){if(s&&be.has(e)){let n=xe[e];if(n!==void 0&&String(t)===n)continue}c[e]=typeof t==`number`?t:String(t)}return Object.keys(c).length>0&&(i.attrs=c),i}function R(e,t,n){let r={label:e.label},i=[];for(let[r,{label:a,attrs:o}]of e.getNodes())i.push(r),t.push(L(r,a,o,n.get(r)));i.length>0&&(r.nodes=i);let a={};for(let[t,n]of Object.entries(e.graphAttr))t===`shape`||t===`style`||t===`labeljust`||t===`fontname`||t===`fontsize`||t===`label`||t===`pencolor`||t===`bgcolor`||(a[t]=n);Object.keys(a).length>0&&(r.graphAttr=a);let o=e.getSubgraphs();return o.length>0&&(r.clusters=o.map(e=>R(e,t,n))),r}function Se(e){return e.map(e=>{let t={from:e.from,to:e.to},{dir:n,label:r,color:i,style:a,...o}=e.attrs;return n&&n!==`forward`&&(t.direction=n),r&&(t.label=r),i&&(t.color=i),a&&(t.style=a),Object.keys(o).length>0&&(t.attrs=o),t})}function Ce(e,t,n,r,i,a,o){let s={nodes:[]};e.name&&(s.name=e.name);let c=e.name?e.name.toLowerCase().replace(/\s+/g,`_`):`diagram`;e.filename!==c&&(s.filename=e.filename),e.direction!==`LR`&&(s.direction=e.direction),e.curveStyle!==`ortho`&&(s.curvestyle=e.curveStyle),e.autolabel&&(s.autolabel=e.autolabel),e.strict&&(s.strict=e.strict),e.theme!==`pastel`&&(s.theme=e.theme),o.graphAttr&&Object.keys(o.graphAttr).length>0&&(s.graphAttr={...o.graphAttr}),o.nodeAttr&&Object.keys(o.nodeAttr).length>0&&(s.nodeAttr={...o.nodeAttr}),o.edgeAttr&&Object.keys(o.edgeAttr).length>0&&(s.edgeAttr={...o.edgeAttr});let l=new Map(a);for(let e of i)l.has(e.node.nodeId)||l.set(e.node.nodeId,e.node);let u=new Set;function d(e){for(let[t]of e.getNodes())u.add(t);for(let t of e.getSubgraphs())d(t)}for(let e of r)d(e);let f=[];for(let[e,{label:n,attrs:r}]of t)u.has(e)||s.nodes.push(L(e,n,r,l.get(e)));return r.length>0&&(s.clusters=r.map(e=>R(e,f,l)),s.nodes.push(...f)),n.length>0&&(s.edges=Se(n)),s}async function z(e,t){let n=typeof e==`string`?JSON.parse(e):e;if(!n.nodes||!Array.isArray(n.nodes))throw Error(`Invalid diagram JSON: 'nodes' array is required`);let r=new Map;for(let e of n.nodes){let t=e.type||e.service;if(e.provider&&t){let n=`${e.provider}/${t}`;r.set(n,[e.provider,t])}}let i=await _e(Array.from(r.values()));if(t?.providers)for(let e of t.providers)for(let[t,n]of Object.entries(e))typeof n==`function`&&!t.startsWith(`_`)&&i.set(t,n);let a={};n.name!==void 0&&(a.name=n.name),n.filename!==void 0&&(a.filename=n.filename),n.direction!==void 0&&(a.direction=n.direction),n.curvestyle!==void 0&&(a.curvestyle=n.curvestyle),n.autolabel!==void 0&&(a.autolabel=n.autolabel),n.strict!==void 0&&(a.strict=n.strict),n.theme!==void 0&&(a.theme=n.theme),n.graphAttr!==void 0&&(a.graphAttr=n.graphAttr),n.nodeAttr!==void 0&&(a.nodeAttr=n.nodeAttr),n.edgeAttr!==void 0&&(a.edgeAttr=n.edgeAttr);let o=Q(n.name??``,a),s=new Map,c=new Map;if(n.clusters){function e(t,n){let r=[...n,t.label];if(t.nodes)for(let e of t.nodes)c.set(e,r);if(t.clusters)for(let n of t.clusters)e(n,r)}for(let t of n.clusters)e(t,[])}let l=new Map;if(n.clusters){function e(t,n){let r=n.cluster(t.label);if(t.graphAttr&&Object.assign(r.graphAttr,t.graphAttr),l.set(t.label,r),t.clusters)for(let n of t.clusters)e(n,r)}for(let t of n.clusters)e(t,o)}let u=new Set;for(let e of n.nodes){if(u.has(e.id))throw Error(`Duplicate node ID: "${e.id}"`);u.add(e.id);let t,n=e.resource||e.type,r=n?i.get(n):void 0;if(r)t=r(e.label??``,{nodeId:e.id,...e.attrs});else if(e.iconUrl&&we(e.iconUrl)){let n={nodeId:e.id};e.attrs&&Object.assign(n,e.attrs),t=F(e.label??``,e.iconUrl,n)}else{let r={nodeId:e.id};e.attrs&&Object.assign(r,e.attrs),t=N(e.label??``,r);let i=t;e.provider&&(i[`~provider`]=e.provider);let a=e.type||e.service;a&&(i[`~type`]=a),n&&(i[`~resource`]=n),e.iconUrl&&(i[`~iconDataUrl`]=e.iconUrl)}e.metadata&&(t.metadata=e.metadata);let a=c.get(e.id);if(a&&a.length>0){let e=a[a.length-1],n=l.get(e);n?n.add(t):o.add(t)}else o.add(t);s.set(e.id,t)}if(n.edges)for(let e of n.edges){let t=s.get(e.from),n=s.get(e.to);if(!t)throw Error(`Edge references unknown source node: "${e.from}"`);if(!n)throw Error(`Edge references unknown target node: "${e.to}"`);let r=e.direction??`forward`,i={};e.label&&(i.label=e.label),e.color&&(i.color=e.color),e.style&&(i.style=e.style),e.attrs&&Object.assign(i,e.attrs);let a=j(i);switch(r){case`forward`:a.forward=!0;break;case`back`:a.reverse=!0;break;case`both`:a.forward=!0,a.reverse=!0;break;case`none`:break;default:a.forward=!0}t[`~connect`](n,a)}return o}function we(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}let B=function(e){return e.BEFORE_IMPORT=`before:import`,e.AFTER_IMPORT=`after:import`,e.BEFORE_EXPORT=`before:export`,e.AFTER_EXPORT=`after:export`,e.BEFORE_RENDER=`before:render`,e.AFTER_RENDER=`after:render`,e.BEFORE_SERIALIZE=`before:serialize`,e.AFTER_DESERIALIZE=`after:deserialize`,e.NODE_CREATE=`node:create`,e.EDGE_CREATE=`edge:create`,e.CLUSTER_CREATE=`cluster:create`,e.METADATA_ATTACH=`metadata:attach`,e.METADATA_CALCULATE=`metadata:calculate`,e}({});var V=class extends Error{constructor(e,t,n){super(e),this.pluginName=t,this.cause=n,this.name=`PluginError`}},Te=class extends V{constructor(e,t,n){super(`Plugin "${e}" has unresolved dependencies: ${t.join(`, `)}`,e),this.missingDependencies=t,this.circularDependencies=n,this.name=`DependencyError`}},H=class extends V{constructor(e,t,n){super(`Plugin "${e}" does not support ${n} runtime`,e),this.requiredRuntimes=t,this.currentRuntime=n,this.name=`RuntimeError`}};function Ee(){return globalThis.Deno===void 0?globalThis.Bun===void 0?typeof window<`u`&&typeof document<`u`?`browser`:(typeof process<`u`&&process.versions?.node,`node`):`bun`:`deno`}function De(e){let t=Ee();if(!e[t])throw new H(`unknown`,e,t)}function Oe(e){let t=new Set,n=new Set,r=[],i=[];function a(o,s=[]){if(n.has(o)){let e=s.indexOf(o);i.push(...s.slice(e),o);return}if(t.has(o))return;let c=e.get(o);if(c){n.add(o),s.push(o);for(let e of c.plugin.dependencies||[])a(e,[...s]);n.delete(o),t.add(o),r.push(c)}}for(let[n]of e)t.has(n)||a(n);if(i.length>0)throw new Te(i[0],[],i);return r}function ke(){let e=new Map,t=new Map,n=new Map,r=new Map,i=new Map,a=new Map,o=new Map,s=new Map;function c(){return{registry:f,fetch:globalThis.fetch.bind(globalThis),getPlugin:t=>e.get(t),getImporter:e=>n.get(e),getExporter:e=>r.get(e),getRenderer:e=>i.get(e),getMetadataProvider:e=>a.get(e),executeHooks:async(e,t)=>f.executeHooks(e,t),loadResourcesList:()=>ve(),loadYaml:()=>ye(),lib:Qe}}function l(e){for(let t of e.capabilities)switch(t.type){case`importer`:n.set(t.name,t);break;case`exporter`:r.set(t.name,t);break;case`renderer`:i.set(t.name,t);for(let e of t.formats)i.set(e,t);break;case`metadata`:a.set(t.provider,t);break;case`hook`:for(let{event:n,handler:r,priority:i=0}of t.hooks){let t=o.get(n)||[];t.push({handler:r,priority:i,pluginName:e.name}),t.sort((e,t)=>t.priority-e.priority),o.set(n,t)}break}}function u(e){for(let t of e.capabilities)switch(t.type){case`importer`:n.delete(t.name);break;case`exporter`:r.delete(t.name);break;case`renderer`:i.delete(t.name);for(let e of t.formats)i.delete(e);break;case`metadata`:a.delete(t.provider);break;case`hook`:for(let{event:n}of t.hooks){let t=o.get(n);if(t){let r=t.filter(t=>t.pluginName!==e.name);r.length===0?o.delete(n):o.set(n,r)}}break}}async function d(){if(s.size===0)return;for(let[t,{plugin:n}]of s)if(n.dependencies){let r=n.dependencies.filter(t=>!e.has(t)&&!s.has(t));if(r.length>0)throw new Te(t,r)}let n=Oe(s);for(let{plugin:r,config:i}of n){try{De(r.runtimeSupport)}catch(e){throw e instanceof H?new H(r.name,r.runtimeSupport,Ee()):e}if(r.requiredConfig){let e=i,t=r.requiredConfig.filter(t=>!e||e[t]===void 0);if(t.length>0)throw new V(`Plugin "${r.name}" requires configuration: ${t.join(`, `)}`,r.name)}if(r.initialize){let e=c();await r.initialize(i,e)}e.set(r.name,r),t.set(r.name,i),l(r)}s.clear()}let f={register:async t=>{if(!t.name)throw new V(`Plugin must have a name`);if(!t.version)throw new V(`Plugin must have a version`,t.name);if(!t.apiVersion)throw new V(`Plugin must have an apiVersion`,t.name);if(!t.capabilities||t.capabilities.length===0)throw new V(`Plugin must have at least one capability`,t.name);if(!t.runtimeSupport)throw new V(`Plugin must declare runtimeSupport`,t.name);if(e.has(t.name))throw new V(`Plugin "${t.name}" is already registered`,t.name);s.set(t.name,{plugin:t,config:void 0}),await d()},unregister:async n=>{let r=e.get(n);if(!r)throw new V(`Plugin "${n}" is not registered`,n);let i=[];for(let[t,r]of e)r.dependencies?.includes(n)&&i.push(t);if(i.length>0)throw new V(`Cannot unregister "${n}" - required by: ${i.join(`, `)}`,n);r.destroy&&await r.destroy(),u(r),e.delete(n),t.delete(n),console.log(`✗ Plugin "${n}" unregistered`)},getPlugin:t=>e.get(t),getImporter:e=>n.get(e),getExporter:e=>r.get(e),getRenderer:e=>i.get(e),getMetadataProvider:e=>a.get(e),executeHooks:async(e,t)=>{let n=o.get(e)||[],r=t;for(let{handler:t,pluginName:i}of n)try{let n=c(),i=await t(r,{...n,event:e});i!==void 0&&(r=i)}catch(t){console.error(`Hook error in plugin "${i}" for event "${e}":`,t)}return r},listPlugins:()=>Array.from(e.values()),listCapabilities:()=>({importers:Array.from(n.keys()),exporters:Array.from(r.keys()),renderers:Array.from(i.keys()),metadataProviders:Array.from(a.keys())}),loadResourcesList:()=>ve(),loadYaml:()=>ye()};return f}function U(){return{name:`json`,version:`1.0.0`,apiVersion:`1.0`,runtimeSupport:{node:!0,browser:!0,deno:!0,bun:!0},capabilities:[{type:`importer`,name:`json`,extensions:[`.json`],mimeTypes:[`application/json`],canImport:async e=>{try{let t=Array.isArray(e)?e:[e];for(let e of t){let t=JSON.parse(e);if(!t||typeof t!=`object`||!Array.isArray(t.nodes))return!1}return!0}catch{return!1}},import:async(e,t,n)=>{let r=Array.isArray(e)?e:[e];for(let e=0;e<r.length;e++)await W(t,await z(JSON.parse(r[e])),n.lib)}},{type:`exporter`,name:`json`,extension:`.json`,mimeType:`application/json`,export:async e=>{let t=e.toJSON();return JSON.stringify(t,null,2)}}]}}async function W(e,t,n){let r=t.toJSON(),i=new Map;for(let e of r.nodes){let t=e.type||e.service;if(e.provider&&t){let n=`${e.provider}/${t}`;i.set(n,[e.provider,t])}}let a=await _e(Array.from(i.values())),o=new Map;function s(t){let r=t.toJSON();for(let t of r.nodes){let r=t.resource||t.type,i=r?a.get(r):void 0,s;if(i){let e={nodeId:t.id};t.attrs&&Object.assign(e,t.attrs),s=i(t.label||t.id,e)}else if(t.iconUrl&&Ae(t.iconUrl)){let e={nodeId:t.id};t.attrs&&Object.assign(e,t.attrs),s=n.Custom(t.label||t.id,t.iconUrl,e)}else{let e={nodeId:t.id};t.provider&&(e[`~provider`]=t.provider);let i=t.type||t.service;i&&(e[`~type`]=i),r&&(e[`~resource`]=r),t.iconUrl&&(e[`~iconDataUrl`]=t.iconUrl),t.attrs&&Object.assign(e,t.attrs),s=n.Node(t.label||t.id,e)}t.metadata&&(s.metadata=t.metadata),e.add(s),o.set(t.id,s)}}if(s(t),r.clusters)for(let t of r.clusters){let n=e.cluster(t.label);if(t.graphAttr&&Object.assign(n.graphAttr,t.graphAttr),t.nodes)for(let e of t.nodes){let t=o.get(e);t&&n.add(t)}}if(r.edges)for(let e of r.edges){let t=o.get(e.from),r=o.get(e.to);if(t&&r){let i={};e.label&&(i.label=e.label),e.color&&(i.color=e.color),e.style&&(i.style=e.style),e.direction&&(i.dir=e.direction),e.attrs&&Object.assign(i,e.attrs);let a=n.Edge(i);switch(e.direction??`forward`){case`forward`:a.forward=!0;break;case`back`:a.reverse=!0;break;case`both`:a.forward=!0,a.reverse=!0;break;case`none`:break;default:a.forward=!0}t[`~connect`](r,a)}}}function Ae(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}const je=U();function Me(e){if(typeof Buffer<`u`)return Buffer.from(e,`utf-8`).toString(`base64`);let t=new TextEncoder().encode(e),n=``;for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return btoa(n)}function G(e){if(typeof Buffer<`u`)return Buffer.from(e,`base64`).toString(`utf-8`);let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return new TextDecoder().decode(n)}function Ne(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function Pe(e){let t={"data-node-id":e.id};return e.label!==void 0&&(t[`data-node-label`]=e.label),e.provider!==void 0&&(t[`data-node-provider`]=e.provider),e.type!==void 0&&(t[`data-node-type`]=e.type),e.resource!==void 0&&(t[`data-node-resource`]=e.resource),e.metadata&&Object.keys(e.metadata).length>0&&(t[`data-node-metadata`]=Me(JSON.stringify(e.metadata))),Object.entries(t).map(([e,t])=>`${e}="${Ne(t)}"`).join(` `)}function Fe(e){let t={"data-cluster-label":e.label};return e.nodes&&e.nodes.length>0&&(t[`data-cluster-nodes`]=e.nodes.join(`,`)),Object.entries(t).map(([e,t])=>`${e}="${Ne(t)}"`).join(` `)}function Ie(e,t,n,r){if(!r)return e;let i=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=RegExp(`<g\\b([^>]*)class="${t}"([^>]*)>((?:(?!<g\\b)[\\s\\S])*?)<title>${i}<\\/title>`,`g`);return e.replace(a,(e,i,a,o)=>`<g${i}class="${t}"${a} ${r}>${o}<title>${n}</title>`)}function Le(e,t){let n=Me(JSON.stringify(t));e=e.replace(/<svg\b([^>]*)>/,`<svg$1 data-diagram-version="1.0" data-diagram-json="${n}">`);for(let n of t.nodes){let t=Pe(n);e=Ie(e,`node`,n.id,t)}if(t.clusters)for(let n of t.clusters){let t=`cluster_${n.label.replace(/\s+/g,`_`)}`,r=Fe(n);e=Ie(e,`cluster`,t,r)}return e}function Re(e){let t=e.match(/data-diagram-json="([^"]+)"/);if(!t)return null;try{let e=G(t[1]);return JSON.parse(e)}catch{return null}}function K(){return{name:`svg`,version:`1.0.0`,apiVersion:`1.0`,runtimeSupport:{node:!0,browser:!0,deno:!0,bun:!0},capabilities:[{type:`importer`,name:`svg`,extensions:[`.svg`],mimeTypes:[`image/svg+xml`],canImport:async e=>{let t=Array.isArray(e)?e:[e];for(let e of t)if(typeof e!=`string`||!e.trim().startsWith(`<svg`)&&!e.includes(`<svg`)||!e.includes(`data-diagram-json="`))return!1;return!0},import:async(e,t,n)=>{let r=Array.isArray(e)?e:[e];for(let e of r){let r=Re(e);if(!r)throw Error(`Invalid diagram SVG: missing or corrupted embedded diagram data. Make sure the SVG was exported using diagrams-js SVG export.`);let i=n.getImporter(`json`);i?await i.import(JSON.stringify(r),t,n):await W(t,await z(r),n.lib)}}},{type:`exporter`,name:`svg`,extension:`.svg`,mimeType:`image/svg+xml`,export:async e=>await e.render({format:`svg`})}]}}const q=K(),J={light:{added:{border:`#2EA043`,fill:`rgba(46, 160, 67, 0.1)`,badge:`#2EA043`},removed:{border:`#F85149`,fill:`rgba(248, 81, 73, 0.1)`,badge:`#F85149`},modified:{border:`#D29922`,fill:`rgba(210, 153, 34, 0.1)`,badge:`#D29922`},unchanged:{border:`#8C959F`,fill:`transparent`,badge:`#8C959F`}},dark:{added:{border:`#3FB950`,fill:`rgba(63, 185, 80, 0.15)`,badge:`#3FB950`},removed:{border:`#F85149`,fill:`rgba(248, 81, 73, 0.15)`,badge:`#F85149`},modified:{border:`#D29922`,fill:`rgba(210, 153, 34, 0.15)`,badge:`#D29922`},unchanged:{border:`#6E7681`,fill:`transparent`,badge:`#6E7681`}}};function ze(e){return`${e.label||``}|${e.provider||``}|${e.type||``}|${e.resource||``}`}function Y(e){return`${e.provider||``}|${e.type||``}|${e.resource||``}`}function X(e,t){if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0}function Be(e,t,n=[]){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(e===null||t===null||typeof e!=`object`)return e===t;let r=e,i=t,a=Object.keys(r).filter(e=>!n.includes(e)),o=Object.keys(i).filter(e=>!n.includes(e));if(a.length!==o.length)return!1;for(let e of a){if(!o.includes(e))return!1;let t=n.filter(t=>t.startsWith(`${e}.`)).map(t=>t.slice(e.length+1));if(!Be(r[e],i[e],t))return!1}return!0}function Z(e,t,n=``,r=[]){let i=[],a=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of a){let a=n?`${n}.${o}`:o;if(r.includes(a))continue;let s=e[o],c=t[o];if(!(o in e))i.push(`${a} (added)`);else if(!(o in t))i.push(`${a} (removed)`);else if(typeof s==`object`&&s&&typeof c==`object`&&c){let e=Z(s,c,a,r);i.push(...e)}else s!==c&&i.push(`${a}: ${JSON.stringify(s)} → ${JSON.stringify(c)}`)}return i}function Ve(e,t,n={}){let r=typeof e.toJSON==`function`?e.toJSON():e,i=typeof t.toJSON==`function`?t.toJSON():t,a=[];if(n.ignore?.position!==!1&&a.push(`attrs.pos`,`attrs.lp`),n.ignore?.attrs)for(let e of n.ignore.attrs)a.push(`attrs.${e}`);if(n.ignore?.metadata===!0)a.push(`metadata`);else if(Array.isArray(n.ignore?.metadata))for(let e of n.ignore.metadata)a.push(`metadata.${e}`);let o={nodes:new Map,edges:new Map,clusters:[],summary:{added:0,removed:0,modified:0,unchanged:0},meta:{}};r.name!==i.name&&(o.meta.name={before:r.name,after:i.name}),r.theme!==i.theme&&(o.meta.theme={before:r.theme,after:i.theme}),r.direction!==i.direction&&(o.meta.direction={before:r.direction,after:i.direction}),r.curvestyle!==i.curvestyle&&(o.meta.curvestyle={before:r.curvestyle,after:i.curvestyle}),Z(r.graphAttr||{},i.graphAttr||{},``).length>0&&(o.meta.graphAttr={before:r.graphAttr,after:i.graphAttr}),Z(r.nodeAttr||{},i.nodeAttr||{},``).length>0&&(o.meta.nodeAttr={before:r.nodeAttr,after:i.nodeAttr}),Z(r.edgeAttr||{},i.edgeAttr||{},``).length>0&&(o.meta.edgeAttr={before:r.edgeAttr,after:i.edgeAttr});let s=new Map(r.nodes.map(e=>[e.id,e])),c=new Map(i.nodes.map(e=>[e.id,e])),l=new Set,u=new Set,d=new Map,f=new Map(r.nodes.map(e=>[ze(e),e.id]));for(let[e,t]of c){let n=ze(t);if(f.has(n)){let r=f.get(n),i=s.get(r);if(l.has(r)||u.has(e))continue;l.add(r),u.add(e),d.set(e,r);let c=Z(i,t,``,[...a,`id`]);c.length===0?(o.nodes.set(e,{kind:`unchanged`,before:i,after:t}),o.summary.unchanged++):(o.nodes.set(e,{kind:`modified`,before:i,after:t,changes:c}),o.summary.modified++)}}let p=Array.from(s.entries()).filter(([e])=>!l.has(e)),m=Array.from(c.entries()).filter(([e])=>!u.has(e)),h=new Map;for(let[e,t]of p){let n=Y(t);h.has(n)||h.set(n,[]),h.get(n).push(e)}let g=new Map;for(let[e,t]of m){let n=Y(t);g.has(n)||g.set(n,[]),g.get(n).push(e)}function _(e,t,n){let r=new Set;for(let i of t){let t=i.from===e,a=i.to===e;if(!t&&!a)continue;let o=t?i.to:i.from,s=n?o:d.get(o)||o,c=n?l.has(o):d.has(o);s&&c&&r.add(s)}return r}for(let[e,t]of g){let n=h.get(e);if(!n||n.length===0)continue;let a=t.map(e=>({id:e,node:c.get(e),connected:_(e,i.edges||[],!1)})),f=n.map(e=>({id:e,node:s.get(e),connected:_(e,r.edges||[],!0)}));for(let e of a){if(u.has(e.id))continue;let t=f.find(t=>!l.has(t.id)&&X(e.connected,t.connected)&&e.connected.size>0);if(t){l.add(t.id),u.add(e.id),d.set(e.id,t.id);let n=t.node,r=e.node;n.label===r.label?(o.nodes.set(e.id,{kind:`unchanged`,before:n,after:r}),o.summary.unchanged++):(o.nodes.set(e.id,{kind:`modified`,before:n,after:r,changes:[`label: "${n.label}" → "${r.label}"`]}),o.summary.modified++)}}}let v=Array.from(s.entries()).filter(([e])=>!l.has(e)),y=Array.from(c.entries()).filter(([e])=>!u.has(e)),b=new Map;for(let[e,t]of v){let n=Y(t);b.has(n)||b.set(n,[]),b.get(n).push(e)}let x=new Map;for(let[e,t]of y){let n=Y(t);x.has(n)||x.set(n,[]),x.get(n).push(e)}for(let[e,t]of x){let n=b.get(e);if(!n)continue;let r=Math.min(t.length,n.length);for(let e=0;e<r;e++){let r=t[e],i=n[e];if(l.has(i)||u.has(r))continue;let a=s.get(i),f=c.get(r);l.add(i),u.add(r),d.set(r,i),a.label===f.label?(o.nodes.set(r,{kind:`unchanged`,before:a,after:f}),o.summary.unchanged++):(o.nodes.set(r,{kind:`modified`,before:a,after:f,changes:[`label: "${a.label}" → "${f.label}"`]}),o.summary.modified++)}}for(let[e,t]of s)l.has(e)||(o.nodes.set(e,{kind:`removed`,before:t}),o.summary.removed++);for(let[e,t]of c)u.has(e)||(o.nodes.set(e,{kind:`added`,after:t}),o.summary.added++);let S=r.edges||[],C=i.edges||[];function w(e,t){let n,r;return t===`before`?(n=e.from,r=e.to):(n=d.get(e.from)||e.from,r=d.get(e.to)||e.to),`${n}->${r}`}function T(e){return`${e.from}->${e.to}[${e.label||``}]`}let E=new Map;for(let e of S)E.set(w(e,`before`),e);let D=new Map;for(let e of C)D.set(w(e,`after`),e);let O=new Set,k=new Set;for(let[e,t]of D)if(E.has(e)){let n=E.get(e),r=T(n),i=T(t);O.add(r),k.add(i);let s=Z(n,t,``,[...a,`from`,`to`]);s.length===0?(o.edges.set(i,{kind:`unchanged`,before:n,after:t}),o.summary.unchanged++):(o.edges.set(i,{kind:`modified`,before:n,after:t,changes:s}),o.summary.modified++)}for(let e of C){let t=T(e);k.has(t)||(o.edges.set(t,{kind:`added`,after:e}),o.summary.added++)}for(let e of S){let t=T(e);O.has(t)||(o.edges.set(t,{kind:`removed`,before:e}),o.summary.removed++)}function A(e=[],t=[],n=[]){let r=[],i=new Map(e.map(e=>[e.label,e])),a=new Map(t.map(e=>[e.label,e])),s=new Set([...i.keys(),...a.keys()]);for(let e of s){let t=i.get(e),s=a.get(e);if(t&&s){let i=[];Be(t.graphAttr||{},s.graphAttr||{})||i.push(`graphAttr`);let a=A(t.clusters,s.clusters,[...n,e]),c={kind:i.length>0?`modified`:`unchanged`,label:e,before:t,after:s,changes:i.length>0?i:void 0,clusters:a.length>0?a:void 0};r.push(c),i.length>0?o.summary.modified++:o.summary.unchanged++}else t?(r.push({kind:`removed`,label:e,before:t}),o.summary.removed++):s&&(r.push({kind:`added`,label:e,after:s}),o.summary.added++)}return r}return o.clusters=A(r.clusters,i.clusters),o}function He(e,t,n,r,i){let a=J[r],o=e;return o=o.replace(/<g([^>]*)class="node"([^>]*)>([\s\S]*?)<title>([^<]+)<\/title>([\s\S]*?)<\/g>/g,(e,r,o,s,c,l)=>{let u=t.get(c);if(!u)return e;let d=u.kind;if(n===`before`&&d===`added`&&(d=`unchanged`),n===`after`&&d===`removed`&&(d=`unchanged`),d===`unchanged`&&i===`hide`)return``;let f=a[d],p=d===`unchanged`&&i===`dim`?`0.4`:`1`,m=d===`unchanged`?``:`filter: drop-shadow(0 0 4px ${f.border}) drop-shadow(0 0 4px ${f.border});`,h=`${r}data-diff-kind="${d}" ${o}`,g=e.replace(/<g([^>]*)class="node"/,`<g${h}class="node" style="opacity:${p};${m}"`);return d!==`unchanged`&&(g=g.replace(/<ellipse([^>]*)style="([^"]*)"/g,(e,t,n)=>`<ellipse${t}style="${n};fill:${f.fill}"`).replace(/<ellipse(?![^>]*style=)/g,`<ellipse style="fill:${f.fill}"`).replace(/<polygon([^>]*)style="([^"]*)"/g,(e,t,n)=>`<polygon${t}style="${n};fill:${f.fill}"`).replace(/<polygon(?![^>]*style=)/g,`<polygon style="fill:${f.fill}"`)),g}),o=o.replace(/<g([^>]*)class="edge"([^>]*)>([\s\S]*?)<title>([^<]+)<\/title>([\s\S]*?)<\/g>/g,(e,r,o,s,c,l)=>{let u=t.get(c);if(!u)return e;let d=u.kind;if(n===`before`&&d===`added`&&(d=`unchanged`),n===`after`&&d===`removed`&&(d=`unchanged`),d===`unchanged`&&i===`hide`)return``;let f=a[d],p=d===`unchanged`&&i===`dim`?`0.4`:`1`,m=d===`unchanged`?``:`stroke:${f.border};stroke-width:2;filter: drop-shadow(0 0 2px ${f.border});`,h=`${r}data-diff-kind="${d}" ${o}`;return e.replace(/<g([^>]*)class="edge"/,`<g${h}class="edge" style="opacity:${p}"`).replace(/<path/g,`<path style="${m}"`).replace(/<polygon/g,`<polygon style="fill:${f.border};stroke:${f.border}"`)}),o}function Ue(e,t,n,r){let i=J[r.theme],{summary:a,meta:o}=n,s=[];o.name&&s.push(`Name: "${o.name.before}" → "${o.name.after}"`),o.theme&&s.push(`Theme: ${o.theme.before} → ${o.theme.after}`),o.direction&&s.push(`Direction: ${o.direction.before} → ${o.direction.after}`),o.curvestyle&&s.push(`Curve style: ${o.curvestyle.before} → ${o.curvestyle.after}`);let c=[a.added>0?`<span class="pill added">+${a.added}</span>`:``,a.removed>0?`<span class="pill removed">−${a.removed}</span>`:``,a.modified>0?`<span class="pill modified">~${a.modified}</span>`:``].filter(Boolean).join(` `),l=r.layout===`stacked`?`stacked`:`side-by-side`;return`<!DOCTYPE html>
15
+ `+e:u.label=n}let s=u[`~iconDataUrl`];if(s&&(l.shape||(r[`~userNodeAttr`]?.shape?a.shape=r[`~userNodeAttr`].shape:a.shape=`none`),l.height||(r[`~userNodeAttr`]?.height?a.height=r[`~userNodeAttr`].height:a.height=`0.9`),l.width||(r[`~userNodeAttr`]?.width?a.width=r[`~userNodeAttr`].width:a.width=`0.8`),l.fixedsize||(r[`~userNodeAttr`]?.fixedsize?a.fixedsize=r[`~userNodeAttr`].fixedsize:a.fixedsize=`true`),l.margin||(r[`~userNodeAttr`]?.margin?a.margin=r[`~userNodeAttr`].margin:a.margin=`0,0`),l.labelloc||(r[`~userNodeAttr`]?.labelloc?a.labelloc=r[`~userNodeAttr`].labelloc:a.labelloc=`b`),l.imagescale||(r[`~userNodeAttr`]?.imagescale?a.imagescale=r[`~userNodeAttr`].imagescale:a.imagescale=`true`),r[`~trackNodeWithIcon`](u,s)),P(o),o[`~node`](n,u.label,a),se(this)&&r){let e=ce(this,r);r[`~trackPendingIconLoad`](e)}},to(e,t){if(ae(e)){if(e.node=u,e.forward=!0,t===void 0)return e;let n=t;if(Array.isArray(n)){for(let t of n){let n=j({...e.attrs,node:u,forward:!0});u[`~connect`](t,n)}return n}return u[`~connect`](n,e)}let n=e;if(Array.isArray(n)){for(let e of n){let t=j({node:u,forward:!0});u[`~connect`](e,t)}return n}let r=j({node:u,forward:!0});return u[`~connect`](n,r)},from(e,t){if(ae(e)){e.node=u,e.reverse=!0;let n=t;if(Array.isArray(n)){for(let t of n){let n=j({...e.attrs,node:u,reverse:!0});u[`~connect`](t,n)}return u}return u[`~connect`](n,e)}let n=e;if(Array.isArray(n)){for(let e of n){let t=j({node:e,reverse:!0});u[`~connect`](e,t)}return u}let r=j({node:n,reverse:!0});return u[`~connect`](n,r)},with(e,t){if(ae(e)){e.node=u;let n=t;if(Array.isArray(n)){for(let t of n){let n=j({...e.attrs,node:u});u[`~connect`](t,n)}return n}return u[`~connect`](n,e)}let n=e,r=j({node:u});if(Array.isArray(n)){for(let e of n)u[`~connect`](e,r);return n}return u[`~connect`](n,r)},"~connect"(e,t){if(!e||typeof e!=`object`||!(`nodeId`in e))throw Error(`${String(e)} is not a valid Node`);if(!t||typeof t!=`object`||!(`attrs`in t))throw Error(`${String(t)} is not a valid Edge`);if(!r)throw Error(`Node is not registered with a diagram`);return r[`~connect`](u,e,t),e}};return u}function P(e){return typeof e==`object`&&!!e&&`getNodes`in e&&typeof e.getNodes==`function`}function se(e){return`~getIconUrl`in e&&typeof e[`~getIconUrl`]==`function`}async function ce(e,t){let n=e,r=n[`~getIconUrl`]();if(r.startsWith(`data:`)){t[`~trackNodeWithIcon`](e,r);return}try{let r=await n.loadIcon();r&&t[`~trackNodeWithIcon`](e,r)}catch(t){console.warn(`Failed to load custom icon for node ${e.nodeId}:`,t)}}const le=new Map;function F(e,t,n){let r=t.startsWith(`data:`);return{...N(e,{shape:`none`,height:`0.9`,width:`0.8`,fixedsize:`true`,margin:`0,0`,labelloc:`b`,imagescale:`true`,...n,...r?{"~iconDataUrl":t}:{}}),"~iconUrl":t,get"~iconDataUrl"(){return t.startsWith(`data:`)?t:null},set"~iconDataUrl"(e){},"~getIconUrl"(){return t},async loadIcon(){if(ue(t))return t;if(le.has(t))return le.get(t);let e;return e=de(t)?fe(t):pe(t),le.set(t,e),e.then(()=>{}).catch(()=>{le.delete(t)}),e}}}function ue(e){return e.startsWith(`data:`)}function de(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}async function fe(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),1e4),r=await globalThis.fetch(e,{signal:t.signal});if(clearTimeout(n),!r.ok)return console.warn(`Failed to fetch icon: ${e}`),null;if(typeof Blob<`u`&&typeof FileReader<`u`)return me(await r.blob());let i=await r.arrayBuffer(),a=Buffer.from(i);return`data:${r.headers.get(`content-type`)||`image/png`};base64,${a.toString(`base64`)}`}catch(t){return console.warn(`Error fetching icon: ${e}`,t),null}}async function pe(e){try{let t=await import(`node:fs/promises`),n=await import(`node:path`),r=await t.readFile(e),i=n.extname(e).toLowerCase(),a=`image/png`;return i===`.svg`?a=`image/svg+xml`:i===`.jpg`||i===`.jpeg`?a=`image/jpeg`:i===`.gif`?a=`image/gif`:i===`.webp`&&(a=`image/webp`),`data:${a};base64,${r.toString(`base64`)}`}catch(t){return console.warn(`Error loading local icon: ${e}`,t),null}}function me(e){return new Promise((t,n)=>{let r=new FileReader;r.onloadend=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function he(e,t){return F(e,`https://api.iconify.design/${t}.svg`)}let I=null;async function ge(e,t){let n=e=>e.filter(e=>e!=null).join(`/`);if(I===`relative`||!I&&!import.meta.url.endsWith(`.js`))try{let r=await import(n([`.`,e,t]));return I=`relative`,r}catch{}if(I===`direct`||!I)try{let r=await import(n([`.`,`providers`,e,t])+`.js`);return I=`direct`,r}catch{}if(I===`bare`||!I)try{let r=await import(n([`diagrams-js`,e,t]));return I=`bare`,r}catch{}if(I===`cdn`||!I)try{let r=await import(n([`https://esm.sh`,`diagrams-js`,e,t]));return I=`cdn`,r}catch{}return null}async function _e(e){let t=new Map;for(let[n,r]of e){let e=await ge(n,r);if(e)for(let[n,r]of Object.entries(e))typeof r==`function`&&!n.startsWith(`_`)&&t.set(n,r)}return t}async function ve(){return await ge(`resources-list`)}async function ye(){return await ge(`yaml`)}const be=new Set([`shape`,`height`,`width`,`fixedsize`,`margin`,`labelloc`,`imagescale`]),xe={shape:`none`,height:`0.9`,width:`0.8`,fixedsize:`true`,margin:`0,0`,labelloc:`b`,imagescale:`true`};function L(e,t,n,r){let i={id:e};if(t&&(i.label=t),r){let e=r,t=e[`~provider`],n=e[`~type`],a=e[`~resource`];t&&(i.provider=t),n&&(i.type=n),a&&(i.resource=a),`~getIconUrl`in e&&typeof e[`~getIconUrl`]==`function`&&(i.iconUrl=e[`~getIconUrl`]()),r.metadata&&Object.keys(r.metadata).length>0&&(i.metadata=r.metadata)}let a=i.provider!=null,o=i.iconUrl!=null,s=a||o,c={};for(let[e,t]of Object.entries(n))if(!e.startsWith(`~`)){if(s&&be.has(e)){let n=xe[e];if(n!==void 0&&String(t)===n)continue}c[e]=typeof t==`number`?t:String(t)}return Object.keys(c).length>0&&(i.attrs=c),i}function R(e,t,n){let r={label:e.label},i=[];for(let[r,{label:a,attrs:o}]of e.getNodes())i.push(r),t.push(L(r,a,o,n.get(r)));i.length>0&&(r.nodes=i);let a={};for(let[t,n]of Object.entries(e.graphAttr))t===`shape`||t===`style`||t===`labeljust`||t===`fontname`||t===`fontsize`||t===`label`||t===`pencolor`||t===`bgcolor`||(a[t]=n);Object.keys(a).length>0&&(r.graphAttr=a);let o=e.getSubgraphs();return o.length>0&&(r.clusters=o.map(e=>R(e,t,n))),r}function Se(e){return e.map(e=>{let t={from:e.from,to:e.to},{dir:n,label:r,color:i,style:a,...o}=e.attrs;return n&&n!==`forward`&&(t.direction=n),r&&(t.label=r),i&&(t.color=i),a&&(t.style=a),Object.keys(o).length>0&&(t.attrs=o),t})}function Ce(e,t,n,r,i,a,o){let s={nodes:[]};e.name&&(s.name=e.name);let c=e.name?e.name.toLowerCase().replace(/\s+/g,`_`):`diagram`;e.filename!==c&&(s.filename=e.filename),e.direction!==`LR`&&(s.direction=e.direction),e.curveStyle!==`ortho`&&(s.curvestyle=e.curveStyle),e.autolabel&&(s.autolabel=e.autolabel),e.strict&&(s.strict=e.strict),e.theme!==`pastel`&&(s.theme=e.theme),o.graphAttr&&Object.keys(o.graphAttr).length>0&&(s.graphAttr={...o.graphAttr}),o.nodeAttr&&Object.keys(o.nodeAttr).length>0&&(s.nodeAttr={...o.nodeAttr}),o.edgeAttr&&Object.keys(o.edgeAttr).length>0&&(s.edgeAttr={...o.edgeAttr});let l=new Map(a);for(let e of i)l.has(e.node.nodeId)||l.set(e.node.nodeId,e.node);let u=new Set;function d(e){for(let[t]of e.getNodes())u.add(t);for(let t of e.getSubgraphs())d(t)}for(let e of r)d(e);let f=[];for(let[e,{label:n,attrs:r}]of t)u.has(e)||s.nodes.push(L(e,n,r,l.get(e)));return r.length>0&&(s.clusters=r.map(e=>R(e,f,l)),s.nodes.push(...f)),n.length>0&&(s.edges=Se(n)),s}async function z(e,t){let n=typeof e==`string`?JSON.parse(e):e;if(!n.nodes||!Array.isArray(n.nodes))throw Error(`Invalid diagram JSON: 'nodes' array is required`);let r=new Map;for(let e of n.nodes){let t=e.resource==null&&e.service||e.type;if(e.provider&&t){let n=`${e.provider}/${t}`;r.set(n,[e.provider,t])}}let i=await _e(Array.from(r.values()));if(t?.providers)for(let e of t.providers)for(let[t,n]of Object.entries(e))typeof n==`function`&&!t.startsWith(`_`)&&i.set(t,n);let a={};n.name!==void 0&&(a.name=n.name),n.filename!==void 0&&(a.filename=n.filename),n.direction!==void 0&&(a.direction=n.direction),n.curvestyle!==void 0&&(a.curvestyle=n.curvestyle),n.autolabel!==void 0&&(a.autolabel=n.autolabel),n.strict!==void 0&&(a.strict=n.strict),n.theme!==void 0&&(a.theme=n.theme),n.graphAttr!==void 0&&(a.graphAttr=n.graphAttr),n.nodeAttr!==void 0&&(a.nodeAttr=n.nodeAttr),n.edgeAttr!==void 0&&(a.edgeAttr=n.edgeAttr);let o=Q(n.name??``,a),s=new Map,c=new Map;if(n.clusters){function e(t,n){let r=[...n,t.label];if(t.nodes)for(let e of t.nodes)c.set(e,r);if(t.clusters)for(let n of t.clusters)e(n,r)}for(let t of n.clusters)e(t,[])}let l=new Map;if(n.clusters){function e(t,n){let r=n.cluster(t.label);if(t.graphAttr&&Object.assign(r.graphAttr,t.graphAttr),l.set(t.label,r),t.clusters)for(let n of t.clusters)e(n,r)}for(let t of n.clusters)e(t,o)}let u=new Set;for(let e of n.nodes){if(u.has(e.id))throw Error(`Duplicate node ID: "${e.id}"`);u.add(e.id);let t,n=e.resource!=null,r=n?e.type:e.service||e.type,a=n?e.resource:e.type,d=a?i.get(a):void 0;if(d)t=d(e.label??``,{nodeId:e.id,...e.attrs});else if(e.iconUrl&&we(e.iconUrl)){let n={nodeId:e.id};e.attrs&&Object.assign(n,e.attrs),t=F(e.label??``,e.iconUrl,n)}else{let n={nodeId:e.id};e.attrs&&Object.assign(n,e.attrs),t=N(e.label??``,n);let i=t;e.provider&&(i[`~provider`]=e.provider),r&&(i[`~type`]=r),a&&(i[`~resource`]=a),e.iconUrl&&(i[`~iconDataUrl`]=e.iconUrl)}e.metadata&&(t.metadata=e.metadata);let f=c.get(e.id);if(f&&f.length>0){let e=f[f.length-1],n=l.get(e);n?n.add(t):o.add(t)}else o.add(t);s.set(e.id,t)}if(n.edges)for(let e of n.edges){let t=s.get(e.from),n=s.get(e.to);if(!t)throw Error(`Edge references unknown source node: "${e.from}"`);if(!n)throw Error(`Edge references unknown target node: "${e.to}"`);let r=e.direction??`forward`,i={};e.label&&(i.label=e.label),e.color&&(i.color=e.color),e.style&&(i.style=e.style),e.attrs&&Object.assign(i,e.attrs);let a=j(i);switch(r){case`forward`:a.forward=!0;break;case`back`:a.reverse=!0;break;case`both`:a.forward=!0,a.reverse=!0;break;case`none`:break;default:a.forward=!0}t[`~connect`](n,a)}return o}function we(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}let B=function(e){return e.BEFORE_IMPORT=`before:import`,e.AFTER_IMPORT=`after:import`,e.BEFORE_EXPORT=`before:export`,e.AFTER_EXPORT=`after:export`,e.BEFORE_RENDER=`before:render`,e.AFTER_RENDER=`after:render`,e.BEFORE_SERIALIZE=`before:serialize`,e.AFTER_DESERIALIZE=`after:deserialize`,e.NODE_CREATE=`node:create`,e.EDGE_CREATE=`edge:create`,e.CLUSTER_CREATE=`cluster:create`,e.METADATA_ATTACH=`metadata:attach`,e.METADATA_CALCULATE=`metadata:calculate`,e}({});var V=class extends Error{constructor(e,t,n){super(e),this.pluginName=t,this.cause=n,this.name=`PluginError`}},Te=class extends V{constructor(e,t,n){super(`Plugin "${e}" has unresolved dependencies: ${t.join(`, `)}`,e),this.missingDependencies=t,this.circularDependencies=n,this.name=`DependencyError`}},H=class extends V{constructor(e,t,n){super(`Plugin "${e}" does not support ${n} runtime`,e),this.requiredRuntimes=t,this.currentRuntime=n,this.name=`RuntimeError`}};function Ee(){return globalThis.Deno===void 0?globalThis.Bun===void 0?typeof window<`u`&&typeof document<`u`?`browser`:(typeof process<`u`&&process.versions?.node,`node`):`bun`:`deno`}function De(e){let t=Ee();if(!e[t])throw new H(`unknown`,e,t)}function Oe(e){let t=new Set,n=new Set,r=[],i=[];function a(o,s=[]){if(n.has(o)){let e=s.indexOf(o);i.push(...s.slice(e),o);return}if(t.has(o))return;let c=e.get(o);if(c){n.add(o),s.push(o);for(let e of c.plugin.dependencies||[])a(e,[...s]);n.delete(o),t.add(o),r.push(c)}}for(let[n]of e)t.has(n)||a(n);if(i.length>0)throw new Te(i[0],[],i);return r}function ke(){let e=new Map,t=new Map,n=new Map,r=new Map,i=new Map,a=new Map,o=new Map,s=new Map;function c(){return{registry:f,fetch:globalThis.fetch.bind(globalThis),getPlugin:t=>e.get(t),getImporter:e=>n.get(e),getExporter:e=>r.get(e),getRenderer:e=>i.get(e),getMetadataProvider:e=>a.get(e),executeHooks:async(e,t)=>f.executeHooks(e,t),loadResourcesList:()=>ve(),loadYaml:()=>ye(),lib:Qe}}function l(e){for(let t of e.capabilities)switch(t.type){case`importer`:n.set(t.name,t);break;case`exporter`:r.set(t.name,t);break;case`renderer`:i.set(t.name,t);for(let e of t.formats)i.set(e,t);break;case`metadata`:a.set(t.provider,t);break;case`hook`:for(let{event:n,handler:r,priority:i=0}of t.hooks){let t=o.get(n)||[];t.push({handler:r,priority:i,pluginName:e.name}),t.sort((e,t)=>t.priority-e.priority),o.set(n,t)}break}}function u(e){for(let t of e.capabilities)switch(t.type){case`importer`:n.delete(t.name);break;case`exporter`:r.delete(t.name);break;case`renderer`:i.delete(t.name);for(let e of t.formats)i.delete(e);break;case`metadata`:a.delete(t.provider);break;case`hook`:for(let{event:n}of t.hooks){let t=o.get(n);if(t){let r=t.filter(t=>t.pluginName!==e.name);r.length===0?o.delete(n):o.set(n,r)}}break}}async function d(){if(s.size===0)return;for(let[t,{plugin:n}]of s)if(n.dependencies){let r=n.dependencies.filter(t=>!e.has(t)&&!s.has(t));if(r.length>0)throw new Te(t,r)}let n=Oe(s);for(let{plugin:r,config:i}of n){try{De(r.runtimeSupport)}catch(e){throw e instanceof H?new H(r.name,r.runtimeSupport,Ee()):e}if(r.requiredConfig){let e=i,t=r.requiredConfig.filter(t=>!e||e[t]===void 0);if(t.length>0)throw new V(`Plugin "${r.name}" requires configuration: ${t.join(`, `)}`,r.name)}if(r.initialize){let e=c();await r.initialize(i,e)}e.set(r.name,r),t.set(r.name,i),l(r)}s.clear()}let f={register:async t=>{if(!t.name)throw new V(`Plugin must have a name`);if(!t.version)throw new V(`Plugin must have a version`,t.name);if(!t.apiVersion)throw new V(`Plugin must have an apiVersion`,t.name);if(!t.capabilities||t.capabilities.length===0)throw new V(`Plugin must have at least one capability`,t.name);if(!t.runtimeSupport)throw new V(`Plugin must declare runtimeSupport`,t.name);if(e.has(t.name))throw new V(`Plugin "${t.name}" is already registered`,t.name);s.set(t.name,{plugin:t,config:void 0}),await d()},unregister:async n=>{let r=e.get(n);if(!r)throw new V(`Plugin "${n}" is not registered`,n);let i=[];for(let[t,r]of e)r.dependencies?.includes(n)&&i.push(t);if(i.length>0)throw new V(`Cannot unregister "${n}" - required by: ${i.join(`, `)}`,n);r.destroy&&await r.destroy(),u(r),e.delete(n),t.delete(n),console.log(`✗ Plugin "${n}" unregistered`)},getPlugin:t=>e.get(t),getImporter:e=>n.get(e),getExporter:e=>r.get(e),getRenderer:e=>i.get(e),getMetadataProvider:e=>a.get(e),executeHooks:async(e,t)=>{let n=o.get(e)||[],r=t;for(let{handler:t,pluginName:i}of n)try{let n=c(),i=await t(r,{...n,event:e});i!==void 0&&(r=i)}catch(t){console.error(`Hook error in plugin "${i}" for event "${e}":`,t)}return r},listPlugins:()=>Array.from(e.values()),listCapabilities:()=>({importers:Array.from(n.keys()),exporters:Array.from(r.keys()),renderers:Array.from(i.keys()),metadataProviders:Array.from(a.keys())}),loadResourcesList:()=>ve(),loadYaml:()=>ye()};return f}function U(){return{name:`json`,version:`1.0.0`,apiVersion:`1.0`,runtimeSupport:{node:!0,browser:!0,deno:!0,bun:!0},capabilities:[{type:`importer`,name:`json`,extensions:[`.json`],mimeTypes:[`application/json`],canImport:async e=>{try{let t=Array.isArray(e)?e:[e];for(let e of t){let t=JSON.parse(e);if(!t||typeof t!=`object`||!Array.isArray(t.nodes))return!1}return!0}catch{return!1}},import:async(e,t,n)=>{let r=Array.isArray(e)?e:[e];for(let e=0;e<r.length;e++)await W(t,await z(JSON.parse(r[e])),n.lib)}},{type:`exporter`,name:`json`,extension:`.json`,mimeType:`application/json`,export:async e=>{let t=e.toJSON();return JSON.stringify(t,null,2)}}]}}async function W(e,t,n){let r=t.toJSON(),i=new Map;for(let e of r.nodes){let t=e.resource==null&&e.service||e.type;if(e.provider&&t){let n=`${e.provider}/${t}`;i.set(n,[e.provider,t])}}let a=await _e(Array.from(i.values())),o=new Map;function s(t){let r=t.toJSON();for(let t of r.nodes){let r=t.resource||t.type,i=r?a.get(r):void 0,s;if(i){let e={nodeId:t.id};t.attrs&&Object.assign(e,t.attrs),s=i(t.label||t.id,e)}else if(t.iconUrl&&Ae(t.iconUrl)){let e={nodeId:t.id};t.attrs&&Object.assign(e,t.attrs),s=n.Custom(t.label||t.id,t.iconUrl,e)}else{let e={nodeId:t.id};t.provider&&(e[`~provider`]=t.provider);let i=t.resource==null&&t.service||t.type;i&&(e[`~type`]=i),r&&(e[`~resource`]=r),t.iconUrl&&(e[`~iconDataUrl`]=t.iconUrl),t.attrs&&Object.assign(e,t.attrs),s=n.Node(t.label||t.id,e)}t.metadata&&(s.metadata=t.metadata),e.add(s),o.set(t.id,s)}}if(s(t),r.clusters)for(let t of r.clusters){let n=e.cluster(t.label);if(t.graphAttr&&Object.assign(n.graphAttr,t.graphAttr),t.nodes)for(let e of t.nodes){let t=o.get(e);t&&n.add(t)}}if(r.edges)for(let e of r.edges){let t=o.get(e.from),r=o.get(e.to);if(t&&r){let i={};e.label&&(i.label=e.label),e.color&&(i.color=e.color),e.style&&(i.style=e.style),e.direction&&(i.dir=e.direction),e.attrs&&Object.assign(i,e.attrs);let a=n.Edge(i);switch(e.direction??`forward`){case`forward`:a.forward=!0;break;case`back`:a.reverse=!0;break;case`both`:a.forward=!0,a.reverse=!0;break;case`none`:break;default:a.forward=!0}t[`~connect`](r,a)}}}function Ae(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}const je=U();function Me(e){if(typeof Buffer<`u`)return Buffer.from(e,`utf-8`).toString(`base64`);let t=new TextEncoder().encode(e),n=``;for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return btoa(n)}function G(e){if(typeof Buffer<`u`)return Buffer.from(e,`base64`).toString(`utf-8`);let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return new TextDecoder().decode(n)}function Ne(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function Pe(e){let t={"data-node-id":e.id};return e.label!==void 0&&(t[`data-node-label`]=e.label),e.provider!==void 0&&(t[`data-node-provider`]=e.provider),e.type!==void 0&&(t[`data-node-type`]=e.type),e.resource!==void 0&&(t[`data-node-resource`]=e.resource),e.metadata&&Object.keys(e.metadata).length>0&&(t[`data-node-metadata`]=Me(JSON.stringify(e.metadata))),Object.entries(t).map(([e,t])=>`${e}="${Ne(t)}"`).join(` `)}function Fe(e){let t={"data-cluster-label":e.label};return e.nodes&&e.nodes.length>0&&(t[`data-cluster-nodes`]=e.nodes.join(`,`)),Object.entries(t).map(([e,t])=>`${e}="${Ne(t)}"`).join(` `)}function Ie(e,t,n,r){if(!r)return e;let i=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=RegExp(`<g\\b([^>]*)class="${t}"([^>]*)>((?:(?!<g\\b)[\\s\\S])*?)<title>${i}<\\/title>`,`g`);return e.replace(a,(e,i,a,o)=>`<g${i}class="${t}"${a} ${r}>${o}<title>${n}</title>`)}function Le(e,t){let n=Me(JSON.stringify(t));e=e.replace(/<svg\b([^>]*)>/,`<svg$1 data-diagram-version="1.0" data-diagram-json="${n}">`);for(let n of t.nodes){let t=Pe(n);e=Ie(e,`node`,n.id,t)}if(t.clusters)for(let n of t.clusters){let t=`cluster_${n.label.replace(/\s+/g,`_`)}`,r=Fe(n);e=Ie(e,`cluster`,t,r)}return e}function Re(e){let t=e.match(/data-diagram-json="([^"]+)"/);if(!t)return null;try{let e=G(t[1]);return JSON.parse(e)}catch{return null}}function K(){return{name:`svg`,version:`1.0.0`,apiVersion:`1.0`,runtimeSupport:{node:!0,browser:!0,deno:!0,bun:!0},capabilities:[{type:`importer`,name:`svg`,extensions:[`.svg`],mimeTypes:[`image/svg+xml`],canImport:async e=>{let t=Array.isArray(e)?e:[e];for(let e of t)if(typeof e!=`string`||!e.trim().startsWith(`<svg`)&&!e.includes(`<svg`)||!e.includes(`data-diagram-json="`))return!1;return!0},import:async(e,t,n)=>{let r=Array.isArray(e)?e:[e];for(let e of r){let r=Re(e);if(!r)throw Error(`Invalid diagram SVG: missing or corrupted embedded diagram data. Make sure the SVG was exported using diagrams-js SVG export.`);let i=n.getImporter(`json`);i?await i.import(JSON.stringify(r),t,n):await W(t,await z(r),n.lib)}}},{type:`exporter`,name:`svg`,extension:`.svg`,mimeType:`image/svg+xml`,export:async e=>await e.render({format:`svg`})}]}}const q=K(),J={light:{added:{border:`#2EA043`,fill:`rgba(46, 160, 67, 0.1)`,badge:`#2EA043`},removed:{border:`#F85149`,fill:`rgba(248, 81, 73, 0.1)`,badge:`#F85149`},modified:{border:`#D29922`,fill:`rgba(210, 153, 34, 0.1)`,badge:`#D29922`},unchanged:{border:`#8C959F`,fill:`transparent`,badge:`#8C959F`}},dark:{added:{border:`#3FB950`,fill:`rgba(63, 185, 80, 0.15)`,badge:`#3FB950`},removed:{border:`#F85149`,fill:`rgba(248, 81, 73, 0.15)`,badge:`#F85149`},modified:{border:`#D29922`,fill:`rgba(210, 153, 34, 0.15)`,badge:`#D29922`},unchanged:{border:`#6E7681`,fill:`transparent`,badge:`#6E7681`}}};function ze(e){return`${e.label||``}|${e.provider||``}|${e.type||``}|${e.resource||``}`}function Y(e){return`${e.provider||``}|${e.type||``}|${e.resource||``}`}function X(e,t){if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0}function Be(e,t,n=[]){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(e===null||t===null||typeof e!=`object`)return e===t;let r=e,i=t,a=Object.keys(r).filter(e=>!n.includes(e)),o=Object.keys(i).filter(e=>!n.includes(e));if(a.length!==o.length)return!1;for(let e of a){if(!o.includes(e))return!1;let t=n.filter(t=>t.startsWith(`${e}.`)).map(t=>t.slice(e.length+1));if(!Be(r[e],i[e],t))return!1}return!0}function Z(e,t,n=``,r=[]){let i=[],a=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of a){let a=n?`${n}.${o}`:o;if(r.includes(a))continue;let s=e[o],c=t[o];if(!(o in e))i.push(`${a} (added)`);else if(!(o in t))i.push(`${a} (removed)`);else if(typeof s==`object`&&s&&typeof c==`object`&&c){let e=Z(s,c,a,r);i.push(...e)}else s!==c&&i.push(`${a}: ${JSON.stringify(s)} → ${JSON.stringify(c)}`)}return i}function Ve(e,t,n={}){let r=typeof e.toJSON==`function`?e.toJSON():e,i=typeof t.toJSON==`function`?t.toJSON():t,a=[];if(n.ignore?.position!==!1&&a.push(`attrs.pos`,`attrs.lp`),n.ignore?.attrs)for(let e of n.ignore.attrs)a.push(`attrs.${e}`);if(n.ignore?.metadata===!0)a.push(`metadata`);else if(Array.isArray(n.ignore?.metadata))for(let e of n.ignore.metadata)a.push(`metadata.${e}`);let o={nodes:new Map,edges:new Map,clusters:[],summary:{added:0,removed:0,modified:0,unchanged:0},meta:{}};r.name!==i.name&&(o.meta.name={before:r.name,after:i.name}),r.theme!==i.theme&&(o.meta.theme={before:r.theme,after:i.theme}),r.direction!==i.direction&&(o.meta.direction={before:r.direction,after:i.direction}),r.curvestyle!==i.curvestyle&&(o.meta.curvestyle={before:r.curvestyle,after:i.curvestyle}),Z(r.graphAttr||{},i.graphAttr||{},``).length>0&&(o.meta.graphAttr={before:r.graphAttr,after:i.graphAttr}),Z(r.nodeAttr||{},i.nodeAttr||{},``).length>0&&(o.meta.nodeAttr={before:r.nodeAttr,after:i.nodeAttr}),Z(r.edgeAttr||{},i.edgeAttr||{},``).length>0&&(o.meta.edgeAttr={before:r.edgeAttr,after:i.edgeAttr});let s=new Map(r.nodes.map(e=>[e.id,e])),c=new Map(i.nodes.map(e=>[e.id,e])),l=new Set,u=new Set,d=new Map,f=new Map(r.nodes.map(e=>[ze(e),e.id]));for(let[e,t]of c){let n=ze(t);if(f.has(n)){let r=f.get(n),i=s.get(r);if(l.has(r)||u.has(e))continue;l.add(r),u.add(e),d.set(e,r);let c=Z(i,t,``,[...a,`id`]);c.length===0?(o.nodes.set(e,{kind:`unchanged`,before:i,after:t}),o.summary.unchanged++):(o.nodes.set(e,{kind:`modified`,before:i,after:t,changes:c}),o.summary.modified++)}}let p=Array.from(s.entries()).filter(([e])=>!l.has(e)),m=Array.from(c.entries()).filter(([e])=>!u.has(e)),h=new Map;for(let[e,t]of p){let n=Y(t);h.has(n)||h.set(n,[]),h.get(n).push(e)}let g=new Map;for(let[e,t]of m){let n=Y(t);g.has(n)||g.set(n,[]),g.get(n).push(e)}function _(e,t,n){let r=new Set;for(let i of t){let t=i.from===e,a=i.to===e;if(!t&&!a)continue;let o=t?i.to:i.from,s=n?o:d.get(o)||o,c=n?l.has(o):d.has(o);s&&c&&r.add(s)}return r}for(let[e,t]of g){let n=h.get(e);if(!n||n.length===0)continue;let a=t.map(e=>({id:e,node:c.get(e),connected:_(e,i.edges||[],!1)})),f=n.map(e=>({id:e,node:s.get(e),connected:_(e,r.edges||[],!0)}));for(let e of a){if(u.has(e.id))continue;let t=f.find(t=>!l.has(t.id)&&X(e.connected,t.connected)&&e.connected.size>0);if(t){l.add(t.id),u.add(e.id),d.set(e.id,t.id);let n=t.node,r=e.node;n.label===r.label?(o.nodes.set(e.id,{kind:`unchanged`,before:n,after:r}),o.summary.unchanged++):(o.nodes.set(e.id,{kind:`modified`,before:n,after:r,changes:[`label: "${n.label}" → "${r.label}"`]}),o.summary.modified++)}}}let v=Array.from(s.entries()).filter(([e])=>!l.has(e)),y=Array.from(c.entries()).filter(([e])=>!u.has(e)),b=new Map;for(let[e,t]of v){let n=Y(t);b.has(n)||b.set(n,[]),b.get(n).push(e)}let x=new Map;for(let[e,t]of y){let n=Y(t);x.has(n)||x.set(n,[]),x.get(n).push(e)}for(let[e,t]of x){let n=b.get(e);if(!n)continue;let r=Math.min(t.length,n.length);for(let e=0;e<r;e++){let r=t[e],i=n[e];if(l.has(i)||u.has(r))continue;let a=s.get(i),f=c.get(r);l.add(i),u.add(r),d.set(r,i),a.label===f.label?(o.nodes.set(r,{kind:`unchanged`,before:a,after:f}),o.summary.unchanged++):(o.nodes.set(r,{kind:`modified`,before:a,after:f,changes:[`label: "${a.label}" → "${f.label}"`]}),o.summary.modified++)}}for(let[e,t]of s)l.has(e)||(o.nodes.set(e,{kind:`removed`,before:t}),o.summary.removed++);for(let[e,t]of c)u.has(e)||(o.nodes.set(e,{kind:`added`,after:t}),o.summary.added++);let S=r.edges||[],C=i.edges||[];function w(e,t){let n,r;return t===`before`?(n=e.from,r=e.to):(n=d.get(e.from)||e.from,r=d.get(e.to)||e.to),`${n}->${r}`}function T(e){return`${e.from}->${e.to}[${e.label||``}]`}let E=new Map;for(let e of S)E.set(w(e,`before`),e);let D=new Map;for(let e of C)D.set(w(e,`after`),e);let O=new Set,k=new Set;for(let[e,t]of D)if(E.has(e)){let n=E.get(e),r=T(n),i=T(t);O.add(r),k.add(i);let s=Z(n,t,``,[...a,`from`,`to`]);s.length===0?(o.edges.set(i,{kind:`unchanged`,before:n,after:t}),o.summary.unchanged++):(o.edges.set(i,{kind:`modified`,before:n,after:t,changes:s}),o.summary.modified++)}for(let e of C){let t=T(e);k.has(t)||(o.edges.set(t,{kind:`added`,after:e}),o.summary.added++)}for(let e of S){let t=T(e);O.has(t)||(o.edges.set(t,{kind:`removed`,before:e}),o.summary.removed++)}function A(e=[],t=[],n=[]){let r=[],i=new Map(e.map(e=>[e.label,e])),a=new Map(t.map(e=>[e.label,e])),s=new Set([...i.keys(),...a.keys()]);for(let e of s){let t=i.get(e),s=a.get(e);if(t&&s){let i=[];Be(t.graphAttr||{},s.graphAttr||{})||i.push(`graphAttr`);let a=A(t.clusters,s.clusters,[...n,e]),c={kind:i.length>0?`modified`:`unchanged`,label:e,before:t,after:s,changes:i.length>0?i:void 0,clusters:a.length>0?a:void 0};r.push(c),i.length>0?o.summary.modified++:o.summary.unchanged++}else t?(r.push({kind:`removed`,label:e,before:t}),o.summary.removed++):s&&(r.push({kind:`added`,label:e,after:s}),o.summary.added++)}return r}return o.clusters=A(r.clusters,i.clusters),o}function He(e,t,n,r,i){let a=J[r],o=e;return o=o.replace(/<g([^>]*)class="node"([^>]*)>([\s\S]*?)<title>([^<]+)<\/title>([\s\S]*?)<\/g>/g,(e,r,o,s,c,l)=>{let u=t.get(c);if(!u)return e;let d=u.kind;if(n===`before`&&d===`added`&&(d=`unchanged`),n===`after`&&d===`removed`&&(d=`unchanged`),d===`unchanged`&&i===`hide`)return``;let f=a[d],p=d===`unchanged`&&i===`dim`?`0.4`:`1`,m=d===`unchanged`?``:`filter: drop-shadow(0 0 4px ${f.border}) drop-shadow(0 0 4px ${f.border});`,h=`${r}data-diff-kind="${d}" ${o}`,g=e.replace(/<g([^>]*)class="node"/,`<g${h}class="node" style="opacity:${p};${m}"`);return d!==`unchanged`&&(g=g.replace(/<ellipse([^>]*)style="([^"]*)"/g,(e,t,n)=>`<ellipse${t}style="${n};fill:${f.fill}"`).replace(/<ellipse(?![^>]*style=)/g,`<ellipse style="fill:${f.fill}"`).replace(/<polygon([^>]*)style="([^"]*)"/g,(e,t,n)=>`<polygon${t}style="${n};fill:${f.fill}"`).replace(/<polygon(?![^>]*style=)/g,`<polygon style="fill:${f.fill}"`)),g}),o=o.replace(/<g([^>]*)class="edge"([^>]*)>([\s\S]*?)<title>([^<]+)<\/title>([\s\S]*?)<\/g>/g,(e,r,o,s,c,l)=>{let u=t.get(c);if(!u)return e;let d=u.kind;if(n===`before`&&d===`added`&&(d=`unchanged`),n===`after`&&d===`removed`&&(d=`unchanged`),d===`unchanged`&&i===`hide`)return``;let f=a[d],p=d===`unchanged`&&i===`dim`?`0.4`:`1`,m=d===`unchanged`?``:`stroke:${f.border};stroke-width:2;filter: drop-shadow(0 0 2px ${f.border});`,h=`${r}data-diff-kind="${d}" ${o}`;return e.replace(/<g([^>]*)class="edge"/,`<g${h}class="edge" style="opacity:${p}"`).replace(/<path/g,`<path style="${m}"`).replace(/<polygon/g,`<polygon style="fill:${f.border};stroke:${f.border}"`)}),o}function Ue(e,t,n,r){let i=J[r.theme],{summary:a,meta:o}=n,s=[];o.name&&s.push(`Name: "${o.name.before}" → "${o.name.after}"`),o.theme&&s.push(`Theme: ${o.theme.before} → ${o.theme.after}`),o.direction&&s.push(`Direction: ${o.direction.before} → ${o.direction.after}`),o.curvestyle&&s.push(`Curve style: ${o.curvestyle.before} → ${o.curvestyle.after}`);let c=[a.added>0?`<span class="pill added">+${a.added}</span>`:``,a.removed>0?`<span class="pill removed">−${a.removed}</span>`:``,a.modified>0?`<span class="pill modified">~${a.modified}</span>`:``].filter(Boolean).join(` `),l=r.layout===`stacked`?`stacked`:`side-by-side`;return`<!DOCTYPE html>
16
16
  <html lang="en">
17
17
  <head>
18
18
  <meta charset="UTF-8">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "diagrams-js",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "A TypeScript port of the diagrams Python library for drawing cloud system architecture diagrams as code",
5
5
  "keywords": [
6
6
  "architecture",
@@ -6,7 +6,7 @@ description: >
6
6
  ESM-only - requires type="module".
7
7
  type: framework
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  sources:
@@ -6,7 +6,7 @@ description: >
6
6
  Connecting nodes across clusters.
7
7
  type: core
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  - diagrams-js/provider-nodes
@@ -7,7 +7,7 @@ description: >-
7
7
  and context.loadYaml for YAML parsing without bundling dependencies.
8
8
  type: feature
9
9
  library: diagrams-js
10
- library_version: "0.2.4"
10
+ library_version: "0.5.0"
11
11
  sources:
12
12
  - "hatemhosny/diagrams-js:src/plugins/types.ts"
13
13
  - "hatemhosny/plugin-docker-compose:src/index.ts"
@@ -6,7 +6,7 @@ description: >
6
6
  Async icon loading with automatic injection into SVG output.
7
7
  type: core
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  sources:
@@ -6,7 +6,7 @@ description: >
6
6
  Enable autolabel for automatic node type prefixes.
7
7
  type: core
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  sources:
@@ -6,7 +6,7 @@ description: >
6
6
  code reviews, documentation, and architecture evolution tracking.
7
7
  type: core
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  - diagrams-js/json-serialization
@@ -6,7 +6,7 @@ description: >
6
6
  Covers ES modules, import maps, and basic diagram lifecycle.
7
7
  type: lifecycle
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  sources:
11
11
  - "hatemhosny/diagrams-js:docs/docs/getting-started/quickstart.mdx"
12
12
  - "hatemhosny/diagrams-js:docs/docs/getting-started/installation.mdx"
@@ -5,7 +5,7 @@ description: >
5
5
  infrastructure-as-code integration, and tool interoperability. Import JSON with automatic icon resolution.
6
6
  type: core
7
7
  library: diagrams-js
8
- library_version: "0.0.9"
8
+ library_version: "0.5.0"
9
9
  requires:
10
10
  - diagrams-js/getting-started
11
11
  - diagrams-js/provider-nodes
@@ -6,7 +6,7 @@ description: >
6
6
  Chaining connections and connecting to multiple targets with arrays.
7
7
  type: core
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  - diagrams-js/provider-nodes
@@ -5,7 +5,7 @@ description: >
5
5
  Local icon files for Custom nodes. Buffer handling for binary output formats.
6
6
  type: core
7
7
  library: diagrams-js
8
- library_version: "0.0.9"
8
+ library_version: "0.5.0"
9
9
  requires:
10
10
  - diagrams-js/getting-started
11
11
  sources:
@@ -6,7 +6,7 @@ description: >
6
6
  Elastic, Firebase, Generic, GIS, IBM, OCI, OpenStack, Outscale, Programming, SaaS, C4.
7
7
  type: core
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  sources:
@@ -6,7 +6,7 @@ description: >
6
6
  Key differences: explicit diagram.add(), async render(), no destroy().
7
7
  type: lifecycle
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  sources:
@@ -5,7 +5,7 @@ description: >
5
5
  DOT format as Graphviz source, JSON for serialization. Data URLs for embedding. Saving files with diagram.save().
6
6
  type: core
7
7
  library: diagrams-js
8
- library_version: "0.0.9"
8
+ library_version: "0.5.0"
9
9
  requires:
10
10
  - diagrams-js/getting-started
11
11
  sources:
@@ -6,7 +6,7 @@ description: >
6
6
  Alternative to JSON serialization with self-contained visual + data format.
7
7
  type: core
8
8
  library: diagrams-js
9
- library_version: "0.0.9"
9
+ library_version: "0.5.0"
10
10
  requires:
11
11
  - diagrams-js/getting-started
12
12
  - diagrams-js/provider-nodes