likec4 1.48.0 → 1.50.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.
Files changed (118) hide show
  1. package/README.md +11 -1
  2. package/__app__/src/likec4.js +5941 -4496
  3. package/__app__/src/routes/index.js +3 -153
  4. package/__app__/src/routes/projects.js +21 -1087
  5. package/__app__/src/routes/single.js +1228 -16
  6. package/__app__/src/style.css +1 -1
  7. package/__app__/src/vendors.js +4649 -1897
  8. package/__app__/src/webcomponent.js +1 -1
  9. package/config/schema.json +169 -141
  10. package/dist/THIRD-PARTY-LICENSES.md +1769 -0
  11. package/dist/_chunks/LikeC4.mjs +1154 -202
  12. package/dist/_chunks/binary.mjs +72 -0
  13. package/dist/_chunks/index.d.mts +234 -140
  14. package/dist/_chunks/index2.d.mts +2043 -1828
  15. package/dist/_chunks/libs/@chevrotain/cst-dts-gen.mjs +30 -0
  16. package/dist/_chunks/libs/@chevrotain/regexp-to-ast.mjs +9 -785
  17. package/dist/_chunks/libs/@chevrotain/utils.mjs +1 -37
  18. package/dist/_chunks/libs/@hono/mcp.mjs +34 -0
  19. package/dist/_chunks/libs/@hono/node-server.mjs +1 -436
  20. package/dist/_chunks/libs/@logtape/logtape.d.mts +741 -0
  21. package/dist/_chunks/libs/@logtape/logtape.mjs +6 -1354
  22. package/dist/_chunks/libs/@lume/kiwi.mjs +1 -1355
  23. package/dist/_chunks/libs/@modelcontextprotocol/sdk.d.mts +114 -14
  24. package/dist/_chunks/libs/@modelcontextprotocol/sdk.mjs +12 -25105
  25. package/dist/_chunks/libs/@msgpack/msgpack.mjs +1 -1503
  26. package/dist/_chunks/libs/@nanostores/react.d.mts +61 -1
  27. package/dist/_chunks/libs/@nanostores/react.mjs +1 -30
  28. package/dist/_chunks/libs/@smithy/is-array-buffer.mjs +1 -10
  29. package/dist/_chunks/libs/@smithy/util-base64.mjs +1 -100
  30. package/dist/_chunks/libs/ajv.mjs +1 -777
  31. package/dist/_chunks/libs/atomically.mjs +1 -362
  32. package/dist/_chunks/libs/birpc.mjs +1 -201
  33. package/dist/_chunks/libs/chevrotain-allstar.mjs +2 -850
  34. package/dist/_chunks/libs/chevrotain.mjs +55 -6229
  35. package/dist/_chunks/libs/conf.mjs +1 -2258
  36. package/dist/_chunks/libs/defu.mjs +1 -42
  37. package/dist/_chunks/libs/esm-env.mjs +1 -5
  38. package/dist/_chunks/libs/eventemitter3.mjs +1 -243
  39. package/dist/_chunks/libs/fast-equals.mjs +1 -446
  40. package/dist/_chunks/libs/find-up-simple.mjs +1 -24
  41. package/dist/_chunks/libs/get-port.mjs +1 -107
  42. package/dist/_chunks/libs/is-docker.mjs +1 -26
  43. package/dist/_chunks/libs/is-error-instance.mjs +1 -26
  44. package/dist/_chunks/libs/is-inside-container.mjs +1 -20
  45. package/dist/_chunks/libs/is-plain-obj.mjs +1 -9
  46. package/dist/_chunks/libs/isexe.mjs +1 -127
  47. package/dist/_chunks/libs/json5.mjs +14 -959
  48. package/dist/_chunks/libs/khroma.mjs +1 -605
  49. package/dist/_chunks/libs/ky.mjs +2 -807
  50. package/dist/_chunks/libs/langium.d.mts +2913 -2876
  51. package/dist/_chunks/libs/langium.mjs +33 -20351
  52. package/dist/_chunks/libs/merge-error-cause.mjs +2 -746
  53. package/dist/_chunks/libs/p-limit.mjs +1 -120
  54. package/dist/_chunks/libs/p-queue.mjs +1 -449
  55. package/dist/_chunks/libs/package-manager-detector.mjs +1 -559
  56. package/dist/_chunks/libs/package-up.mjs +1 -10
  57. package/dist/_chunks/libs/pako.mjs +1 -0
  58. package/dist/_chunks/libs/parse-ms.mjs +1 -36
  59. package/dist/_chunks/libs/pathe.mjs +1 -0
  60. package/dist/_chunks/libs/picomatch.mjs +1 -1673
  61. package/dist/_chunks/libs/pretty-ms.mjs +1 -80
  62. package/dist/_chunks/libs/remeda.mjs +2 -690
  63. package/dist/_chunks/libs/safe-stringify.mjs +1 -21
  64. package/dist/_chunks/libs/strip-indent.mjs +1 -15
  65. package/dist/_chunks/libs/tinyrainbow.mjs +1 -88
  66. package/dist/_chunks/libs/ts-graphviz.mjs +4 -725
  67. package/dist/_chunks/libs/ufo.mjs +1 -240
  68. package/dist/_chunks/libs/which.mjs +1 -84
  69. package/dist/_chunks/libs/word-wrap.mjs +12 -43
  70. package/dist/_chunks/rolldown-runtime.mjs +1 -48
  71. package/dist/_chunks/sequence.mjs +1 -0
  72. package/dist/_chunks/src.mjs +15 -0
  73. package/dist/_chunks/src2.mjs +499 -0
  74. package/dist/cli/index.mjs +77 -1952
  75. package/dist/config/index.d.mts +2 -2
  76. package/dist/config/index.mjs +1 -6
  77. package/dist/index.d.mts +150 -7
  78. package/dist/index.mjs +1 -21
  79. package/dist/model/builder.mjs +1 -3
  80. package/dist/model/index.d.mts +57 -3
  81. package/dist/model/index.mjs +1 -5
  82. package/dist/vite-plugin/index.d.mts +7 -3
  83. package/dist/vite-plugin/index.mjs +1 -22
  84. package/dist/vite-plugin/internal.d.mts +6 -7
  85. package/dist/vite-plugin/internal.mjs +1 -68
  86. package/package.json +64 -45
  87. package/react/{index.d.ts → index.d.mts} +114 -72
  88. package/react/{index.js → index.mjs} +21320 -22041
  89. package/react/package.json +2 -5
  90. package/vite-plugin-modules.d.ts +10 -5
  91. package/dist/_chunks/LikeC4.d.mts +0 -121
  92. package/dist/_chunks/config-app.prod.d.mts +0 -18
  93. package/dist/_chunks/config-app.prod.mjs +0 -188
  94. package/dist/_chunks/config-webcomponent.prod.mjs +0 -71
  95. package/dist/_chunks/define-config.mjs +0 -409
  96. package/dist/_chunks/index3.d.mts +0 -60
  97. package/dist/_chunks/libs/@chevrotain/gast.mjs +0 -3969
  98. package/dist/_chunks/libs/hono.mjs +0 -1829
  99. package/dist/_chunks/libs/nanoid.mjs +0 -29
  100. package/dist/_chunks/libs/nanostores.d.mts +0 -63
  101. package/dist/_chunks/libs/nanostores.mjs +0 -198
  102. package/dist/_chunks/model.mjs +0 -12
  103. package/dist/_chunks/module.d.mts +0 -71
  104. package/dist/_chunks/module.mjs +0 -18657
  105. package/dist/_chunks/plugin.mjs +0 -996
  106. package/dist/_chunks/sequence-view.mjs +0 -575
  107. package/dist/_chunks/vite-build.mjs +0 -69
  108. package/dist/_chunks/vite-dev.mjs +0 -79
  109. package/dist/_chunks/vite-preview.mjs +0 -27
  110. package/dist/language/module.d.mts +0 -5
  111. package/dist/language/module.mjs +0 -20
  112. package/dist/vite/vite-build.d.mts +0 -26
  113. package/dist/vite/vite-build.mjs +0 -27
  114. package/dist/vite/vite-dev.d.mts +0 -34
  115. package/dist/vite/vite-dev.mjs +0 -29
  116. package/dist/vite/vite-preview.d.mts +0 -20
  117. package/dist/vite/vite-preview.mjs +0 -26
  118. /package/dist/_chunks/{index4.d.mts → libs/@chevrotain/types.d.mts} +0 -0
