likec4 1.50.0 → 1.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__app__/src/likec4.js +16 -22
- package/__app__/src/main.js +2 -56
- package/__app__/src/routes/index.js +81 -16
- package/__app__/src/routes/single.js +18 -5
- package/__app__/src/style.css +1 -1
- package/__app__/src/vendors.js +16723 -16723
- package/dist/THIRD-PARTY-LICENSES.md +161 -61
- package/dist/_chunks/LikeC4.mjs +1 -1154
- package/dist/_chunks/filesystem.mjs +1230 -0
- package/dist/_chunks/index2.d.mts +13 -14
- package/dist/_chunks/libs/@logtape/logtape.mjs +1 -1
- package/dist/_chunks/libs/ansi-align.mjs +2 -0
- package/dist/_chunks/libs/ansi-regex.mjs +1 -0
- package/dist/_chunks/libs/ansi-styles.mjs +1 -0
- package/dist/_chunks/libs/atomically.mjs +1 -1
- package/dist/_chunks/libs/boxen.d.mts +1 -0
- package/dist/_chunks/libs/boxen.mjs +22 -0
- package/dist/_chunks/libs/conf.mjs +1 -1
- package/dist/_chunks/libs/langium.d.mts +1 -1
- package/dist/_chunks/libs/langium.mjs +17 -17
- package/dist/_chunks/libs/remeda.mjs +2 -2
- package/dist/_chunks/libs/tinyrainbow.mjs +1 -1
- package/dist/_chunks/libs/vscode-languageserver.mjs +1 -0
- package/dist/_chunks/sequence.mjs +1 -1
- package/dist/_chunks/src2.mjs +64 -64
- package/dist/cli/index.mjs +83 -74
- package/dist/index.d.mts +805 -1
- package/dist/index.mjs +1 -1
- package/dist/vite-plugin/index.mjs +1 -1
- package/dist/vite-plugin/internal.mjs +1 -1
- package/package.json +18 -19
- package/react/index.mjs +17 -23
- package/dist/_chunks/binary.mjs +0 -72
- package/dist/_chunks/libs/@logtape/logtape.d.mts +0 -741
package/dist/_chunks/src2.mjs
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import{t as e}from"./libs/birpc.mjs";import{
|
|
1
|
+
import{t as e}from"./libs/birpc.mjs";import{C as t,D as n,I as r,S as i,W as a,Z as o,b as s,f as c,k as l,o as u,q as d,r as f,t as p,y as m}from"./libs/remeda.mjs";import{_ as h,c as g,d as _,f as v,i as y,l as b,m as x,o as ee,r as S,s as te,t as ne,x as re}from"./filesystem.mjs";import{t as C}from"./libs/defu.mjs";import{r as w,t as T}from"./libs/pathe.mjs";import{n as E}from"./libs/tinyrainbow.mjs";import{t as D}from"./libs/json5.mjs";import{a as O,i as k,n as A,r as j,t as M}from"./libs/langium.mjs";import{o as N}from"./libs/ufo.mjs";import{t as ie}from"./libs/pako.mjs";import"@likec4/core/model";import{LikeC4Styles as P,invariant as ae,isNonEmptyArray as oe,memoizeProp as se,nonexhaustive as ce}from"@likec4/core";import{pathToFileURL as le}from"url";import{RichText as ue,flattenMarkdownOrString as de}from"@likec4/core/types";import{compareNatural as fe,invariant as pe,sortNaturalByFqn as me}from"@likec4/core/utils";function he(e){let t=h.getChild(`lang`),n=C(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),r=n.graphviz===`binary`;return t.info(`${E.dim(`layout`)} ${r?`binary`:`wasm`}`),S({...n.useFileSystem?{...ee(n.watch),...n.manualLayouts?b:g}:{...te,...g},...y(r?new _:new v)})}async function ge(e,t){ne(t);let n=w(e),r=le(n).toString(),i=r.endsWith(`/`)?r:r+`/`;return se(globalThis,`likec4:`+n,async()=>{let e=h.getChild(`lang`),r=C(t,{useFileSystem:!0,manualLayouts:!0,watch:!1});if(r.mcp)throw Error(`MCP server is not supported in this build`);let a=he(r),o={name:T(n),uri:i},s=a.shared.workspace.WorkspaceManager;e.info(`${E.dim(`workspace:`)} ${n}`),s.initialize({capabilities:{},processId:null,rootUri:null,workspaceFolders:[o]}),await s.initializeWorkspace([o]);let c=a.shared.workspace.LangiumDocuments.userDocuments.toArray();if(c.length===0)throw e.error(`no LikeC4 sources found`),Error(`no LikeC4 sources found`);return e.info(`${E.dim(`workspace:`)} found ${c.length} source files`),x(a,h,t)})}const F=h.getChild(`vite`);async function _e({logger:e,likec4:t},n){e.info([E.green(`adhoc:view`),E.dim(`project:`),n.projectId].join(` `));let r=await t.views.adhocView(n.predicates,n.projectId);return e.info([E.green(`adhoc:view`),`✅`].join(` `)),r}function ve(e){let t=e.split(`
|
|
2
2
|
`),n=/^\s+at\s+/,r=t.findIndex(e=>n.test(e));return r===-1&&(r=1),{message:t.slice(0,r).join(`
|
|
3
3
|
`),stack:t.slice(r).join(`
|
|
4
|
-
`)}}function ye(e,{name:t,error:n}){e.hot.send({type:`error`,err:{...ve(n),name:t??`LikeC4PluginError`,plugin:`vite-plugin-likec4`}})}async function be({logger:e,likec4:t},n){e.info([
|
|
5
|
-
`);n=JSON.parse(t)}catch{}s+=1;continue}if(e.trim()===`// <likec4.strokeColor.vertices>`){for(o=!0,s+=1;s<t.length&&t[s]?.trim()!==`// </likec4.strokeColor.vertices>`;){let e=t[s]?.trim();if(e?.startsWith(`// `)&&e.includes(`=`)){let t=e.slice(3).trim(),n=t.indexOf(`=`);if(n>0){let e=t.slice(0,n).trim(),i=t.slice(n+1).trim();e&&i&&(r[e]=i)}}s+=1}s+=1;continue}if(e.trim()===`// <likec4.strokeWidth.vertices>`){for(o=!0,s+=1;s<t.length&&t[s]?.trim()!==`// </likec4.strokeWidth.vertices>`;){let e=t[s]?.trim();if(e?.startsWith(`// `)&&e.includes(`=`)){let t=e.slice(3).trim(),n=t.indexOf(`=`);if(n>0){let e=t.slice(0,n).trim(),r=t.slice(n+1).trim();e&&r!==``&&(i[e]=r)}}s+=1}s+=1;continue}if(e.trim()===`// <likec4.edge.waypoints>`){for(o=!0,s+=1;s<t.length&&t[s]?.trim()!==`// </likec4.edge.waypoints>`;){let e=t[s]?.trim();if(e?.startsWith(`// `)){let t=e.slice(3).trim(),n=t.indexOf(` `);if(n>0){let e=t.slice(0,n).trim(),r=t.slice(n+1).trim();if(e&&r)try{let t=JSON.parse(r);Array.isArray(t)&&(a[e]=t)}catch{}}}s+=1}s+=1;continue}s+=1}return o?{layoutByView:n,strokeColorByFqn:r,strokeWidthByFqn:i,edgeWaypoints:a}:null}function Me(e){let t=encodeURIComponent(e),n=new TextEncoder().encode(t);return Ne(ie.deflateRaw(n))}function Ne(e){if(typeof Buffer<`u`)return Buffer.from(e).toString(`base64`);let t=``;for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t)}const
|
|
6
|
-
<mxUserObject>`+Object.entries(e).map(([e,t])=>{let n=typeof t==`string`?t:t==null?``:String(t);return`<data key="${
|
|
7
|
-
${u}${
|
|
8
|
-
</mxCell>`}function
|
|
4
|
+
`)}}function ye(e,{name:t,error:n}){e.hot.send({type:`error`,err:{...ve(n),name:t??`LikeC4PluginError`,plugin:`vite-plugin-likec4`}})}async function be({logger:e,likec4:t},n){e.info([E.green(`view:onChange`),E.dim(`project`)+`:`,n.projectId,E.dim(`view`)+`:`,n.viewId,E.dim(`change`)+`:`,n.change.op].join(` `));let r=await t.editor.applyChange(n);if(!r.success){e.error(`Failed to apply view change:\n${r.error}`);let t=Error(r.error);throw t.stack=r.error,t}e.info([E.green(`view:onChange`),`✅`].join(` `))}function xe(t){let n=null,r=t.server;e({updateView:e=>be(t,e),calcAdhocView:e=>_e(t,e)},{on:e=>r.hot.on(`likec4:rpc`,e),post:e=>r.hot.send(`likec4:rpc`,e),onFunctionError:(e,i)=>{t.logger.error(`RPC error in ${i}`,{error:e});let a=e.stack??e.message;try{n!==a&&(n=a,ye(r,{name:e.name,error:a}))}catch(e){t.logger.error(`Failed to send error to client`,{error:e})}}})}const Se=e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),Ce=e=>e.split(`.`).map(Se).join(``),we=e=>Ce(e.parent?e.id.slice(e.parent.length+1):e.id),Te=({autoLayout:e})=>{switch(e.direction){case`TB`:return`down`;case`BT`:return`up`;case`LR`:return`right`;case`RL`:return`left`}},Ee=({shape:e})=>{switch(e){case`queue`:case`cylinder`:case`rectangle`:case`document`:return e;case`person`:return`c4-person`;case`storage`:return`stored_data`;case`component`:case`bucket`:case`mobile`:case`browser`:return`rectangle`}};function De(e){let t=e.$view,{nodes:r,edges:i}=t,a=new Map,o=(e,t)=>{let n=we(e),i=(t?t+`.`:``)+n;a.set(e.id,i);let s=JSON.stringify(e.title),c=Ee(e);return new A().append(n,`: {`,j).indent({indentedChildren:t=>t.append(`label: `,s,j).appendIf(c!==`rectangle`,`shape: `,c,j).appendIf(e.children.length>0,j,M(r.filter(t=>t.parent===e.id),e=>o(e,i))),indentation:2}).append(`}`,j)},s=e=>new A().append(a.get(e.source),` -> `,a.get(e.target)).append(t=>e.label&&t.append(`: `,JSON.stringify(e.label)));return k(new A().append(`direction: `,Te(t),j,j).append(M(r.filter(e=>n(e.parent)),e=>o(e),{appendNewLineIfNotEmpty:!0})).appendIf(i.length>0,j,M(i,e=>s(e),{appendNewLineIfNotEmpty:!0})))}const I=`data:page/id,likec4-`,L=1e4,R=`#dae8fc`,Oe=`#2563eb`,z=`#1e40af`,ke=`diagrams.drawio`,Ae=`#74c0fc`;function B(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function je(e){let t=e.split(/\r?\n/),n={},r={},i={},a={},o=!1,s=0;for(;s<t.length;){let e=t[s];if(e==null){s+=1;continue}if(e.trim()===`// <likec4.layout.drawio>`){o=!0,s+=1;let e=[];for(;s<t.length&&t[s]?.trim()!==`// </likec4.layout.drawio>`;){let n=t[s]?.trim();n?.startsWith(`// `)&&e.push(n.slice(3)),s+=1}if(e.length>0)try{let t=e.join(`
|
|
5
|
+
`);n=JSON.parse(t)}catch{}s+=1;continue}if(e.trim()===`// <likec4.strokeColor.vertices>`){for(o=!0,s+=1;s<t.length&&t[s]?.trim()!==`// </likec4.strokeColor.vertices>`;){let e=t[s]?.trim();if(e?.startsWith(`// `)&&e.includes(`=`)){let t=e.slice(3).trim(),n=t.indexOf(`=`);if(n>0){let e=t.slice(0,n).trim(),i=t.slice(n+1).trim();e&&i&&(r[e]=i)}}s+=1}s+=1;continue}if(e.trim()===`// <likec4.strokeWidth.vertices>`){for(o=!0,s+=1;s<t.length&&t[s]?.trim()!==`// </likec4.strokeWidth.vertices>`;){let e=t[s]?.trim();if(e?.startsWith(`// `)&&e.includes(`=`)){let t=e.slice(3).trim(),n=t.indexOf(`=`);if(n>0){let e=t.slice(0,n).trim(),r=t.slice(n+1).trim();e&&r!==``&&(i[e]=r)}}s+=1}s+=1;continue}if(e.trim()===`// <likec4.edge.waypoints>`){for(o=!0,s+=1;s<t.length&&t[s]?.trim()!==`// </likec4.edge.waypoints>`;){let e=t[s]?.trim();if(e?.startsWith(`// `)){let t=e.slice(3).trim(),n=t.indexOf(` `);if(n>0){let e=t.slice(0,n).trim(),r=t.slice(n+1).trim();if(e&&r)try{let t=JSON.parse(r);Array.isArray(t)&&(a[e]=t)}catch{}}}s+=1}s+=1;continue}s+=1}return o?{layoutByView:n,strokeColorByFqn:r,strokeWidthByFqn:i,edgeWaypoints:a}:null}function Me(e){let t=encodeURIComponent(e),n=new TextEncoder().encode(t);return Ne(ie.deflateRaw(n))}function Ne(e){if(typeof Buffer<`u`)return Buffer.from(e).toString(`base64`);let t=``;for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t)}const V={getNotes(e){return e.notes},getSummary(e){return e.summary},getTags(e){return e.tags},getNavigateTo(e){return e.navigateTo},getIcon(e){return e.icon},getLinks(e){return e.links},getNotation(e){return e.notation},getCustomData(e){return e.customData},getChildren(e){return e.children}},H={getKind(e){return e.kind},getNotation(e){return e.notation},getLinks(e){return e.links},getMetadata(e){return e.metadata},getCustomData(e){return e.customData}};function Pe(e){return e.$styles??P.DEFAULT}function U(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`)}function W(e){if(e==null)return``;let t=typeof e;if(t===`string`){let t=e;return t.trim()===``?``:t}return t===`number`||t===`boolean`?String(e):``}function Fe(e,t){return e&&t!==`none`||t===`dashed`?`dashed=1;`:``}function Ie(e,t){return e===`none`?`0`:t||e?`1`:``}function Le(e,t){return{fill:e?.fill??R,stroke:t,font:e?.font??t}}function Re(e,t,n){return t&&t in e.theme.colors?t:n}function ze(e,t,n){let r=Pe(e),i=Re(r,t??n,n);try{return r.colors(i)}catch{return P.DEFAULT.colors(n)}}function Be(e){let t=`shape=rectangle;rounded=1;arcSize=12;`;switch(e){case`person`:return`shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;`;case`rectangle`:case`browser`:case`mobile`:case`bucket`:return t;case`cylinder`:case`queue`:case`storage`:return`shape=cylinder3;whiteSpace=wrap;boundedLbl=1;backgroundOutline=1;size=15;`;case`document`:return`shape=document;whiteSpace=wrap;html=1;boundedLbl=1;`;case`component`:return`shape=component;`;default:return t}}function Ve(e,t){let n=ze(e,t,`primary`).elements;return{fill:String(n.fill??R),stroke:String(n.stroke??Oe),font:String(n.hiContrast??n.stroke??z)}}function He(e,t){let n=ze(e,t??`gray`,`gray`);return String(n.relationships?.line??z)}function Ue(e,t){let n=ze(e,t??`gray`,`gray`).relationships;return{font:String(n?.label??n?.line??z),background:String(n?.labelBg??`#ffffff`)}}function We(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=t.x+t.width/2,a=t.y+t.height/2,o=i-n,s=a-r,c=Math.abs(o)>=Math.abs(s);return{exitX:c?o>=0?1:0:.5,exitY:c?.5:s>=0?1:0,entryX:c?o>=0?0:1:.5,entryY:c?.5:s>=0?0:1}}function Ge(e){if(Array.isArray(e)&&e.length>=2&&typeof e[0]==`number`&&typeof e[1]==`number`)return[[e[0],e[1]]];let t=e;return typeof t.x==`number`&&typeof t.y==`number`?[[t.x,t.y]]:[]}function Ke(e,t,n,r,i,a){return n?``:t===``?`<div style="box-sizing:border-box;width:100%;min-height:100%;display:flex;align-items:center;justify-content:center;text-align:center;color:${r};font-family:${i};"><b style="font-size:${a}px;">${U(e)}</b></div>`:`<div style="box-sizing:border-box;width:100%;min-height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:${r};font-family:${i};"><b style="font-size:${a}px;">${U(e)}</b><br/><span style="font-weight:normal;font-size:${a}px;">${U(t)}</span></div>`}function G(e,t,n){n!=null&&n!==``&&e.push(`${t}=${encodeURIComponent(n)}`)}function qe(e,t,n){n!=null&&e.push(`${t}=${n}`)}function Je(e){return e===``?``:`link=${encodeURIComponent(`${I}${e}`)};`}function K(e){let t=e==null?null:de(e);return t!=null&&!l(t)?t.trim():``}function Ye(e){return!Array.isArray(e)||e.length===0?``:encodeURIComponent(JSON.stringify(e.map(e=>({url:e.url,title:e.title}))))}function Xe(e){return typeof e!=`object`||!e||Array.isArray(e)||Object.keys(e).length===0?``:encodeURIComponent(JSON.stringify(e))}const Ze=/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;function Qe(e){let t=[];return G(t,`likec4Description`,e.desc),G(t,`likec4Technology`,e.tech),G(t,`likec4Notes`,e.notes),G(t,`likec4Tags`,e.tagList),G(t,`likec4NavigateTo`,e.navTo),G(t,`likec4Icon`,e.iconName),G(t,`likec4Summary`,e.summaryStr),e.linksJson!==``&&t.push(`likec4Links=${e.linksJson}`),G(t,`likec4Border`,e.borderVal),qe(t,`likec4Opacity`,e.containerOpacityNum),G(t,`likec4StrokeWidth`,e.strokeWidth),e.colorNameForRoundtrip!==``&&t.push(`likec4ColorName=${e.colorNameForRoundtrip}`),G(t,`likec4Size`,e.nodeStyle?.size),G(t,`likec4Padding`,e.nodeStyle?.padding),G(t,`likec4TextSize`,e.nodeStyle?.textSize),G(t,`likec4IconPosition`,e.nodeStyle?.iconPosition),e.strokeHex&&Ze.test(e.strokeHex)&&G(t,`likec4StrokeColor`,e.strokeHex),G(t,`likec4Notation`,e.nodeNotation??void 0),t.length>0?t.join(`;`)+`;`:``}function $e(e){return!e||typeof e!=`object`||Array.isArray(e)||Object.keys(e).length===0?``:`
|
|
6
|
+
<mxUserObject>`+Object.entries(e).map(([e,t])=>{let n=typeof t==`string`?t:t==null?``:String(t);return`<data key="${B(e)}">${B(n)}</data>`}).join(``)+`</mxUserObject>`}function et(e){let t=[];return G(t,`likec4Description`,e.edgeDesc),G(t,`likec4Technology`,e.edgeTech),G(t,`likec4Notes`,e.edgeNotes),G(t,`likec4NavigateTo`,e.edgeNavTo),G(t,`likec4RelationshipKind`,e.edgeKind??void 0),G(t,`likec4Notation`,e.edgeNotation??void 0),e.edgeLinksJson!==``&&t.push(`likec4Links=${e.edgeLinksJson}`),e.edgeMetadataJson!==``&&t.push(`likec4Metadata=${e.edgeMetadataJson}`),t.length>0?t.join(`;`)+`;`:``}function tt(e){return e.label?B(e.label):``}function nt(e,t){let n=t?.[`${e.source}|${e.target}|${e.id}`]??t?.[`${e.source}|${e.target}`],r=Array.isArray(n)?n.flatMap(Ge):[];return r.length>0?`<mxGeometry relative="1" as="geometry">${`<Array as="points">`+r.map(([e,t])=>`<mxPoint x="${Math.round(e)}" y="${Math.round(t)}"/>`).join(``)+`</Array>`}</mxGeometry>`:`<mxGeometry relative="1" as="geometry" />`}function rt(e,t,n,r){let{bboxes:i,fontFamily:a}=t,o=i.get(e.source),s=i.get(e.target),c=o&&s?We(o,s):{exitX:1,exitY:.5,entryX:0,entryY:.5},l=`exitX=${c.exitX};exitY=${c.exitY};entryX=${c.entryX};entryY=${c.entryY};`,u=He(n,e.color),d=e.line===`dashed`?`dashed=1;`:e.line===`dotted`?`dashed=1;dashPattern=1 1;`:``,f=pt(e.head),p=e.tail==null||e.tail===`none`?`none`:pt(e.tail),m=et({edgeDesc:K(e.description),edgeTech:K(e.technology),edgeNotes:K(e.notes),edgeNavTo:W(e.navigateTo),edgeKind:H.getKind(e),edgeNotation:H.getNotation(e),edgeLinksJson:Ye(H.getLinks(e)),edgeMetadataJson:Xe(H.getMetadata(e))}),h=Ue(n,e.color);return`endArrow=${f};startArrow=${p};html=1;rounded=0;${l}strokeColor=${u};strokeWidth=2;${d}${r===``?``:`fontColor=${h.font};fontSize=12;align=center;verticalAlign=middle;labelBackgroundColor=none;fontFamily=${encodeURIComponent(a)};`}${m}`}function it(e,t,n,r,i,a){let{defaultParentId:o}=t,s=i(e.source),c=i(e.target),l=tt(e),u=nt(e,n?.edgeWaypoints);return`<mxCell id="${a}" value="${l}" style="${rt(e,t,r,l)}" edge="1" parent="${o}" source="${s}" target="${c}">
|
|
7
|
+
${u}${$e(H.getCustomData(e))}
|
|
8
|
+
</mxCell>`}function at(e,t,n){let{bboxes:r,defaultParentId:i,nodeIdsInView:a}=t,o=n(e.id),s=r.get(e.id),{width:c,height:l}=s,u=e.parent!=null&&a.has(e.parent)?n(e.parent):i,d=e.parent==null?void 0:r.get(e.parent);return{id:o,parentId:u,x:d==null?s.x+t.offsetX:s.x-d.x,y:d==null?s.y+t.offsetY:s.y-d.y,width:c,height:l}}function ot(e,t,n,r){let{containerNodeIds:i,effectiveStyles:a,fontFamily:o,containerTitleFontSizePx:s,containerTitleColor:c}=t,l=n?.strokeColorByNodeId,u=n?.strokeWidthByNodeId,d=i.has(e.id),f=e.title,p=K(e.description),m=K(e.technology),h=K(V.getNotes(e)),g=V.getTags(e),_=Array.isArray(g)&&g.length>0?g.join(`,`):``,v=W(V.getNavigateTo(e)),y=W(V.getIcon(e)),b=d?`shape=rectangle;rounded=0;container=1;collapsible=0;startSize=0;`:Be(e.shape),x=l?.[e.id],ee=u?.[e.id],S=x?Le(Ve(r,e.color),x):Ve(r,e.color),te=S?.fill??R,ne=S?.stroke??Oe,re=S?.font??S?.stroke??z,C=`fillColor=${te};strokeColor=${ne};fontColor=${re};`,w=e.style,T=a.fontSize(w?.textSize),E=B(Ke(f,p,d,re,o,T)),D=w?.border,O=ee??Ie(D,d),k=O===``?``:`strokeWidth=${O};`,A=Fe(d,D),j=d===!0?w?.opacity??15:void 0,M=j!=null&&d===!0?`fillOpacity=${Math.min(100,Math.max(0,j))};`:``,N=Qe({desc:p,tech:m,notes:h,tagList:_,navTo:v,iconName:y,summaryStr:K(V.getSummary(e)),linksJson:Ye(V.getLinks(e)),borderVal:D,containerOpacityNum:j,strokeWidth:O,colorNameForRoundtrip:e.color?encodeURIComponent(String(e.color)):``,nodeStyle:w,strokeHex:ne,nodeNotation:V.getNotation(e)}),ie=$e(V.getCustomData(e)),P=Je(v);return{value:E,styleStr:`${d?`align=left;verticalAlign=top;overflow=fill;whiteSpace=wrap;html=1;`:`align=center;verticalAlign=middle;verticalLabelPosition=middle;labelPosition=center;fontSize=${T};fontStyle=1;spacingTop=4;spacingLeft=2;spacingRight=2;spacingBottom=2;overflow=fill;whiteSpace=wrap;html=1;fontFamily=${encodeURIComponent(o)};`}${b}${C}${k}${A}${M}${P}${N}`,userObjectXml:ie,navTo:v,isContainer:d,title:f,fontFamily:o,containerTitleFontSizePx:s,containerTitleColor:c}}function st(e,t,n,r,i,a){let o=at(e,t,i),s=ot(e,t,n,r);return{...o,value:s.value,styleStr:s.styleStr,userObjectXml:s.userObjectXml,navTo:s.navTo,isContainer:s.isContainer,fontFamily:s.fontFamily,...s.isContainer&&{title:s.title??``,titleCellId:String(a),containerTitleFontSizePx:s.containerTitleFontSizePx,containerTitleColor:s.containerTitleColor}}}function ct(e){let t=`<mxGeometry height="${Math.round(e.height)}" width="${Math.round(e.width)}" x="${Math.round(e.x)}" y="${Math.round(e.y)}" as="geometry" />`,n=e.userObjectXml===``?`\n ${t}`:`${e.userObjectXml}\n ${t}`,r=e.isContainer&&e.title!=null?B(e.title):e.value,i=e.navTo===``?`<mxCell id="${e.id}" value="${e.value}" style="${e.styleStr}" vertex="1" parent="${e.parentId}">\n ${n}\n</mxCell>`:`<UserObject label="${r}" link="${I}${B(e.navTo)}" id="${e.id}">\n <mxCell parent="${e.parentId}" style="${e.styleStr}" value="${e.value}" vertex="1">\n ${n}\n</mxCell>\n</UserObject>`;return e.isContainer?{vertexXml:i,titleCellXml:lt(e.title??``,e.titleCellId??e.id,e.navTo,e.id,e.fontFamily,e.containerTitleFontSizePx??12,e.containerTitleColor??Ae),isContainer:!0}:{vertexXml:i,isContainer:!1}}function lt(e,t,n,r,i,a,o){let s=B(e),c=Math.max(60,Math.min(260,e.length*8)),l=Je(n),u=`shape=text;html=1;fillColor=none;strokeColor=none;align=left;verticalAlign=top;fontSize=${a};fontStyle=1;fontColor=${o};fontFamily=${encodeURIComponent(i)};${l}`;if(n===``)return`<mxCell id="${t}" value="${s}" style="${u}" vertex="1" parent="${r}">\n <mxGeometry x="8" y="8" width="${c}" height="18" as="geometry" />\n</mxCell>`;let d=`<mxCell parent="${r}" style="${u}" value="${s}" vertex="1">\n <mxGeometry x="8" y="8" width="${c}" height="18" as="geometry" />\n</mxCell>`;return`<UserObject label="${B(e)}" link="${I}${B(n)}" id="${t}">\n ${d}\n</UserObject>`}function ut(e){return typeof e.title==`string`?e.title:null}function dt(e){let t=e.description;return typeof t==`object`&&t&&`txt`in t?String(t.txt):typeof t==`object`&&t&&`md`in t?String(t.md):typeof t==`string`?t:``}function ft(e){let t=ut(e),n=dt(e),r=n.trim()===``?``:encodeURIComponent(n.trim()),i=e.notation,a=typeof i==`string`&&i!==``?i:void 0,o=a==null?``:encodeURIComponent(a);return[`rounded=1;whiteSpace=wrap;html=1;fillColor=none;strokeColor=none;`,`likec4ViewTitle=${encodeURIComponent(t??e.id)};`,r===``?``:`likec4ViewDescription=${r};`,o===``?``:`likec4ViewNotation=${o};`].join(``)}function pt(e){switch(e){case`none`:return`none`;case`open`:case`onormal`:case`vee`:return`open`;case`diamond`:case`odiamond`:return`diamond`;case`dot`:case`odot`:return`oval`;case`crow`:return`block`;default:return`block`}}const q={x:0,y:0,width:120,height:60};function mt(e){return e.x===q.x&&e.y===q.y&&e.width===q.width&&e.height===q.height}function ht(e,t,n){let r=e=>`${e.x},${e.y},${e.width},${e.height}`,i=t.filter(e=>!n.has(e.id)),a=new Map;for(let t of i){let n=e.get(t.id);if(!n)continue;let i=r(n),o=a.get(i)??[];o.push(t),a.set(i,o)}for(let t of a.values()){if(t.length<=1)continue;let n=t[0],r=n?e.get(n.id):void 0;r&&mt(r)&&t.forEach((t,n)=>{e.set(t.id,{...r,x:r.x,y:r.y+n*(r.height+24)})})}}function gt(e,t,n,r,i,a){let o=[...n].filter(e=>t.has(e.id)).sort((e,t)=>(t.level??0)-(e.level??0));for(let t of o){let n=(V.getChildren(t)??[]).filter(e=>r.has(e));if(n.length===0||!mt(e.get(t.id)))continue;let o=1/0,s=1/0,c=-1/0,l=-1/0;for(let t of n){let n=e.get(t);n&&(o=Math.min(o,n.x),s=Math.min(s,n.y),c=Math.max(c,n.x+n.width),l=Math.max(l,n.y+n.height))}o!==1/0&&e.set(t.id,{x:o-i,y:s-a,width:c-o+2*i,height:l-s+2*a})}}function _t(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e.values())t=Math.min(t,a.x),n=Math.min(n,a.y),r=Math.max(r,a.x+a.width),i=Math.max(i,a.y+a.height);t===1/0&&(t=0),n===1/0&&(n=0),r===-1/0&&(r=t+800),i===-1/0&&(i=n+600);let a=t+(r-t)/2,o=n+(i-n)/2;return{offsetX:800/2-a,offsetY:600/2-o,canvasWidth:800,canvasHeight:600}}function vt(e,t){let r=e.$view,{nodes:i}=r,a=t?.layoutOverride,o=[...i].sort((e,t)=>n(e.parent)&&n(t.parent)?0:n(e.parent)?-1:n(t.parent)?1:e.parent===t.parent?0:e.id.startsWith(t.id+`.`)?1:t.id.startsWith(e.id+`.`)?-1:0),s=e=>{let t=a?.[e.id];if(t)return t;let n=e;return{x:typeof n.x==`number`?n.x:Array.isArray(n.position)?n.position[0]:0,y:typeof n.y==`number`?n.y:Array.isArray(n.position)?n.position[1]:0,width:typeof n.width==`number`?n.width:n.size?.width??120,height:typeof n.height==`number`?n.height:n.size?.height??60}},c=new Map;for(let e of o)c.set(e.id,s(e));let l=new Set(i.map(e=>e.id)),u=new Set(i.filter(e=>{let t=V.getChildren(e);return Array.isArray(t)&&t.some(e=>l.has(e))}).map(e=>e.id));ht(c,o,u);let d=Pe(e),f=d.theme.spacing.xl;gt(c,u,o,l,f,d.theme.spacing.xl+d.theme.spacing.md);let{offsetX:p,offsetY:m,canvasWidth:h,canvasHeight:g}=_t(c);return{view:r,bboxes:c,containerNodeIds:u,sortedNodes:o,offsetX:p,offsetY:m,canvasWidth:h,canvasHeight:g,defaultParentId:`1`,rootId:`0`,effectiveStyles:d,fontFamily:`'IBM Plex Sans Variable',ui-sans-serif,system-ui,sans-serif`,containerTitleFontSizePx:Math.round(d.theme.textSizes.xs),containerTitleColor:Ae,nodeIdsInView:l}}function yt(e,t){let n=e.$view,{edges:r}=n,i=t?.compressed!==!1,a=vt(e,t),{sortedNodes:o,defaultParentId:s,rootId:c,canvasWidth:l,canvasHeight:u}=a,d=new Map,f=2,p=e=>{let t=d.get(e);if(!t){if(f>=L)throw Error(`DrawIO cell ID range exhausted`);t=String(f++),d.set(e,t)}return t},m=[],h=[],g=[],_=L;for(let n of o){let r=ct(st(n,a,t,e,p,_));r.isContainer?(m.push(r.vertexXml),r.titleCellXml&&m.push(r.titleCellXml),_++):h.push(r.vertexXml)}for(let n of r){if(f>=L)throw Error(`DrawIO cell ID range exhausted`);let r=String(f++);g.push(it(n,a,t,e,p,r))}let v=[`<mxCell id="${s}" value="" style="${ft(n)}" vertex="1" parent="${c}">
|
|
9
9
|
<mxGeometry x="0" y="0" width="${l}" height="${u}" as="geometry" />
|
|
10
10
|
</mxCell>`,...m,...h,...g].join(`
|
|
11
|
-
`),y=(
|
|
11
|
+
`),y=(ut(n)??n.id).trim()||n.id,b=`<mxGraphModel dx="800" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
|
12
12
|
<root>
|
|
13
13
|
<mxCell id="${c}" />
|
|
14
14
|
${v}
|
|
15
15
|
</root>
|
|
16
|
-
</mxGraphModel>`,x=i?Me(b):b;return{name:y,id:n.id,content:x}}function
|
|
16
|
+
</mxGraphModel>`,x=i?Me(b):b;return{name:y,id:n.id,content:x}}function bt(e,t){let n=B(t??new Date().toISOString());return e.length===0?`<?xml version="1.0" encoding="UTF-8"?>
|
|
17
17
|
<mxfile host="LikeC4" modified="${n}" agent="LikeC4" version="1.0" etag="" type="device">
|
|
18
18
|
</mxfile>
|
|
19
19
|
`:`<?xml version="1.0" encoding="UTF-8"?>
|
|
20
20
|
<mxfile host="LikeC4" modified="${n}" agent="LikeC4" version="1.0" etag="" type="device"${e.length>1?` pages="${e.length}"`:``}>
|
|
21
|
-
${e.map(e=>` <diagram name="${
|
|
21
|
+
${e.map(e=>` <diagram name="${B(e.name)}" id="likec4-${B(e.id)}">${e.content}</diagram>`).join(`
|
|
22
22
|
`)}
|
|
23
23
|
</mxfile>
|
|
24
|
-
`}function
|
|
25
|
-
`).trimStart()}function
|
|
26
|
-
`).trimStart()}function
|
|
24
|
+
`}function xt(e,t){return bt([yt(e,t)],t?.modified)}function St(e,t,n){return bt(e.map(e=>yt(e,t?.[e.$view.id])),n)}function Ct(e,t,n){let r={compressed:!1,...n};if(!t)return r;let i=t.layoutByView[e]?.nodes;return i!=null&&(r.layoutOverride=i),Object.keys(t.strokeColorByFqn).length>0&&(r.strokeColorByNodeId=t.strokeColorByFqn),Object.keys(t.strokeWidthByFqn).length>0&&(r.strokeWidthByNodeId=t.strokeWidthByFqn),Object.keys(t.edgeWaypoints).length>0&&(r.edgeWaypoints=t.edgeWaypoints),r}function wt(e,t,n){let r=t?je(t):null;return Object.fromEntries(e.map(e=>[e,Ct(e,r,n)]))}function Tt(e){let t=Me(e),n=JSON.stringify({type:`xml`,compressed:!0,data:t});return`https://app.diagrams.net/#create=`+encodeURIComponent(n)}const Et=e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),Dt=e=>e.split(`.`).map(Et).join(``),Ot=e=>Dt(e.parent?e.id.slice(e.parent.length+1):e.id),kt=e=>e.replace(/\\?"/g,`'`),At=({shape:e,title:t})=>{let n=`label: ${JSON.stringify(t)}`;switch(e){case`queue`:return`@{ shape: horizontal-cylinder, ${n} }`;case`person`:return`@{ icon: "fa:user", shape: rounded, ${n} }`;case`storage`:return`@{ shape: disk, ${n} }`;case`cylinder`:return`@{ shape: cylinder, ${n} }`;case`mobile`:case`browser`:return`@{ shape: rounded, ${n} }`;case`bucket`:return`@{ shape: trap-t, ${n} }`;case`rectangle`:return`@{ shape: rectangle, ${n} }`;case`document`:return`@{ shape: doc, ${n} }`;case`component`:return`@{ shape: rectangle, ${n} }`;default:ce(e)}};function jt(e){let t=e.$view,{nodes:r,edges:i}=t,a=new Map,o=(e,t)=>{let n=Ot(e),i=(t?t+`.`:``)+n;a.set(e.id,i);let s=new A;if(e.children.length>0){let t=kt(e.title);s.append(`subgraph `,i,'["`',t,'`"]',j).indent({indentedChildren:[M(r.filter(t=>t.parent===e.id),e=>o(e,i),{appendNewLineIfNotEmpty:!0})],indentation:2}).append(`end`,j)}else s.append(i,At(e));return s},s=e=>new A().append(a.get(e.source),` -.`,e.label?' "`'+kt(e.label)+'`" .-':`-`,`> `,a.get(e.target));return k(new A().append(`---`,j,`title: ${JSON.stringify(kt(e.titleOrId))}`,j,`---`,j).append(`graph `,t.autoLayout.direction,j).indent({indentedChildren:e=>{e.append(M(r.filter(e=>n(e.parent)),e=>o(e),{appendNewLineIfNotEmpty:!0})).appendIf(i.length>0,M(i,e=>s(e),{appendNewLineIfNotEmpty:!0}))},indentation:2}))}function J(e){return e.length===0?`never`:e.sort(fe).map(e=>` | ${JSON.stringify(e)}`).join(`
|
|
25
|
+
`).trimStart()}function Mt(e){let t=p(e);return t.length===0?`never`:o(t,me,s(e=>` | ${JSON.stringify(e.id)}`)).join(`
|
|
26
|
+
`).trimStart()}function Nt(e,t={}){let{useCorePackage:n=!1}=t;return`
|
|
27
27
|
import type { Aux, SpecAux } from '${n?`@likec4/core/types`:`likec4/model`}';
|
|
28
28
|
|
|
29
29
|
export type $Specs = SpecAux<
|
|
30
30
|
// Element kinds
|
|
31
|
-
${J(
|
|
31
|
+
${J(i(e.specification.elements))},
|
|
32
32
|
// Deployment kinds
|
|
33
|
-
${J(
|
|
33
|
+
${J(i(e.specification.deployments??{}))},
|
|
34
34
|
// Relationship kinds
|
|
35
|
-
${J(
|
|
35
|
+
${J(i(e.specification.relationships??{}))},
|
|
36
36
|
// Tags
|
|
37
|
-
${J(
|
|
37
|
+
${J(i(e.specification.tags??{}))},
|
|
38
38
|
// Metadata keys
|
|
39
39
|
${J(e.specification.metadataKeys??[])}
|
|
40
40
|
>
|
|
@@ -42,11 +42,11 @@ export type $Specs = SpecAux<
|
|
|
42
42
|
export type $Aux = Aux<
|
|
43
43
|
${JSON.stringify(e.stage)},
|
|
44
44
|
// Elements
|
|
45
|
-
${
|
|
45
|
+
${Mt(e.$data.elements)},
|
|
46
46
|
// Deployments
|
|
47
|
-
${
|
|
47
|
+
${Mt(e.$data.deployments.elements)},
|
|
48
48
|
// Views
|
|
49
|
-
${J(
|
|
49
|
+
${J(i(e.$data.views))},
|
|
50
50
|
// Project ID
|
|
51
51
|
${JSON.stringify(e.projectId)},
|
|
52
52
|
$Specs
|
|
@@ -62,7 +62,7 @@ export type $DeploymentKind = $Aux['DeploymentKind']
|
|
|
62
62
|
export type $Tag = $Aux['Tag']
|
|
63
63
|
export type $Tags = readonly $Aux['Tag'][]
|
|
64
64
|
export type $MetadataKey = $Aux['MetadataKey']
|
|
65
|
-
`.trimStart()}function
|
|
65
|
+
`.trimStart()}function Pt(e,t={}){let n=Nt(e,t),{useCorePackage:r=!1}=t;return`
|
|
66
66
|
/* prettier-ignore-start */
|
|
67
67
|
/* eslint-disable */
|
|
68
68
|
|
|
@@ -74,11 +74,11 @@ export type $MetadataKey = $Aux['MetadataKey']
|
|
|
74
74
|
import { LikeC4Model } from '${r?`@likec4/core`:`likec4`}/model'
|
|
75
75
|
${n}
|
|
76
76
|
|
|
77
|
-
export const likec4model: LikeC4Model<$Aux> = new LikeC4Model(${
|
|
77
|
+
export const likec4model: LikeC4Model<$Aux> = new LikeC4Model(${D.stringify(e.$data,{space:2,quote:`'`})} as any) as any
|
|
78
78
|
|
|
79
79
|
/* prettier-ignore-end */
|
|
80
|
-
`.trimStart()}const
|
|
81
|
-
`).map(e=>
|
|
80
|
+
`.trimStart()}const Ft=e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),Y=e=>e.split(/[.-]/).map(Ft).join(``),It=e=>Y(e.parent?e.id.slice(e.parent.length+1):e.id),X=(e,t,n=`#3b82f6`)=>e?t(e)??n:n,Lt=({autoLayout:e})=>{switch(e.direction){case`TB`:return`top to bottom`;case`BT`:return console.warn(`Bottom to top direction is not supported. Defaulting to top to bottom.`),`top to bottom`;case`LR`:return`left to right`;case`RL`:return console.warn(`Right to left direction is not supported. Defaulting to left to right.`),`left to right`}},Rt=({shape:e})=>{switch(e){case`queue`:case`rectangle`:case`person`:return e;case`storage`:case`cylinder`:return`database`;case`component`:return`component`;case`document`:case`mobile`:case`bucket`:case`browser`:return`rectangle`;default:ce(e)}},Z=e=>l(e)?null:JSON.stringify(e).slice(1,-1).replace(/\\"/g,`"`);function zt(e){let t=e.$view,r=e.$model.$styles.theme.colors,{nodes:i,edges:a}=t,o=e=>t=>t in r?r[t].elements[e]:void 0,s=e=>t=>t in r?r[t].relationships[e]:void 0,c=new Map,u=()=>new A().append(`title "`,e.titleOrId,`"`,j).append(Lt(t),` direction`,j),d=()=>new A().append(`hide stereotype`,j).append(`skinparam ranksep `,`60`,j).append(`skinparam nodesep `,`30`,j).append(`skinparam {`,j).indent({indentedChildren:e=>e.append(`arrowFontSize `,`10`,j).append(`defaultTextAlignment `,`center`,j).append(`wrapWidth `,`200`,j).append(`maxMessageSize `,`100`,j).append(`shadowing `,`false`,j),indentation:2}).append(`}`,j),f=e=>{let t=Rt(e),n=Y(e.id);return new A().append(`skinparam `,t,`<<`,n,`>>`,`{`,j).indent({indentedChildren:t=>t.append(`BackgroundColor `,X(e.color,o(`fill`)),j).append(`FontColor `,X(e.color,o(`hiContrast`),`#FFFFFF`),j).append(`BorderColor `,X(e.color,o(`stroke`)),j),indentation:2}).append(`}`,j)},p=e=>{let t=Rt(e),n=Y(e.id),r=Z(e.title)||It(e),i=Z(e.technology);c.set(e.id,n);let a=ue.from(e.description);return new A().append(t,` `).append(`"`).append(`==`,r).appendIf(!!i,`\\n<size:10>[`,i,`]</size>`).appendIf(a.nonEmpty,`\\n\\n`,Z(a.text)).append(`"`,` <<`,n,`>> `,`as `,n,j)},m=e=>{let t=Z(e.title)||It(e),n=Y(e.id);return c.set(e.id,n),new A().append(`rectangle "`,t,`" <<`,n,`>> as `,n,` {`,j).indent({indentedChildren:t=>t.append(`skinparam `,`RectangleBorderColor<<`,n,`>> `,X(e.color,o(`fill`)),j).append(`skinparam `,`RectangleFontColor<<`,n,`>> `,X(e.color,o(`fill`)),j).append(`skinparam `,`RectangleBorderStyle<<`,n,`>> `,`dashed`,j,j).append(M(i.filter(t=>t.parent===e.id),e=>e.children.length>0?m(e):p(e))),indentation:2}).append(`}`,j)},h=e=>{let t=e.technology||``,n=e.label||t,r=X(e.color,s(`line`),`#777777`),i=e=>`<color:${r}>${e.replaceAll(`"`,`'`)}`,a=new A().append(c.get(e.source),` .[`,r,`,thickness=2].> `,c.get(e.target));return(n||t)&&(a.append(` : `,n.split(`
|
|
81
|
+
`).map(e=>l(e)?e:i(e)).join(`\\n`)),t&&t!==n&&a.append(`\\n<size:8>[`,i(t),`]</size>`)),a.append(j)};return k(new A().append(`@startuml`,j).append(u(),j).append(d(),j).append(M(i.filter(e=>e.children.length==0),e=>f(e),{appendNewLineIfNotEmpty:!0})).append(M(i.filter(e=>n(e.parent)),e=>e.children.length>0?m(e):p(e),{appendNewLineIfNotEmpty:!0})).appendIf(a.length>0,j,M(a,e=>h(e),{appendNewLineIfNotEmpty:!0})).append(`@enduml`,j))}function Bt(e){return M(e,e=>O`${D.stringify(e.id)}`,{separator:` | `})}function Vt(e){let t=Array.from(e),n=new A;return n.appendTemplate`
|
|
82
82
|
/******************************************************************************
|
|
83
83
|
* This file was generated
|
|
84
84
|
* DO NOT EDIT MANUALLY!
|
|
@@ -89,10 +89,10 @@ export const likec4model: LikeC4Model<$Aux> = new LikeC4Model(${E.stringify(e.$d
|
|
|
89
89
|
// @ts-nocheck
|
|
90
90
|
|
|
91
91
|
import type { DiagramView } from 'likec4'
|
|
92
|
-
`.append(
|
|
93
|
-
export type LikeC4ViewId = ${
|
|
92
|
+
`.append(j,j),t.length===0?(n.append(`export {}`,j),k(n)):(n.appendTemplate`
|
|
93
|
+
export type LikeC4ViewId = ${Bt(t)};
|
|
94
94
|
export const LikeC4Views = {
|
|
95
|
-
`.indent({indentation:2,indentedChildren(e){e.appendNewLineIf(t.length>1).append(
|
|
95
|
+
`.indent({indentation:2,indentedChildren(e){e.appendNewLineIf(t.length>1).append(M(t,e=>O`${D.stringify(e.id)}: (${D.stringify(e)} as unknown) as DiagramView`,{separator:`,`,appendNewLineIfNotEmpty:!0}))}}).append(`} as const satisfies Record<LikeC4ViewId, DiagramView>`,j,j).appendTemplate`
|
|
96
96
|
export type LikeC4Views = typeof LikeC4Views
|
|
97
97
|
|
|
98
98
|
export function isLikeC4ViewId(value: unknown): value is LikeC4ViewId {
|
|
@@ -104,7 +104,7 @@ export const likec4model: LikeC4Model<$Aux> = new LikeC4Model(${E.stringify(e.$d
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
/* prettier-ignore-end */
|
|
107
|
-
`.append(
|
|
107
|
+
`.append(j),k(n))}function Ht(e,t={}){let{useCorePackage:n=!1}=t;pe(!e.isParsed(),`can not generate react types for parsed model`);let r=Nt(e,t);return`
|
|
108
108
|
/* prettier-ignore-start */
|
|
109
109
|
/* eslint-disable */
|
|
110
110
|
|
|
@@ -160,9 +160,9 @@ export {
|
|
|
160
160
|
ReactLikeC4
|
|
161
161
|
}
|
|
162
162
|
/* prettier-ignore-end */
|
|
163
|
-
`.trimStart()}function Q(e,t=`.js`){return{matches:n=>{let{module:r,projectId:i}=n.match(/^likec4:plugin\/(?<projectId>.+)\/(?<module>.+)$/)?.groups??n.match(/^likec4:(?<module>.+)\/(?<projectId>.+)$/)?.groups??{};return!r||!i?null:(r.endsWith(t)&&(r=r.slice(0,-t.length)),r===e?i:null)},virtualId:n=>
|
|
163
|
+
`.trimStart()}function Q(e,t=`.js`){return{matches:n=>{let{module:r,projectId:i}=n.match(/^likec4:plugin\/(?<projectId>.+)\/(?<module>.+)$/)?.groups??n.match(/^likec4:(?<module>.+)\/(?<projectId>.+)$/)?.groups??{};return!r||!i?null:(r.endsWith(t)&&(r=r.slice(0,-t.length)),r===e?i:null)},virtualId:n=>N(`likec4:plugin`,n,e)+t}}const Ut={"<":`\\u003C`,">":`\\u003E`,"/":`\\u002F`,"\\":`\\\\`,"\b":`\\b`,"\f":`\\f`,"\n":`\\n`,"\r":`\\r`," ":`\\t`,"\0":`\\0`,"\u2028":`\\u2028`,"\u2029":`\\u2029`};function Wt(e){return e.replace(/[<>\b\f\n\r\t\0\u2028\u2029\\]/g,e=>Ut[e])}function $(e,t){return{id:`likec4:${e}`,virtualId:`likec4:plugin/${e}.js`,async load({logger:n,projects:r}){return n.info(E.dim(`generating likec4:${e}`)),`
|
|
164
164
|
export let ${t}Fn = {
|
|
165
|
-
${r.map(({id:t})=>{let n=
|
|
165
|
+
${r.map(({id:t})=>{let n=Wt(JSON.stringify(N(`likec4:${e}`,t)));return`${JSON.stringify(t)}: () => import(${n})`}).join(`,
|
|
166
166
|
`)}
|
|
167
167
|
}
|
|
168
168
|
|
|
@@ -194,7 +194,7 @@ if (import.meta.hot) {
|
|
|
194
194
|
}
|
|
195
195
|
})
|
|
196
196
|
}
|
|
197
|
-
`}}}function
|
|
197
|
+
`}}}function Gt(e){let t=new A;return t.appendTemplate`
|
|
198
198
|
/******************************************************************************
|
|
199
199
|
* This file was generated
|
|
200
200
|
* DO NOT EDIT MANUALLY!
|
|
@@ -203,7 +203,7 @@ if (import.meta.hot) {
|
|
|
203
203
|
|
|
204
204
|
export function d2Source(viewId) {
|
|
205
205
|
switch (viewId) {
|
|
206
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
206
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(M([...e.views()],e=>O`
|
|
207
207
|
case ${JSON.stringify(e.id)}: {
|
|
208
208
|
return ${JSON.stringify(De(e))}
|
|
209
209
|
}
|
|
@@ -211,9 +211,9 @@ if (import.meta.hot) {
|
|
|
211
211
|
default: {
|
|
212
212
|
throw new Error('Unknown viewId: ' + viewId)
|
|
213
213
|
}
|
|
214
|
-
`}}).append(
|
|
214
|
+
`}}).append(j,` }`,j).appendTemplate`
|
|
215
215
|
}
|
|
216
|
-
`.append(
|
|
216
|
+
`.append(j,j),k(t)}const Kt={...Q(`d2`),async load({likec4:e,project:t,logger:n}){return n.info(E.dim(`generating likec4:d2/${t.id}`)),Gt(await e.computedModel(t.id))}},qt=$(`d2`,`loadD2Sources`);function Jt(e){let t=new A;return t.appendTemplate`
|
|
217
217
|
/******************************************************************************
|
|
218
218
|
* This file was generated
|
|
219
219
|
* DO NOT EDIT MANUALLY!
|
|
@@ -222,7 +222,7 @@ if (import.meta.hot) {
|
|
|
222
222
|
|
|
223
223
|
export function dotSource(viewId) {
|
|
224
224
|
switch (viewId) {
|
|
225
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
225
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(M(Object.keys(e),t=>O`
|
|
226
226
|
case ${JSON.stringify(t)}: {
|
|
227
227
|
return ${JSON.stringify(e[t].dot)}
|
|
228
228
|
}
|
|
@@ -230,12 +230,12 @@ if (import.meta.hot) {
|
|
|
230
230
|
default: {
|
|
231
231
|
throw new Error('Unknown viewId: ' + viewId)
|
|
232
232
|
}
|
|
233
|
-
`}}).append(
|
|
233
|
+
`}}).append(j,` }`,j).appendTemplate`
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
export function svgSource(viewId) {
|
|
237
237
|
switch (viewId) {
|
|
238
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
238
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(M(Object.keys(e),t=>O`
|
|
239
239
|
case ${JSON.stringify(t)}: {
|
|
240
240
|
return ${JSON.stringify(e[t].svg)}
|
|
241
241
|
}
|
|
@@ -243,7 +243,7 @@ if (import.meta.hot) {
|
|
|
243
243
|
default: {
|
|
244
244
|
throw new Error('Unknown viewId: ' + viewId)
|
|
245
245
|
}
|
|
246
|
-
`}}).append(
|
|
246
|
+
`}}).append(j,` }`,j,`}`,j,j),k(t)}const Yt={...Q(`dot`),async load({likec4:e,project:t,logger:n}){return n.info(E.dim(`generating likec4:dot/${t.id}`)),Jt(m(await e.views.viewsAsGraphvizOut(t.id),({id:e,svg:t,dot:n})=>[e,{dot:n,svg:t}]))}},Xt=$(`dot`,`loadDotSources`);function Zt(e){let t=new A;return t.appendTemplate`
|
|
247
247
|
/******************************************************************************
|
|
248
248
|
* This file was generated
|
|
249
249
|
* DO NOT EDIT MANUALLY!
|
|
@@ -252,23 +252,23 @@ if (import.meta.hot) {
|
|
|
252
252
|
|
|
253
253
|
export function drawioEditUrl(viewId) {
|
|
254
254
|
switch (viewId) {
|
|
255
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
255
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(M([...e.views()],e=>O`
|
|
256
256
|
case ${JSON.stringify(e.id)}: {
|
|
257
|
-
return ${JSON.stringify(
|
|
257
|
+
return ${JSON.stringify(Tt(xt(e)))}
|
|
258
258
|
}
|
|
259
259
|
`,{appendNewLineIfNotEmpty:!0})).appendTemplate`
|
|
260
260
|
default: {
|
|
261
261
|
throw new Error('Unknown viewId: ' + viewId)
|
|
262
262
|
}
|
|
263
|
-
`}}).append(
|
|
263
|
+
`}}).append(j,` }`,j).appendTemplate`
|
|
264
264
|
}
|
|
265
|
-
`.append(
|
|
265
|
+
`.append(j,j),k(t)}const Qt={...Q(`drawio`),async load({likec4:e,project:t,logger:n}){return n.info(E.dim(`generating likec4:drawio/${t.id}`)),Zt(await e.layoutedModel(t.id))}},$t=$(`drawio`,`loadDrawioSources`);function en(e){let{imports:n,cases:r}=o(e.flatMap(e=>e.nodes.map(e=>e.icon)),d(e=>t(e)&&!(e.toLowerCase().startsWith(`http:`)||e.toLowerCase().startsWith(`https:`))),f(),u(fe)).reduce((e,t,n)=>{let r=t.startsWith(`file:`),i=`Icon`+n.toString().padStart(2,`0`);if(r)return e.imports.push(`import ${i} from '${t}?inline'`),e.cases.push(` '${t}': () => jsx('img', { src: ${i} })`),e;let[a,o]=t.split(`:`);return e.imports.push(`import ${i} from '@likec4/icons/${a}/${o}'`),e.cases.push(` '${a}:${o}': ${i}`),e},{imports:[],cases:[]});return`
|
|
266
266
|
import { jsx } from 'react/jsx-runtime'
|
|
267
|
-
${
|
|
267
|
+
${n.join(`
|
|
268
268
|
`)}
|
|
269
269
|
|
|
270
270
|
const Icons = {
|
|
271
|
-
${
|
|
271
|
+
${r.join(`,
|
|
272
272
|
`)}
|
|
273
273
|
}
|
|
274
274
|
export function IconRenderer({ node, ...props }) {
|
|
@@ -278,11 +278,11 @@ export function IconRenderer({ node, ...props }) {
|
|
|
278
278
|
}
|
|
279
279
|
return jsx(IconComponent, props)
|
|
280
280
|
}
|
|
281
|
-
`}const
|
|
281
|
+
`}const tn={...Q(`icons`,`.jsx`),async load({likec4:e,project:t,logger:n}){return n.info(E.dim(`generating likec4:icons/${t.id}`)),en(await e.views.computedViews(t.id))}},nn=/^[a-zA-Z0-9_.-]+$/;function rn(e){if(!nn.test(e))throw Error(`Unsafe value for code generation: ${e}`);return JSON.stringify(e)}function an(e){return JSON.stringify(e)}const on={id:`likec4:icons`,virtualId:`likec4:plugin/icons.jsx`,async load({projects:e,logger:t}){return t.info(E.dim(`generating likec4:icons`)),`
|
|
282
282
|
import { jsx } from 'react/jsx-runtime'
|
|
283
283
|
import { lazy, Suspense } from 'react'
|
|
284
284
|
export let ProjectIconsRegistry = {
|
|
285
|
-
${e.filter(e=>
|
|
285
|
+
${e.filter(e=>nn.test(e.id)?!0:(t.warn(E.yellow(`Skipping project with unsafe id for icons registry: ${e.id}`)),!1)).map(e=>({idLiteral:rn(e.id),pkgLiteral:an(N(`likec4:icons`,e.id))})).map(({idLiteral:e,pkgLiteral:t})=>`${e}: lazy(() => import(${t}).then(m => ({default: m.IconRenderer})))`).join(`,
|
|
286
286
|
`)}
|
|
287
287
|
}
|
|
288
288
|
|
|
@@ -315,7 +315,7 @@ if (import.meta.hot) {
|
|
|
315
315
|
}
|
|
316
316
|
})
|
|
317
317
|
}
|
|
318
|
-
`}};function
|
|
318
|
+
`}};function sn(e){let t=new A;return t.appendTemplate`
|
|
319
319
|
/******************************************************************************
|
|
320
320
|
* This file was generated
|
|
321
321
|
* DO NOT EDIT MANUALLY!
|
|
@@ -324,21 +324,21 @@ if (import.meta.hot) {
|
|
|
324
324
|
|
|
325
325
|
export function mmdSource(viewId) {
|
|
326
326
|
switch (viewId) {
|
|
327
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
327
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(M([...e.views()],e=>O`
|
|
328
328
|
case ${JSON.stringify(e.id)}: {
|
|
329
|
-
return ${JSON.stringify(
|
|
329
|
+
return ${JSON.stringify(jt(e))}
|
|
330
330
|
}
|
|
331
331
|
`,{appendNewLineIfNotEmpty:!0})).appendTemplate`
|
|
332
332
|
default: {
|
|
333
333
|
throw new Error('Unknown viewId: ' + viewId)
|
|
334
334
|
}
|
|
335
|
-
`}}).append(
|
|
335
|
+
`}}).append(j,` }`,j).appendTemplate`
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
-
`.append(
|
|
338
|
+
`.append(j,j),k(t)}const cn={...Q(`mmd`),async load({likec4:e,project:t,logger:n}){return n.info(E.dim(`generating virtual:likec4/mmd/${t.id}`)),sn(await e.computedModel(t.id))}},ln=$(`mmd`,`loadMmdSources`),un=e=>`
|
|
339
339
|
import { createHooksForModel, atom } from 'likec4/vite-plugin/internal'
|
|
340
340
|
|
|
341
|
-
export const $likec4data = atom(${
|
|
341
|
+
export const $likec4data = atom(${D.stringify(e.$data)})
|
|
342
342
|
|
|
343
343
|
export const {
|
|
344
344
|
updateModel,
|
|
@@ -361,11 +361,11 @@ if (import.meta.hot) {
|
|
|
361
361
|
}
|
|
362
362
|
})
|
|
363
363
|
}
|
|
364
|
-
`,
|
|
364
|
+
`,dn={...Q(`model`),async load({likec4:e,project:t,logger:n}){return n.info(E.dim(`generating likec4:model/${t.id}`)),un(await e.layoutedModel(t.id))}},fn=$(`model`,`loadModel`),pn=e=>`
|
|
365
365
|
import { atom, useStore } from 'likec4/vite-plugin/internal'
|
|
366
366
|
|
|
367
367
|
export const isSingleProject = ${e.length===1};
|
|
368
|
-
export const projects = ${
|
|
368
|
+
export const projects = ${D.stringify(e,null,2)};
|
|
369
369
|
|
|
370
370
|
export const $projects = atom([...projects])
|
|
371
371
|
|
|
@@ -391,10 +391,10 @@ if (import.meta.hot) {
|
|
|
391
391
|
}
|
|
392
392
|
})
|
|
393
393
|
}
|
|
394
|
-
`,
|
|
394
|
+
`,mn={id:`likec4:projects`,virtualId:`likec4:plugin/projects.js`,async load({logger:e,projects:t}){return e.info(E.dim(`generating likec4:projects`)),pn(s(t,c([`id`,`title`])))}},hn=e=>`
|
|
395
395
|
import { atom, useStore } from 'likec4/vite-plugin/internal'
|
|
396
396
|
|
|
397
|
-
export const $viewdata = atom(${
|
|
397
|
+
export const $viewdata = atom(${D.stringify(e)})
|
|
398
398
|
|
|
399
399
|
export function useLikeC4ProjectsOverview() {
|
|
400
400
|
return useStore($viewdata)
|
|
@@ -413,11 +413,11 @@ if (import.meta.hot) {
|
|
|
413
413
|
}
|
|
414
414
|
})
|
|
415
415
|
}
|
|
416
|
-
`,
|
|
416
|
+
`,gn=()=>`
|
|
417
417
|
export function useLikeC4ProjectsOverview() {
|
|
418
418
|
throw new Error('No projects overview available for this workspace: single project mode is enabled')
|
|
419
419
|
}
|
|
420
|
-
`,
|
|
420
|
+
`,_n={id:`likec4:projects-overview`,virtualId:`likec4:plugin/projects-overview.js`,async load({logger:e,projects:t,likec4:n}){return t.length<2?gn():(e.info(E.dim(`generating likec4:projects-overview`)),hn(await n.projectsOverview()))}};function vn(e){let t=new A;return t.appendTemplate`
|
|
421
421
|
/******************************************************************************
|
|
422
422
|
* This file was generated
|
|
423
423
|
* DO NOT EDIT MANUALLY!
|
|
@@ -426,17 +426,17 @@ export function useLikeC4ProjectsOverview() {
|
|
|
426
426
|
|
|
427
427
|
export function pumlSource(viewId) {
|
|
428
428
|
switch (viewId) {
|
|
429
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
429
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(M([...e.views()],e=>O`
|
|
430
430
|
case ${JSON.stringify(e.id)}: {
|
|
431
|
-
return ${JSON.stringify(
|
|
431
|
+
return ${JSON.stringify(zt(e))}
|
|
432
432
|
}
|
|
433
433
|
`,{appendNewLineIfNotEmpty:!0})).appendTemplate`
|
|
434
434
|
default: {
|
|
435
435
|
throw new Error('Unknown viewId: ' + viewId)
|
|
436
436
|
}
|
|
437
|
-
`}}).append(
|
|
437
|
+
`}}).append(j,` }`,j).appendTemplate`
|
|
438
438
|
}
|
|
439
|
-
`.append(
|
|
439
|
+
`.append(j,j),k(t)}const yn={...Q(`puml`),async load({likec4:e,project:t,logger:n}){return n.info(E.dim(`generating likec4:puml/${t.id}`)),vn(await e.computedModel(t.id))}},bn=$(`puml`,`loadPumlSources`),xn=e=>`
|
|
440
440
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
441
441
|
import { LikeC4ModelProvider as Provider, LikeC4View as GenericView, ReactLikeC4 as GenericReactLikeC4 } from 'likec4/react';
|
|
442
442
|
import { IconRenderer } from 'likec4:icons/${e}'
|
|
@@ -459,7 +459,7 @@ export {
|
|
|
459
459
|
useLikeC4View,
|
|
460
460
|
useLikeC4Views
|
|
461
461
|
}
|
|
462
|
-
`,
|
|
462
|
+
`,Sn={...Q(`react`),async load({project:e,logger:t}){return t.info(E.dim(`generating likec4:react/${e.id}`)),xn(e.id)}},Cn={id:`likec4:react`,virtualId:`likec4:plugin/react.js`,async load({logger:e,projects:t}){let n=a(t);return e.info(E.dim(`generating likec4:react for`)+` `+n.id),xn(n.id)}},wn={id:`likec4:rpc`,virtualId:`likec4:plugin/rpc.js`,async load({logger:e}){return e.info(E.dim(`generating likec4:rpc`)),`
|
|
463
463
|
import { createRpc } from 'likec4/vite-plugin/internal'
|
|
464
464
|
|
|
465
465
|
export const isRpcAvailable = !!import.meta.hot
|
|
@@ -486,7 +486,7 @@ export const likec4rpc = rpc ?? {
|
|
|
486
486
|
throw new Error('likec4rpc.calcAdhocView is not available in production')
|
|
487
487
|
},
|
|
488
488
|
}
|
|
489
|
-
`}},
|
|
489
|
+
`}},Tn=e=>`
|
|
490
490
|
export { IconRenderer } from 'likec4:icons/${e}'
|
|
491
491
|
export {
|
|
492
492
|
$likec4data,
|
|
@@ -496,4 +496,4 @@ export {
|
|
|
496
496
|
useLikeC4View
|
|
497
497
|
} from 'likec4:model/${e}'
|
|
498
498
|
export const projectId = ${JSON.stringify(e)}
|
|
499
|
-
`,
|
|
499
|
+
`,En={id:`likec4:single-project`,virtualId:`likec4:plugin/single-project.js`,async load({logger:e,projects:t}){let n=a(t);return e.info(E.dim(`generating likec4:single-project for`)+` `+n.id),Tn(n.id)}},Dn=[dn,tn,Kt,Yt,cn,yn,Qt],On=[...Dn,Sn],kn=[mn,fn,_n,En,Cn,qt,Xt,ln,bn,$t,on,wn];function An({environments:e,...t}){let n,i,a=t.watch??!1;return{name:`vite-plugin-likec4`,applyToEnvironment(t){return e?e.includes(t.name):!0},async configResolved(e){if(t.languageServices)n=t.languageServices;else{let r=a=t.watch??e.mode===`development`;n=(await ge(t.workspace??e.root,{graphviz:t.graphviz??`wasm`,configureLogger:`console`,watch:r})).languageServices}i=n.workspaceUri.fsPath},resolveId(e){for(let t of On){let n=t.matches(e);if(n)return t.virtualId(n)}for(let t of kn)if(t.id===e)return t.virtualId;return null},async load(e){for(let t of On){let r=t.matches(e);if(r){let e=n.project(r);return await t.load({logger:F,likec4:n,project:e,assetsDir:i})}}for(let t of kn)if(t.virtualId===e){let e=n.projects();return ae(oe(e)),await t.load({logger:F,likec4:n,projects:e,assetsDir:i})}return null},configureServer(e){let t=e.hot;xe.call(this,{logger:F,likec4:n,server:e});let i=()=>s(n.projects(),e=>({id:e.id,title:e.title,folder:e.folder.toString()})),a=i(),o=async t=>{let n=e.moduleGraph.getModuleById(t);if(n&&n.importers.size>0)try{await e.reloadModule(n)}catch(e){F.error(re(e))}};n.builder.onModelParsed(async()=>{let[e]=n.getErrors();if(e){t.send({type:`error`,err:{name:`LikeC4ValidationError`,...ve(e.message),plugin:`vite-plugin-likec4`,loc:{file:e.sourceFsPath,line:e.line,column:e.range.start.character+1}}});return}let s=i();if(!r(s,a)){a=s,await o(mn.virtualId),await o(on.virtualId),await o(fn.virtualId),a.length>1&&await o(_n.virtualId);return}for(let e of s)for(let t of Dn)await o(t.virtualId(e.id))})},async buildEnd(){a&&await n.dispose()}}}export{Pt as a,xt as c,De as d,ge as f,zt as i,St as l,Ht as n,jt as o,Vt as r,wt as s,An as t,ke as u};
|