@@ -0,0 +1,499 @@
1
+ import{t as e}from"./libs/birpc.mjs";import{E as t,F as n,K as r,O as i,S as a,U as o,X as s,d as c,o as l,r as u,t as d,v as f,x as p,y as m}from"./libs/remeda.mjs";import{a as h,f as g,i as _,l as v,m as y,n as b,o as x,s as ee,t as S,u as te,y as ne}from"./binary.mjs";import{t as C}from"./libs/defu.mjs";import{r as re,t as w}from"./libs/pathe.mjs";import{t as T}from"./libs/tinyrainbow.mjs";import{t as E}from"./libs/json5.mjs";import{a as D,i as O,n as k,r as A,t as j}from"./libs/langium.mjs";import{o as M}from"./libs/ufo.mjs";import{t as ie}from"./libs/pako.mjs";import"@likec4/core/model";import{LikeC4Styles as N,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=y.getChild(`lang`),n=C(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),r=n.graphviz===`binary`;return t.info(`${T.dim(`layout`)} ${r?`binary`:`wasm`}`),b({...n.useFileSystem?{...x(n.watch),...n.manualLayouts?ee:te}:{...v,...te}},{likec4:{Layouter:()=>new _({graphviz:r?new S:new h})}})}async function ge(e,t){let n=re(e),r=le(n).toString(),i=r.endsWith(`/`)?r:r+`/`;return se(globalThis,`likec4:`+n,async()=>{let e=y.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:w(n),uri:i},s=a.shared.workspace.WorkspaceManager;e.info(`${T.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(`${T.dim(`workspace:`)} found ${c.length} source files`),g(a,y,t)})}const P=y.getChild(`vite`);async function _e({logger:e,likec4:t},n){e.info([T.green(`adhoc:view`),T.dim(`project:`),n.projectId].join(` `));let r=await t.views.adhocView(n.predicates,n.projectId);return e.info([T.green(`adhoc:view`),`✅`].join(` `)),r}function ve(e){let t=e.split(`
2
+ `),n=/^\s+at\s+/,r=t.findIndex(e=>n.test(e));return r===-1&&(r=1),{message:t.slice(0,r).join(`
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([T.green(`view:onChange`),T.dim(`project`)+`:`,n.projectId,T.dim(`view`)+`:`,n.viewId,T.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([T.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 n=e.$view,{nodes:r,edges:i}=n,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 k().append(n,`: {`,A).indent({indentedChildren:t=>t.append(`label: `,s,A).appendIf(c!==`rectangle`,`shape: `,c,A).appendIf(e.children.length>0,A,j(r.filter(t=>t.parent===e.id),e=>o(e,i))),indentation:2}).append(`}`,A)},s=e=>new k().append(a.get(e.source),` -> `,a.get(e.target)).append(t=>e.label&&t.append(`: `,JSON.stringify(e.label)));return O(new k().append(`direction: `,Te(n),A,A).append(j(r.filter(e=>t(e.parent)),e=>o(e),{appendNewLineIfNotEmpty:!0})).appendIf(i.length>0,A,j(i,e=>s(e),{appendNewLineIfNotEmpty:!0})))}const F=`data:page/id,likec4-`,I=1e4,L=`#dae8fc`,Oe=`#2563eb`,R=`#1e40af`,ke=`diagrams.drawio`,Ae=`#74c0fc`;function z(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&apos;`)}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 B={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}},V={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??N.DEFAULT}function H(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`)}function U(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??L,stroke:t,font:e?.font??t}}function Re(e,t,n){return t&&t in e.theme.colors?t:n}function W(e,t,n){let r=Pe(e),i=Re(r,t??n,n);try{return r.colors(i)}catch{return N.DEFAULT.colors(n)}}function ze(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 Be(e,t){let n=W(e,t,`primary`).elements;return{fill:String(n.fill??L),stroke:String(n.stroke??Oe),font:String(n.hiContrast??n.stroke??R)}}function Ve(e,t){let n=W(e,t??`gray`,`gray`);return String(n.relationships?.line??R)}function He(e,t){let n=W(e,t??`gray`,`gray`).relationships;return{font:String(n?.label??n?.line??R),background:String(n?.labelBg??`#ffffff`)}}function Ue(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 We(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 Ge(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;">${H(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;">${H(e)}</b><br/><span style="font-weight:normal;font-size:${a}px;">${H(t)}</span></div>`}function G(e,t,n){n!=null&&n!==``&&e.push(`${t}=${encodeURIComponent(n)}`)}function Ke(e,t,n){n!=null&&e.push(`${t}=${n}`)}function qe(e){return e===``?``:`link=${encodeURIComponent(`${F}${e}`)};`}function K(e){let t=e==null?null:de(e);return t!=null&&!i(t)?t.trim():``}function Je(e){return!Array.isArray(e)||e.length===0?``:encodeURIComponent(JSON.stringify(e.map(e=>({url:e.url,title:e.title}))))}function Ye(e){return typeof e!=`object`||!e||Array.isArray(e)||Object.keys(e).length===0?``:encodeURIComponent(JSON.stringify(e))}const Xe=/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;function Ze(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),Ke(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&&Xe.test(e.strokeHex)&&G(t,`likec4StrokeColor`,e.strokeHex),G(t,`likec4Notation`,e.nodeNotation??void 0),t.length>0?t.join(`;`)+`;`:``}function Qe(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="${z(e)}">${z(n)}</data>`}).join(``)+`</mxUserObject>`}function $e(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 et(e){return e.label?z(e.label):``}function tt(e,t){let n=t?.[`${e.source}|${e.target}|${e.id}`]??t?.[`${e.source}|${e.target}`],r=Array.isArray(n)?n.flatMap(We):[];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 nt(e,t,n,r){let{bboxes:i,fontFamily:a}=t,o=i.get(e.source),s=i.get(e.target),c=o&&s?Ue(o,s):{exitX:1,exitY:.5,entryX:0,entryY:.5},l=`exitX=${c.exitX};exitY=${c.exitY};entryX=${c.entryX};entryY=${c.entryY};`,u=Ve(n,e.color),d=e.line===`dashed`?`dashed=1;`:e.line===`dotted`?`dashed=1;dashPattern=1 1;`:``,f=ft(e.head),p=e.tail==null||e.tail===`none`?`none`:ft(e.tail),m=$e({edgeDesc:K(e.description),edgeTech:K(e.technology),edgeNotes:K(e.notes),edgeNavTo:U(e.navigateTo),edgeKind:V.getKind(e),edgeNotation:V.getNotation(e),edgeLinksJson:Je(V.getLinks(e)),edgeMetadataJson:Ye(V.getMetadata(e))}),h=He(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 rt(e,t,n,r,i,a){let{defaultParentId:o}=t,s=i(e.source),c=i(e.target),l=et(e),u=tt(e,n?.edgeWaypoints);return`<mxCell id="${a}" value="${l}" style="${nt(e,t,r,l)}" edge="1" parent="${o}" source="${s}" target="${c}">
7
+ ${u}${Qe(V.getCustomData(e))}
8
+ </mxCell>`}function it(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 at(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(B.getNotes(e)),g=B.getTags(e),_=Array.isArray(g)&&g.length>0?g.join(`,`):``,v=U(B.getNavigateTo(e)),y=U(B.getIcon(e)),b=d?`shape=rectangle;rounded=0;container=1;collapsible=0;startSize=0;`:ze(e.shape),x=l?.[e.id],ee=u?.[e.id],S=x?Le(Be(r,e.color),x):Be(r,e.color),te=S?.fill??L,ne=S?.stroke??Oe,C=S?.font??S?.stroke??R,re=`fillColor=${te};strokeColor=${ne};fontColor=${C};`,w=e.style,T=a.fontSize(w?.textSize),E=z(Ge(f,p,d,C,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))};`:``,ie=Ze({desc:p,tech:m,notes:h,tagList:_,navTo:v,iconName:y,summaryStr:K(B.getSummary(e)),linksJson:Je(B.getLinks(e)),borderVal:D,containerOpacityNum:j,strokeWidth:O,colorNameForRoundtrip:e.color?encodeURIComponent(String(e.color)):``,nodeStyle:w,strokeHex:ne,nodeNotation:B.getNotation(e)}),N=Qe(B.getCustomData(e)),ae=qe(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}${re}${k}${A}${M}${ae}${ie}`,userObjectXml:N,navTo:v,isContainer:d,title:f,fontFamily:o,containerTitleFontSizePx:s,containerTitleColor:c}}function ot(e,t,n,r,i,a){let o=it(e,t,i),s=at(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 st(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?z(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="${F}${z(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:ct(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 ct(e,t,n,r,i,a,o){let s=z(e),c=Math.max(60,Math.min(260,e.length*8)),l=qe(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="${z(e)}" link="${F}${z(n)}" id="${t}">\n ${d}\n</UserObject>`}function lt(e){return typeof e.title==`string`?e.title:null}function ut(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 dt(e){let t=lt(e),n=ut(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 ft(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 pt(e){return e.x===q.x&&e.y===q.y&&e.width===q.width&&e.height===q.height}function mt(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&&pt(r)&&t.forEach((t,n)=>{e.set(t.id,{...r,x:r.x,y:r.y+n*(r.height+24)})})}}function ht(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=(B.getChildren(t)??[]).filter(e=>r.has(e));if(n.length===0||!pt(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 gt(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 _t(e,n){let r=e.$view,{nodes:i}=r,a=n?.layoutOverride,o=[...i].sort((e,n)=>t(e.parent)&&t(n.parent)?0:t(e.parent)?-1:t(n.parent)?1:e.parent===n.parent?0:e.id.startsWith(n.id+`.`)?1:n.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=B.getChildren(e);return Array.isArray(t)&&t.some(e=>l.has(e))}).map(e=>e.id));mt(c,o,u);let d=Pe(e),f=d.theme.spacing.xl;ht(c,u,o,l,f,d.theme.spacing.xl+d.theme.spacing.md);let{offsetX:p,offsetY:m,canvasWidth:h,canvasHeight:g}=gt(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 vt(e,t){let n=e.$view,{edges:r}=n,i=t?.compressed!==!1,a=_t(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>=I)throw Error(`DrawIO cell ID range exhausted`);t=String(f++),d.set(e,t)}return t},m=[],h=[],g=[],_=I;for(let n of o){let r=st(ot(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>=I)throw Error(`DrawIO cell ID range exhausted`);let r=String(f++);g.push(rt(n,a,t,e,p,r))}let v=[`<mxCell id="${s}" value="" style="${dt(n)}" vertex="1" parent="${c}">
9
+ <mxGeometry x="0" y="0" width="${l}" height="${u}" as="geometry" />
10
+ </mxCell>`,...m,...h,...g].join(`
11
+ `),y=(lt(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
+ <root>
13
+ <mxCell id="${c}" />
14
+ ${v}
15
+ </root>
16
+ </mxGraphModel>`,x=i?Me(b):b;return{name:y,id:n.id,content:x}}function yt(e,t){let n=z(t??new Date().toISOString());return e.length===0?`<?xml version="1.0" encoding="UTF-8"?>
17
+ <mxfile host="LikeC4" modified="${n}" agent="LikeC4" version="1.0" etag="" type="device">
18
+ </mxfile>
19
+ `:`<?xml version="1.0" encoding="UTF-8"?>
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="${z(e.name)}" id="likec4-${z(e.id)}">${e.content}</diagram>`).join(`
22
+ `)}
23
+ </mxfile>
24
+ `}function bt(e,t){return yt([vt(e,t)],t?.modified)}function xt(e,t,n){return yt(e.map(e=>vt(e,t?.[e.$view.id])),n)}function St(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 Ct(e,t,n){let r=t?je(t):null;return Object.fromEntries(e.map(e=>[e,St(e,r,n)]))}function wt(e){let t=Me(e),n=JSON.stringify({type:`xml`,compressed:!0,data:t});return`https://app.diagrams.net/#create=`+encodeURIComponent(n)}const Tt=e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),Et=e=>e.split(`.`).map(Tt).join(``),Dt=e=>Et(e.parent?e.id.slice(e.parent.length+1):e.id),Ot=e=>e.replace(/\\?"/g,`'`),kt=({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 At(e){let n=e.$view,{nodes:r,edges:i}=n,a=new Map,o=(e,t)=>{let n=Dt(e),i=(t?t+`.`:``)+n;a.set(e.id,i);let s=new k;if(e.children.length>0){let t=Ot(e.title);s.append(`subgraph `,i,'["`',t,'`"]',A).indent({indentedChildren:[j(r.filter(t=>t.parent===e.id),e=>o(e,i),{appendNewLineIfNotEmpty:!0})],indentation:2}).append(`end`,A)}else s.append(i,kt(e));return s},s=e=>new k().append(a.get(e.source),` -.`,e.label?' "`'+Ot(e.label)+'`" .-':`-`,`> `,a.get(e.target));return O(new k().append(`---`,A,`title: ${JSON.stringify(Ot(e.titleOrId))}`,A,`---`,A).append(`graph `,n.autoLayout.direction,A).indent({indentedChildren:e=>{e.append(j(r.filter(e=>t(e.parent)),e=>o(e),{appendNewLineIfNotEmpty:!0})).appendIf(i.length>0,j(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 jt(e){let t=d(e);return t.length===0?`never`:s(t,me,m(e=>` | ${JSON.stringify(e.id)}`)).join(`
26
+ `).trimStart()}function Mt(e,t={}){let{useCorePackage:n=!1}=t;return`
27
+ import type { Aux, SpecAux } from '${n?`@likec4/core/types`:`likec4/model`}';
28
+
29
+ export type $Specs = SpecAux<
30
+ // Element kinds
31
+ ${J(p(e.specification.elements))},
32
+ // Deployment kinds
33
+ ${J(p(e.specification.deployments??{}))},
34
+ // Relationship kinds
35
+ ${J(p(e.specification.relationships??{}))},
36
+ // Tags
37
+ ${J(p(e.specification.tags??{}))},
38
+ // Metadata keys
39
+ ${J(e.specification.metadataKeys??[])}
40
+ >
41
+
42
+ export type $Aux = Aux<
43
+ ${JSON.stringify(e.stage)},
44
+ // Elements
45
+ ${jt(e.$data.elements)},
46
+ // Deployments
47
+ ${jt(e.$data.deployments.elements)},
48
+ // Views
49
+ ${J(p(e.$data.views))},
50
+ // Project ID
51
+ ${JSON.stringify(e.projectId)},
52
+ $Specs
53
+ >
54
+
55
+ export type $ElementId = $Aux['ElementId']
56
+ export type $DeploymentId = $Aux['DeploymentId']
57
+ export type $ViewId = $Aux['ViewId']
58
+
59
+ export type $ElementKind = $Aux['ElementKind']
60
+ export type $RelationKind = $Aux['RelationKind']
61
+ export type $DeploymentKind = $Aux['DeploymentKind']
62
+ export type $Tag = $Aux['Tag']
63
+ export type $Tags = readonly $Aux['Tag'][]
64
+ export type $MetadataKey = $Aux['MetadataKey']
65
+ `.trimStart()}function Nt(e,t={}){let n=Mt(e,t),{useCorePackage:r=!1}=t;return`
66
+ /* prettier-ignore-start */
67
+ /* eslint-disable */
68
+
69
+ /******************************************************************************
70
+ * This file was generated
71
+ * DO NOT EDIT MANUALLY!
72
+ ******************************************************************************/
73
+
74
+ import { LikeC4Model } from '${r?`@likec4/core`:`likec4`}/model'
75
+ ${n}
76
+
77
+ export const likec4model: LikeC4Model<$Aux> = new LikeC4Model(${E.stringify(e.$data,{space:2,quote:`'`})} as any) as any
78
+
79
+ /* prettier-ignore-end */
80
+ `.trimStart()}const Pt=e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),Y=e=>e.split(/[.-]/).map(Pt).join(``),Ft=e=>Y(e.parent?e.id.slice(e.parent.length+1):e.id),X=(e,t,n=`#3b82f6`)=>e?t(e)??n:n,It=({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`}},Lt=({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=>i(e)?null:JSON.stringify(e).slice(1,-1).replace(/\\"/g,`"`);function Rt(e){let n=e.$view,r=e.$model.$styles.theme.colors,{nodes:a,edges:o}=n,s=e=>t=>t in r?r[t].elements[e]:void 0,c=e=>t=>t in r?r[t].relationships[e]:void 0,l=new Map,u=()=>new k().append(`title "`,e.titleOrId,`"`,A).append(It(n),` direction`,A),d=()=>new k().append(`hide stereotype`,A).append(`skinparam ranksep `,`60`,A).append(`skinparam nodesep `,`30`,A).append(`skinparam {`,A).indent({indentedChildren:e=>e.append(`arrowFontSize `,`10`,A).append(`defaultTextAlignment `,`center`,A).append(`wrapWidth `,`200`,A).append(`maxMessageSize `,`100`,A).append(`shadowing `,`false`,A),indentation:2}).append(`}`,A),f=e=>{let t=Lt(e),n=Y(e.id);return new k().append(`skinparam `,t,`<<`,n,`>>`,`{`,A).indent({indentedChildren:t=>t.append(`BackgroundColor `,X(e.color,s(`fill`)),A).append(`FontColor `,X(e.color,s(`hiContrast`),`#FFFFFF`),A).append(`BorderColor `,X(e.color,s(`stroke`)),A),indentation:2}).append(`}`,A)},p=e=>{let t=Lt(e),n=Y(e.id),r=Z(e.title)||Ft(e),i=Z(e.technology);l.set(e.id,n);let a=ue.from(e.description);return new k().append(t,` `).append(`"`).append(`==`,r).appendIf(!!i,`\\n<size:10>[`,i,`]</size>`).appendIf(a.nonEmpty,`\\n\\n`,Z(a.text)).append(`"`,` <<`,n,`>> `,`as `,n,A)},m=e=>{let t=Z(e.title)||Ft(e),n=Y(e.id);return l.set(e.id,n),new k().append(`rectangle "`,t,`" <<`,n,`>> as `,n,` {`,A).indent({indentedChildren:t=>t.append(`skinparam `,`RectangleBorderColor<<`,n,`>> `,X(e.color,s(`fill`)),A).append(`skinparam `,`RectangleFontColor<<`,n,`>> `,X(e.color,s(`fill`)),A).append(`skinparam `,`RectangleBorderStyle<<`,n,`>> `,`dashed`,A,A).append(j(a.filter(t=>t.parent===e.id),e=>e.children.length>0?m(e):p(e))),indentation:2}).append(`}`,A)},h=e=>{let t=e.technology||``,n=e.label||t,r=X(e.color,c(`line`),`#777777`),a=e=>`<color:${r}>${e.replaceAll(`"`,`'`)}`,o=new k().append(l.get(e.source),` .[`,r,`,thickness=2].> `,l.get(e.target));return(n||t)&&(o.append(` : `,n.split(`
81
+ `).map(e=>i(e)?e:a(e)).join(`\\n`)),t&&t!==n&&o.append(`\\n<size:8>[`,a(t),`]</size>`)),o.append(A)};return O(new k().append(`@startuml`,A).append(u(),A).append(d(),A).append(j(a.filter(e=>e.children.length==0),e=>f(e),{appendNewLineIfNotEmpty:!0})).append(j(a.filter(e=>t(e.parent)),e=>e.children.length>0?m(e):p(e),{appendNewLineIfNotEmpty:!0})).appendIf(o.length>0,A,j(o,e=>h(e),{appendNewLineIfNotEmpty:!0})).append(`@enduml`,A))}function zt(e){return j(e,e=>D`${E.stringify(e.id)}`,{separator:` | `})}function Bt(e){let t=Array.from(e),n=new k;return n.appendTemplate`
82
+ /******************************************************************************
83
+ * This file was generated
84
+ * DO NOT EDIT MANUALLY!
85
+ ******************************************************************************/
86
+ /* prettier-ignore-start */
87
+ /* eslint-disable */
88
+
89
+ // @ts-nocheck
90
+
91
+ import type { DiagramView } from 'likec4'
92
+ `.append(A,A),t.length===0?(n.append(`export {}`,A),O(n)):(n.appendTemplate`
93
+ export type LikeC4ViewId = ${zt(t)};
94
+ export const LikeC4Views = {
95
+ `.indent({indentation:2,indentedChildren(e){e.appendNewLineIf(t.length>1).append(j(t,e=>D`${E.stringify(e.id)}: (${E.stringify(e)} as unknown) as DiagramView`,{separator:`,`,appendNewLineIfNotEmpty:!0}))}}).append(`} as const satisfies Record<LikeC4ViewId, DiagramView>`,A,A).appendTemplate`
96
+ export type LikeC4Views = typeof LikeC4Views
97
+
98
+ export function isLikeC4ViewId(value: unknown): value is LikeC4ViewId {
99
+ return (
100
+ value != null &&
101
+ typeof value === 'string' &&
102
+ !!LikeC4Views[value]
103
+ )
104
+ }
105
+
106
+ /* prettier-ignore-end */
107
+ `.append(A),O(n))}function Vt(e,t={}){let{useCorePackage:n=!1}=t;pe(!e.isParsed(),`can not generate react types for parsed model`);let r=Mt(e,t);return`
108
+ /* prettier-ignore-start */
109
+ /* eslint-disable */
110
+
111
+ /******************************************************************************
112
+ * This file was generated
113
+ * DO NOT EDIT MANUALLY!
114
+ ******************************************************************************/
115
+
116
+ import type { PropsWithChildren } from 'react'
117
+ import type { JSX } from 'react/jsx-runtime'
118
+ import type { LikeC4Model } from '${n?`@likec4/core`:`likec4`}/model'
119
+ import type { LayoutedView } from '${n?`@likec4/core/types`:`likec4/model`}'
120
+ import type {
121
+ LikeC4ViewProps as GenericLikeC4ViewProps,
122
+ ReactLikeC4Props as GenericReactLikeC4Props
123
+ } from 'likec4/react'
124
+
125
+ ${r}
126
+
127
+ declare function isLikeC4ViewId(value: unknown): value is $ViewId;
128
+
129
+ declare const likec4model: LikeC4Model<$Aux>;
130
+ declare function useLikeC4Model(): LikeC4Model<$Aux>;
131
+ declare function useLikeC4View(viewId: $ViewId): LayoutedView<$Aux>;
132
+
133
+ declare function LikeC4ModelProvider(props: PropsWithChildren): JSX.Element;
134
+
135
+ type IconRendererProps = {
136
+ node: {
137
+ id: string
138
+ title: string
139
+ icon?: string | undefined
140
+ }
141
+ }
142
+ declare function RenderIcon(props: IconRendererProps): JSX.Element;
143
+
144
+ type LikeC4ViewProps = GenericLikeC4ViewProps<$Aux>;
145
+ declare function LikeC4View({viewId, ...props}: LikeC4ViewProps): JSX.Element;
146
+
147
+ type ReactLikeC4Props = GenericReactLikeC4Props<$Aux>
148
+ declare function ReactLikeC4({viewId, ...props}: ReactLikeC4Props): JSX.Element;
149
+
150
+ export {
151
+ type LikeC4ViewProps,
152
+ type ReactLikeC4Props,
153
+ isLikeC4ViewId,
154
+ useLikeC4Model,
155
+ useLikeC4View,
156
+ likec4model,
157
+ LikeC4ModelProvider,
158
+ LikeC4View,
159
+ RenderIcon,
160
+ ReactLikeC4
161
+ }
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=>M(`likec4:plugin`,n,e)+t}}const Ht={"<":`\\u003C`,">":`\\u003E`,"/":`\\u002F`,"\\":`\\\\`,"\b":`\\b`,"\f":`\\f`,"\n":`\\n`,"\r":`\\r`," ":`\\t`,"\0":`\\0`,"\u2028":`\\u2028`,"\u2029":`\\u2029`};function Ut(e){return e.replace(/[<>\b\f\n\r\t\0\u2028\u2029\\]/g,e=>Ht[e])}function $(e,t){return{id:`likec4:${e}`,virtualId:`likec4:plugin/${e}.js`,async load({logger:n,projects:r}){return n.info(T.dim(`generating likec4:${e}`)),`
164
+ export let ${t}Fn = {
165
+ ${r.map(({id:t})=>{let n=Ut(JSON.stringify(M(`likec4:${e}`,t)));return`${JSON.stringify(t)}: () => import(${n})`}).join(`,
166
+ `)}
167
+ }
168
+
169
+ export async function ${t}(projectId) {
170
+ let fn = ${t}Fn[projectId]
171
+ if (!fn) {
172
+ const projects = Object.keys(${t}Fn)
173
+ console.error('Unknown projectId: ' + projectId + ' (available: ' + projects + ')')
174
+ if (projects.length === 0) {
175
+ throw new Error('No projects found, invalid state')
176
+ }
177
+ projectId = projects[0]
178
+ console.warn('Falling back to project: ' + projectId)
179
+ fn = ${t}Fn[projectId]
180
+ }
181
+ return await fn()
182
+ }
183
+
184
+ if (import.meta.hot) {
185
+ import.meta.hot.accept(md => {
186
+ if (!import.meta.hot.data.$update) {
187
+ import.meta.hot.data.$update = ${t}Fn
188
+ }
189
+ const update = md.${t}Fn
190
+ if (update) {
191
+ Object.assign(import.meta.hot.data.$update, update)
192
+ } else {
193
+ import.meta.hot.invalidate()
194
+ }
195
+ })
196
+ }
197
+ `}}}function Wt(e){let t=new k;return t.appendTemplate`
198
+ /******************************************************************************
199
+ * This file was generated
200
+ * DO NOT EDIT MANUALLY!
201
+ ******************************************************************************/
202
+ /* eslint-disable */
203
+
204
+ export function d2Source(viewId) {
205
+ switch (viewId) {
206
+ `.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(j([...e.views()],e=>D`
207
+ case ${JSON.stringify(e.id)}: {
208
+ return ${JSON.stringify(De(e))}
209
+ }
210
+ `,{appendNewLineIfNotEmpty:!0})).appendTemplate`
211
+ default: {
212
+ throw new Error('Unknown viewId: ' + viewId)
213
+ }
214
+ `}}).append(A,` }`,A).appendTemplate`
215
+ }
216
+ `.append(A,A),O(t)}const Gt={...Q(`d2`),async load({likec4:e,project:t,logger:n}){return n.info(T.dim(`generating likec4:d2/${t.id}`)),Wt(await e.computedModel(t.id))}},Kt=$(`d2`,`loadD2Sources`);function qt(e){let t=new k;return t.appendTemplate`
217
+ /******************************************************************************
218
+ * This file was generated
219
+ * DO NOT EDIT MANUALLY!
220
+ ******************************************************************************/
221
+ /* eslint-disable */
222
+
223
+ export function dotSource(viewId) {
224
+ switch (viewId) {
225
+ `.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(j(Object.keys(e),t=>D`
226
+ case ${JSON.stringify(t)}: {
227
+ return ${JSON.stringify(e[t].dot)}
228
+ }
229
+ `,{appendNewLineIfNotEmpty:!0})).appendTemplate`
230
+ default: {
231
+ throw new Error('Unknown viewId: ' + viewId)
232
+ }
233
+ `}}).append(A,` }`,A).appendTemplate`
234
+ }
235
+
236
+ export function svgSource(viewId) {
237
+ switch (viewId) {
238
+ `.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(j(Object.keys(e),t=>D`
239
+ case ${JSON.stringify(t)}: {
240
+ return ${JSON.stringify(e[t].svg)}
241
+ }
242
+ `,{appendNewLineIfNotEmpty:!0})).appendTemplate`
243
+ default: {
244
+ throw new Error('Unknown viewId: ' + viewId)
245
+ }
246
+ `}}).append(A,` }`,A,`}`,A,A),O(t)}const Jt={...Q(`dot`),async load({likec4:e,project:t,logger:n}){return n.info(T.dim(`generating likec4:dot/${t.id}`)),qt(f(await e.views.viewsAsGraphvizOut(t.id),({id:e,svg:t,dot:n})=>[e,{dot:n,svg:t}]))}},Yt=$(`dot`,`loadDotSources`);function Xt(e){let t=new k;return t.appendTemplate`
247
+ /******************************************************************************
248
+ * This file was generated
249
+ * DO NOT EDIT MANUALLY!
250
+ ******************************************************************************/
251
+ /* eslint-disable */
252
+
253
+ export function drawioEditUrl(viewId) {
254
+ switch (viewId) {
255
+ `.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(j([...e.views()],e=>D`
256
+ case ${JSON.stringify(e.id)}: {
257
+ return ${JSON.stringify(wt(bt(e)))}
258
+ }
259
+ `,{appendNewLineIfNotEmpty:!0})).appendTemplate`
260
+ default: {
261
+ throw new Error('Unknown viewId: ' + viewId)
262
+ }
263
+ `}}).append(A,` }`,A).appendTemplate`
264
+ }
265
+ `.append(A,A),O(t)}const Zt={...Q(`drawio`),async load({likec4:e,project:t,logger:n}){return n.info(T.dim(`generating likec4:drawio/${t.id}`)),Xt(await e.layoutedModel(t.id))}},Qt=$(`drawio`,`loadDrawioSources`);function $t(e){let{imports:t,cases:n}=s(e.flatMap(e=>e.nodes.map(e=>e.icon)),r(e=>a(e)&&!(e.toLowerCase().startsWith(`http:`)||e.toLowerCase().startsWith(`https:`))),u(),l(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
+ import { jsx } from 'react/jsx-runtime'
267
+ ${t.join(`
268
+ `)}
269
+
270
+ const Icons = {
271
+ ${n.join(`,
272
+ `)}
273
+ }
274
+ export function IconRenderer({ node, ...props }) {
275
+ const IconComponent = Icons[node.icon ?? '']
276
+ if (!IconComponent) {
277
+ return null
278
+ }
279
+ return jsx(IconComponent, props)
280
+ }
281
+ `}const en={...Q(`icons`,`.jsx`),async load({likec4:e,project:t,logger:n}){return n.info(T.dim(`generating likec4:icons/${t.id}`)),$t(await e.views.computedViews(t.id))}},tn=/^[a-zA-Z0-9_.-]+$/;function nn(e){if(!tn.test(e))throw Error(`Unsafe value for code generation: ${e}`);return JSON.stringify(e)}function rn(e){return JSON.stringify(e)}const an={id:`likec4:icons`,virtualId:`likec4:plugin/icons.jsx`,async load({projects:e,logger:t}){return t.info(T.dim(`generating likec4:icons`)),`
282
+ import { jsx } from 'react/jsx-runtime'
283
+ import { lazy, Suspense } from 'react'
284
+ export let ProjectIconsRegistry = {
285
+ ${e.filter(e=>tn.test(e.id)?!0:(t.warn(T.yellow(`Skipping project with unsafe id for icons registry: ${e.id}`)),!1)).map(e=>({idLiteral:nn(e.id),pkgLiteral:rn(M(`likec4:icons`,e.id))})).map(({idLiteral:e,pkgLiteral:t})=>`${e}: lazy(() => import(${t}).then(m => ({default: m.IconRenderer})))`).join(`,
286
+ `)}
287
+ }
288
+
289
+
290
+ export function getProjectIcons(projectId) {
291
+ let fn = ProjectIconsRegistry[projectId]
292
+ if (!fn) {
293
+ const projects = Object.keys(ProjectIconsRegistry)
294
+ console.error('Unknown projectId: ' + projectId + ' (available: ' + projects + ')')
295
+ if (projects.length === 0) {
296
+ throw new Error('No projects found, invalid state')
297
+ }
298
+ projectId = projects[0]
299
+ console.warn('Falling back to project: ' + projectId)
300
+ fn = ProjectIconsRegistry[projectId]
301
+ }
302
+ return (props) => jsx(Suspense, { children: jsx(fn, props) })
303
+ }
304
+
305
+ if (import.meta.hot) {
306
+ import.meta.hot.accept(md => {
307
+ if (!import.meta.hot.data.$update) {
308
+ import.meta.hot.data.$update = ProjectIconsRegistry
309
+ }
310
+ const update = md.ProjectIconsRegistry
311
+ if (update) {
312
+ Object.assign(import.meta.hot.data.$update, update)
313
+ } else {
314
+ import.meta.hot.invalidate()
315
+ }
316
+ })
317
+ }
318
+ `}};function on(e){let t=new k;return t.appendTemplate`
319
+ /******************************************************************************
320
+ * This file was generated
321
+ * DO NOT EDIT MANUALLY!
322
+ ******************************************************************************/
323
+ /* eslint-disable */
324
+
325
+ export function mmdSource(viewId) {
326
+ switch (viewId) {
327
+ `.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(j([...e.views()],e=>D`
328
+ case ${JSON.stringify(e.id)}: {
329
+ return ${JSON.stringify(At(e))}
330
+ }
331
+ `,{appendNewLineIfNotEmpty:!0})).appendTemplate`
332
+ default: {
333
+ throw new Error('Unknown viewId: ' + viewId)
334
+ }
335
+ `}}).append(A,` }`,A).appendTemplate`
336
+ }
337
+
338
+ `.append(A,A),O(t)}const sn={...Q(`mmd`),async load({likec4:e,project:t,logger:n}){return n.info(T.dim(`generating virtual:likec4/mmd/${t.id}`)),on(await e.computedModel(t.id))}},cn=$(`mmd`,`loadMmdSources`),ln=e=>`
339
+ import { createHooksForModel, atom } from 'likec4/vite-plugin/internal'
340
+
341
+ export const $likec4data = atom(${E.stringify(e.$data)})
342
+
343
+ export const {
344
+ updateModel,
345
+ $likec4model,
346
+ useLikeC4Model,
347
+ useLikeC4Views,
348
+ useLikeC4View
349
+ } = createHooksForModel($likec4data)
350
+
351
+ if (import.meta.hot) {
352
+ import.meta.hot.accept(md => {
353
+ if (!import.meta.hot.data.$update) {
354
+ import.meta.hot.data.$update = updateModel
355
+ }
356
+ const update = md.$likec4data?.get()
357
+ if (update) {
358
+ import.meta.hot.data.$update(update)
359
+ } else {
360
+ import.meta.hot.invalidate()
361
+ }
362
+ })
363
+ }
364
+ `,un={...Q(`model`),async load({likec4:e,project:t,logger:n}){return n.info(T.dim(`generating likec4:model/${t.id}`)),ln(await e.layoutedModel(t.id))}},dn=$(`model`,`loadModel`),fn=e=>`
365
+ import { atom, useStore } from 'likec4/vite-plugin/internal'
366
+
367
+ export const isSingleProject = ${e.length===1};
368
+ export const projects = ${E.stringify(e,null,2)};
369
+
370
+ export const $projects = atom([...projects])
371
+
372
+ export function useLikeC4Projects() {
373
+ return useStore($projects)
374
+ }
375
+
376
+ if (import.meta.hot) {
377
+ import.meta.hot.accept(md => {
378
+ if (!import.meta.hot.data.$projects) {
379
+ import.meta.hot.data.$projects = $projects
380
+ }
381
+ if (!import.meta.hot.data.projects) {
382
+ import.meta.hot.data.projects = projects
383
+ }
384
+ const update = md.projects
385
+ if (update) {
386
+ import.meta.hot.data.projects.length = 0
387
+ import.meta.hot.data.projects.push(...update)
388
+ import.meta.hot.data.$projects.set(update)
389
+ } else {
390
+ import.meta.hot.invalidate()
391
+ }
392
+ })
393
+ }
394
+ `,pn={id:`likec4:projects`,virtualId:`likec4:plugin/projects.js`,async load({logger:e,projects:t}){return e.info(T.dim(`generating likec4:projects`)),fn(m(t,c([`id`,`title`])))}},mn=e=>`
395
+ import { atom, useStore } from 'likec4/vite-plugin/internal'
396
+
397
+ export const $viewdata = atom(${E.stringify(e)})
398
+
399
+ export function useLikeC4ProjectsOverview() {
400
+ return useStore($viewdata)
401
+ }
402
+
403
+ if (import.meta.hot) {
404
+ import.meta.hot.accept(md => {
405
+ if (!import.meta.hot.data.$viewdata) {
406
+ import.meta.hot.data.$viewdata = $viewdata
407
+ }
408
+ const update = md.$viewdata?.value
409
+ if (update) {
410
+ import.meta.hot.data.$viewdata.set(update)
411
+ } else {
412
+ import.meta.hot.invalidate()
413
+ }
414
+ })
415
+ }
416
+ `,hn=()=>`
417
+ export function useLikeC4ProjectsOverview() {
418
+ throw new Error('No projects overview available for this workspace: single project mode is enabled')
419
+ }
420
+ `,gn={id:`likec4:projects-overview`,virtualId:`likec4:plugin/projects-overview.js`,async load({logger:e,projects:t,likec4:n}){return t.length<2?hn():(e.info(T.dim(`generating likec4:projects-overview`)),mn(await n.projectsOverview()))}};function _n(e){let t=new k;return t.appendTemplate`
421
+ /******************************************************************************
422
+ * This file was generated
423
+ * DO NOT EDIT MANUALLY!
424
+ ******************************************************************************/
425
+ /* eslint-disable */
426
+
427
+ export function pumlSource(viewId) {
428
+ switch (viewId) {
429
+ `.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(j([...e.views()],e=>D`
430
+ case ${JSON.stringify(e.id)}: {
431
+ return ${JSON.stringify(Rt(e))}
432
+ }
433
+ `,{appendNewLineIfNotEmpty:!0})).appendTemplate`
434
+ default: {
435
+ throw new Error('Unknown viewId: ' + viewId)
436
+ }
437
+ `}}).append(A,` }`,A).appendTemplate`
438
+ }
439
+ `.append(A,A),O(t)}const vn={...Q(`puml`),async load({likec4:e,project:t,logger:n}){return n.info(T.dim(`generating likec4:puml/${t.id}`)),_n(await e.computedModel(t.id))}},yn=$(`puml`,`loadPumlSources`),bn=e=>`
440
+ import { jsx as _jsx } from "react/jsx-runtime";
441
+ import { LikeC4ModelProvider as Provider, LikeC4View as GenericView, ReactLikeC4 as GenericReactLikeC4 } from 'likec4/react';
442
+ import { IconRenderer } from 'likec4:icons/${e}'
443
+
444
+ import { useLikeC4Model, useLikeC4Views, useLikeC4View } from 'likec4:model/${e}'
445
+
446
+ export function LikeC4ModelProvider({ children }) {
447
+ const likeC4Model = useLikeC4Model()
448
+ return (_jsx(Provider, { likec4model: likeC4Model, children: children }));
449
+ }
450
+ export function LikeC4View(props) {
451
+ return (_jsx(LikeC4ModelProvider, { children: _jsx(GenericView, { renderIcon: IconRenderer, ...props }) }));
452
+ }
453
+ export function ReactLikeC4(props) {
454
+ return (_jsx(LikeC4ModelProvider, { children: _jsx(GenericReactLikeC4, { renderIcon: IconRenderer, ...props }) }));
455
+ }
456
+
457
+ export {
458
+ useLikeC4Model,
459
+ useLikeC4View,
460
+ useLikeC4Views
461
+ }
462
+ `,xn={...Q(`react`),async load({project:e,logger:t}){return t.info(T.dim(`generating likec4:react/${e.id}`)),bn(e.id)}},Sn={id:`likec4:react`,virtualId:`likec4:plugin/react.js`,async load({logger:e,projects:t}){let n=o(t);return e.info(T.dim(`generating likec4:react for`)+` `+n.id),bn(n.id)}},Cn={id:`likec4:rpc`,virtualId:`likec4:plugin/rpc.js`,async load({logger:e}){return e.info(T.dim(`generating likec4:rpc`)),`
463
+ import { createRpc } from 'likec4/vite-plugin/internal'
464
+
465
+ export const isRpcAvailable = !!import.meta.hot
466
+
467
+ let rpc
468
+ if (import.meta.hot) {
469
+ rpc = createRpc({
470
+ send: (event, data) => {
471
+ import.meta.hot.send(event, data)
472
+ },
473
+ on: (event, fn) => {
474
+ import.meta.hot.on(event, fn)
475
+ }
476
+ })
477
+
478
+ import.meta.hot.accept()
479
+ }
480
+
481
+ export const likec4rpc = rpc ?? {
482
+ updateView: () => {
483
+ throw new Error('likec4rpc.updateView is not available in production')
484
+ },
485
+ calcAdhocView: () => {
486
+ throw new Error('likec4rpc.calcAdhocView is not available in production')
487
+ },
488
+ }
489
+ `}},wn=e=>`
490
+ export { IconRenderer } from 'likec4:icons/${e}'
491
+ export {
492
+ $likec4data,
493
+ $likec4model,
494
+ useLikeC4Model,
495
+ useLikeC4Views,
496
+ useLikeC4View
497
+ } from 'likec4:model/${e}'
498
+ export const projectId = ${JSON.stringify(e)}
499
+ `,Tn={id:`likec4:single-project`,virtualId:`likec4:plugin/single-project.js`,async load({logger:e,projects:t}){let n=o(t);return e.info(T.dim(`generating likec4:single-project for`)+` `+n.id),wn(n.id)}},En=[un,en,Gt,Jt,sn,vn,Zt],Dn=[...En,xn],On=[pn,dn,gn,Tn,Sn,Kt,Yt,cn,yn,Qt,an,Cn];function kn({environments:e,...t}){let r,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)r=t.languageServices;else{let n=a=t.watch??e.mode===`development`;r=(await ge(t.workspace??e.root,{graphviz:t.graphviz??`wasm`,watch:n})).languageServices}i=r.workspaceUri.fsPath},resolveId(e){for(let t of Dn){let n=t.matches(e);if(n)return t.virtualId(n)}for(let t of On)if(t.id===e)return t.virtualId;return null},async load(e){for(let t of Dn){let n=t.matches(e);if(n){let e=r.project(n);return await t.load({logger:P,likec4:r,project:e,assetsDir:i})}}for(let t of On)if(t.virtualId===e){let e=r.projects();return ae(oe(e)),await t.load({logger:P,likec4:r,projects:e,assetsDir:i})}return null},configureServer(e){let t=e.hot;xe.call(this,{logger:P,likec4:r,server:e});let i=()=>m(r.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){P.error(ne(e))}};r.builder.onModelParsed(async()=>{let[e]=r.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(!n(s,a)){a=s,await o(pn.virtualId),await o(an.virtualId),await o(dn.virtualId),a.length>1&&await o(gn.virtualId);return}for(let e of s)for(let t of En)await o(t.virtualId(e.id))})},async buildEnd(){a&&await r.dispose()}}}export{Nt as a,bt as c,De as d,ge as f,Rt as i,xt as l,Vt as n,At as o,Bt as r,Ct as s,kn as t,ke as u};