likec4 1.59.3 → 1.60.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__/codegen/react.mjs +6 -6
- package/__app__/codegen/webcomponent.mjs +147 -69
- package/__app__/src/aichat/index.mjs +10 -5
- package/__app__/src/chunks/AIChat.mjs +1134 -693
- package/__app__/src/chunks/LikeC4Styles.mjs +4101 -1737
- package/__app__/src/chunks/ProjectsOverview.mjs +624 -334
- package/__app__/src/chunks/es.mjs +515 -335
- package/__app__/src/chunks/hooks.mjs +578 -366
- package/__app__/src/chunks/libs/@floating-ui.mjs +2720 -1966
- package/__app__/src/chunks/libs/@mantine.mjs +14067 -9487
- package/__app__/src/chunks/libs/@tanstack-ai.mjs +2266 -1146
- package/__app__/src/chunks/libs/@tanstack.mjs +3152 -1932
- package/__app__/src/chunks/libs/@xstate/react.mjs +2924 -1468
- package/__app__/src/chunks/libs/@xyflow/react.mjs +6627 -4067
- package/__app__/src/chunks/libs/bezier-js.mjs +1312 -726
- package/__app__/src/chunks/libs/d3.mjs +3218 -1509
- package/__app__/src/chunks/libs/fast-equals.mjs +437 -201
- package/__app__/src/chunks/libs/framer.mjs +9251 -3846
- package/__app__/src/chunks/libs/nanostores.mjs +174 -0
- package/__app__/src/chunks/libs/zod.mjs +4591 -2363
- package/__app__/src/chunks/rolldown-runtime.mjs +39 -23
- package/__app__/src/chunks/styled-system.mjs +3538 -756
- package/__app__/src/fonts.css +112 -1
- package/__app__/src/main.mjs +44398 -24039
- package/__app__/src/style.css +18488 -1
- package/config/schema.json +136 -97
- package/dist/app/render-view-client.css +1 -1
- package/dist/app/render-view-client.js +506 -338
- package/dist/chunks/enableServer.mjs +1 -1
- package/dist/chunks/filenames.mjs +16 -14
- package/dist/chunks/generate-likec4.mjs +5 -0
- package/dist/chunks/index.d.mts +246 -180
- package/dist/chunks/index2.d.mts +2882 -1977
- package/dist/chunks/libs/@chevrotain/gast.mjs +27 -1
- package/dist/chunks/libs/@chevrotain/regexp-to-ast.mjs +81 -9
- package/dist/chunks/libs/@chevrotain/types.d.mts +111 -0
- package/dist/chunks/libs/@logtape/logtape.mjs +5 -4
- package/dist/chunks/libs/@lume/kiwi.mjs +1 -1
- package/dist/chunks/libs/@ts-graphviz/core.mjs +1 -1
- package/dist/chunks/libs/birpc.mjs +1 -1
- package/dist/chunks/libs/chevrotain-allstar.mjs +2 -2
- package/dist/chunks/libs/chevrotain.mjs +87 -35
- package/dist/chunks/libs/eventemitter3.mjs +1 -1
- package/dist/chunks/libs/json5.mjs +4 -4
- package/dist/chunks/libs/langium.d.mts +9903 -5297
- package/dist/chunks/libs/langium.mjs +16 -24
- package/dist/chunks/libs/merge-error-cause.mjs +1 -1
- package/dist/chunks/libs/p-limit.mjs +1 -0
- package/dist/chunks/libs/p-queue.mjs +1 -1
- package/dist/chunks/libs/package-manager-detector.mjs +1 -1
- package/dist/chunks/libs/pako.mjs +2 -2
- package/dist/chunks/libs/pretty-ms.mjs +1 -1
- package/dist/chunks/libs/remeda.mjs +1 -1
- package/dist/chunks/libs/ufo.mjs +1 -1
- package/dist/chunks/libs/unstorage.mjs +1 -1
- package/dist/chunks/libs/which.mjs +1 -1
- package/dist/chunks/node.mjs +60 -60
- package/dist/chunks/rolldown-runtime.mjs +1 -1
- package/dist/chunks/sequence-view.mjs +1 -1
- package/dist/chunks/vite-plugin.mjs +55 -52
- package/dist/cli/index.d.mts +1 -1
- package/dist/cli/index.mjs +208 -1300
- package/dist/config/index.d.mts +2 -2
- package/dist/generators/likec4.d.mts +6578 -0
- package/dist/generators/likec4.mjs +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/model/index.d.mts +8 -5
- package/dist/vite-plugin/index.d.mts +6 -3
- package/dist/vite-plugin/index.mjs +1 -1
- package/dist/vite-plugin/internal/chunks/rolldown-runtime.mjs +9 -0
- package/dist/vite-plugin/internal/index.d.mts +16 -15
- package/dist/vite-plugin/internal/index.mjs +144 -46
- package/generators/likec4/package.json +4 -0
- package/package.json +117 -110
- package/react/index.d.mts +8500 -5399
- package/react/index.mjs +534 -58617
- package/react/rolldown-runtime-DnkiqaRY.js +1 -0
- package/skills/likec4-dsl/SKILL.md +428 -0
- package/skills/likec4-dsl/evals/evals-public.json +202 -0
- package/skills/likec4-dsl/evals/grading-spec.json +589 -0
- package/skills/likec4-dsl/references/bridge-leanix-drawio.md +42 -0
- package/skills/likec4-dsl/references/cli.md +139 -0
- package/skills/likec4-dsl/references/configuration.md +266 -0
- package/skills/likec4-dsl/references/deployment.md +160 -0
- package/skills/likec4-dsl/references/dynamic-views.md +455 -0
- package/skills/likec4-dsl/references/examples.md +370 -0
- package/skills/likec4-dsl/references/identifier-validity.md +90 -0
- package/skills/likec4-dsl/references/include-predicates-wildcards.md +179 -0
- package/skills/likec4-dsl/references/model.md +151 -0
- package/skills/likec4-dsl/references/predicates.md +123 -0
- package/skills/likec4-dsl/references/relationships-bidirectional.md +176 -0
- package/skills/likec4-dsl/references/specification.md +75 -0
- package/skills/likec4-dsl/references/style-tokens-colors.md +150 -0
- package/skills/likec4-dsl/references/troubleshooting.md +96 -0
- package/skills/likec4-dsl/references/views.md +329 -0
- package/vite-plugin-modules.d.ts +4 -2
- package/dist/chunks/libs/picomatch.mjs +0 -1
- package/dist/chunks/libs/zod.d.mts +0 -2140
- package/dist/chunks/libs/zod.mjs +0 -65
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime.mjs";import{
|
|
2
|
-
export let ${
|
|
1
|
+
import{i as e}from"./rolldown-runtime.mjs";import{C as t,g as n,r,v as i,y as a}from"./node.mjs";import{_ as o,b as s,g as c,h as l,y as u}from"./libs/langium.mjs";import{o as d}from"./libs/ufo.mjs";import{t as f}from"./libs/json5.mjs";import{l as p}from"./filenames.mjs";import{$ as m,B as h,F as g,H as _,I as v,J as y,N as b,Q as x,U as ee,Z as S,b as C,c as w,h as te,k as T,o as E,r as D,t as O,tt as k,v as ne,w as A,y as j}from"./libs/remeda.mjs";import{$ as M,Q as N}from"./generate-likec4.mjs";import{n as P,t as re}from"./libs/package-manager-detector.mjs";import{t as ie}from"./libs/birpc.mjs";import{t as ae}from"./libs/pako.mjs";import{createRequire as oe}from"node:module";import{mkdir as se,readFile as ce,writeFile as le}from"node:fs/promises";import{resolve as F}from"node:path";import*as I from"zod/v4";import{RichText as ue,exact as de,flattenMarkdownOrString as L}from"@likec4/core/types";import{DefaultMap as R,LikeC4Styles as fe,exact as z,invariant as pe,nonexhaustive as me}from"@likec4/core";import{compareNatural as he,nonNullable as ge}from"@likec4/core/utils";import"@likec4/core/model";import _e from"nano-spawn";import{existsSync as ve}from"node:fs";import{env as B}from"std-env";import V,{cwd as ye}from"node:process";const pDebounce=(e,t,n={})=>{if(!Number.isFinite(t))throw TypeError("Expected `wait` to be a finite number");let r,i,a=[],onAbort=()=>{clearTimeout(i),i=void 0;try{n.signal?.throwIfAborted()}catch(e){for(let{reject:t}of a)t(e);a=[]}};return function(...o){return new Promise((s,c)=>{try{n.signal?.throwIfAborted()}catch(e){c(e);return}let l=n.before&&!i;clearTimeout(i),i=setTimeout(async()=>{i=void 0;let t=a;a=[];try{let i=n.before?r:await e.apply(this,o);for(let{resolve:e}of t)e(i)}catch(e){for(let{reject:n}of t)n(e)}r=void 0,n.signal?.removeEventListener(`abort`,onAbort)},t),l?(async()=>{try{r=await e.apply(this,o),s(r)}catch(e){c(e)}})():(a.push({resolve:s,reject:c}),n.signal&&a.length===1&&n.signal.addEventListener(`abort`,onAbort,{once:!0}))})}};pDebounce.promise=(e,t={})=>{let n,r;return async function(...i){if(n)return t.after?(r??={resolvers:[]},r.arguments=i,r.context=this,new Promise((e,t)=>{r.resolvers.push({resolve:e,reject:t})})):n;n=(async()=>{let t,n,a=!1;try{t=await e.apply(this,i)}catch(e){n=e,a=!0}for(;r;){let t=r;r=void 0;try{let n=await e.apply(t.context,t.arguments);for(let{resolve:e}of t.resolvers)e(n)}catch(e){for(let{reject:n}of t.resolvers)n(e)}}if(a)throw n;return t})();try{return await n}finally{n=void 0}}};function effectiveWebappExportFormats(e){let t=e.webapp?.exportFormats;if(!t)return[...p];let n=new Set(t);return p.filter(e=>n.has(e))}function isWebappExportFormatEnabled(e,t){return effectiveWebappExportFormats(e).includes(t)}function isJsonStringifyOutput(e){if(e.length===0)return!1;try{return JSON.parse(e),!0}catch{return!1}}function hardenJsonStringLiteralForEmbeddedScript(e){if(typeof e!=`string`)throw TypeError(`hardenJsonStringLiteralForEmbeddedScript: expected JSON.stringify(...) output as a string`);if(!isJsonStringifyOutput(e))throw TypeError(`hardenJsonStringLiteralForEmbeddedScript: expected JSON.stringify(...) output (string, object, array, number, boolean, or null)`);return e.replaceAll(`<`,`\\u003C`).replaceAll(`>`,`\\u003E`).replaceAll(`/`,`\\u002F`).replaceAll(`\u2028`,`\\u2028`).replaceAll(`\u2029`,`\\u2029`)}function generateMatches(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=>d(`likec4:plugin`,n,e)+t}}function generateCombinedProjects(e,t,n){return{id:`likec4:${e}`,virtualId:`likec4:plugin/`+e+`.js`,async load({projects:r}){logGenerating(e);let i=(n?r.filter(({config:e})=>isWebappExportFormatEnabled(e,n)):r).map(({id:t})=>`${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(t))}: async () => await import(${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(d(`likec4:${e}`,t)))})`),a=n?hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(`Project does not enable ${n} export: `)):null,o=t+`Registry`;return{code:`
|
|
2
|
+
export let ${o} = {
|
|
3
3
|
${i.join(`,
|
|
4
4
|
`)}
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
export async function ${t}(projectId) {
|
|
8
|
-
let fn = ${
|
|
8
|
+
let fn = ${o}[projectId]
|
|
9
9
|
if (!fn) {
|
|
10
|
-
const projects = Object.keys(${
|
|
10
|
+
const projects = Object.keys(${o})
|
|
11
11
|
console.error('Unknown projectId: ' + projectId + ' (available: ' + projects + ')')
|
|
12
12
|
${n?`throw new Error(${a} + projectId)`:`
|
|
13
13
|
if (projects.length === 0) {
|
|
@@ -15,7 +15,7 @@ export async function ${t}(projectId) {
|
|
|
15
15
|
}
|
|
16
16
|
projectId = projects[0]
|
|
17
17
|
console.warn('Falling back to project: ' + projectId)
|
|
18
|
-
fn = ${
|
|
18
|
+
fn = ${o}[projectId]
|
|
19
19
|
`}
|
|
20
20
|
}
|
|
21
21
|
return await fn()
|
|
@@ -23,21 +23,24 @@ export async function ${t}(projectId) {
|
|
|
23
23
|
|
|
24
24
|
if (import.meta.hot) {
|
|
25
25
|
import.meta.hot.accept(md => {
|
|
26
|
-
|
|
26
|
+
if (!import.meta.hot.data.$update) {
|
|
27
|
+
import.meta.hot.data.$update = ${o}
|
|
28
|
+
}
|
|
29
|
+
const update = md.${o}
|
|
27
30
|
if (update) {
|
|
28
|
-
|
|
31
|
+
Object.assign(import.meta.hot.data.$update, update)
|
|
29
32
|
} else {
|
|
30
33
|
import.meta.hot.invalidate()
|
|
31
|
-
}
|
|
34
|
+
}
|
|
32
35
|
})
|
|
33
36
|
}
|
|
34
|
-
`,moduleType:`js`}}}}const
|
|
37
|
+
`,moduleType:`js`}}}}const H=a.getChild(`vite`);function logGenerating(e,t){t?H.info(n.dim(`generating `)+n.magenta(`likec4:${e}/`)+n.magentaBright(t)):H.info(n.dim(`generating `)+n.magenta(`likec4:${e}`))}function isInstalled(e){try{return!!import.meta.resolve(e,V.cwd())}catch(e){return H.trace(t(e)),!1}}async function ensurePackage(e){let r=H.getChild(`pkg`);if(isInstalled(e)){r.trace`${e} installed`;return}r.warn(n.dim(`not found `)+n.green(e));let i=ge(await re(),()=>{r.error`Package manager not detected, install ${e} manually`,V.exit(1)}),{command:a,args:o}=ge(P(i.agent,`add`,[e]),()=>{r.error`Install package ${e} manually`,V.exit(1)});r.info(n.dim(`installing `)+n.green(e));try{await _e(a,o)}catch(n){r.debug(t(n)),r.error`Install package ${e} manually`,V.exit(1)}}const U=H.getChild(`ai`);function chooseModel(e,t){let r=B[e];return r||=(U.info(`I will use `+n.green(t)+` model `+n.dim(`you can override with `)+n.yellow(e)+n.dim(` env var`)),t),r}const W=16e3;async function loadOpenAI(){U.info(`Found `+n.yellow(`OPENAI_API_KEY`)+n.dim(`, loading @tanstack/ai-openai`)),await ensurePackage(`@tanstack/ai-openai`);let{openaiText:e}=await import(`@tanstack/ai-openai`);return{adapter:e(chooseModel(`OPENAI_CHAT_MODEL`,`gpt-5.2`)),modelOptions:{reasoning:{effort:`medium`}},maxTokens:W}}async function loadOpenRouter(){U.info(`Found `+n.yellow(`OPENROUTER_API_KEY`)+n.dim(`, loading @tanstack/ai-openrouter`)),await ensurePackage(`@tanstack/ai-openrouter`);let{openRouterText:e}=await import(`@tanstack/ai-openrouter`);return{adapter:e(chooseModel(`OPENROUTER_CHAT_MODEL`,`openai/gpt-5.4`)),maxTokens:W}}async function loadAnthropic(){U.info(`Found `+n.yellow(`ANTHROPIC_API_KEY`)+n.dim(`, loading @tanstack/ai-anthropic`)),await ensurePackage(`@tanstack/ai-anthropic`);let{anthropicText:e}=await import(`@tanstack/ai-anthropic`);return{adapter:e(chooseModel(`ANTHROPIC_CHAT_MODEL`,`claude-sonnet-4-6`)),maxTokens:W}}async function loadGemini(){U.info(`Found `+n.yellow(`GEMINI_API_KEY`)+n.dim(`, loading @tanstack/ai-gemini`)),await ensurePackage(`@tanstack/ai-gemini`);let{geminiText:e}=await import(`@tanstack/ai-gemini`);return{adapter:e(chooseModel(`GEMINI_CHAT_MODEL`,`gemini-2.5-pro`)),maxTokens:W}}async function loadOllama(){U.info(`Found `+n.yellow(`OLLAMA_HOST`)+n.dim(`, loading @tanstack/ai-ollama`)),await ensurePackage(`@tanstack/ai-ollama`);let{ollamaText:e}=await import(`@tanstack/ai-ollama`),t=chooseModel(`OLLAMA_CHAT_MODEL`,`qwen3`);return{adapter:e(t),modelOptions:{model:t,think:`low`},maxTokens:W}}const be={global_en:`https://api.minimax.io/v1`,cn_zh:`https://api.minimaxi.com/v1`};function chooseMiniMaxBaseURL(){let e=B.MINIMAX_REGION?.trim().toLowerCase();return e===`cn_zh`||e===`cn`||e===`cn-zh`||e===`china`?be.cn_zh:be.global_en}async function loadMiniMax(){let e=chooseMiniMaxBaseURL();U.info(`Found `+n.yellow(`MINIMAX_API_KEY`)+n.dim(`, loading OpenAI-compatible adapter on `)+n.green(e)),await ensurePackage(`@tanstack/ai-openai`);let{createOpenaiChat:t}=await import(`@tanstack/ai-openai`),r=B.MINIMAX_API_KEY;return{adapter:t(chooseModel(`MINIMAX_CHAT_MODEL`,`MiniMax-M3`),r,{baseURL:e}),maxTokens:W}}function pickLoader(){if(A(B.OPENAI_API_KEY))return loadOpenAI;if(A(B.OPENROUTER_API_KEY))return loadOpenRouter;if(A(B.ANTHROPIC_API_KEY))return loadAnthropic;if(A(B.GEMINI_API_KEY))return loadGemini;if(A(B.OLLAMA_HOST))return loadOllama;if(A(B.MINIMAX_API_KEY))return loadMiniMax}const xe=te(async()=>{let e=pickLoader();if(e){await ensurePackage(`@tanstack/ai`);let t=await e();return U.info([`AI configured with`,n.green(t.adapter.name),`adapter`,n.dim(`you can disable it in plugin options`)].join(` `)),t}}),G=H.getChild(`icons`);function iconBundlePlugin(e){let t=ye(),r=[t];e.workspace&&r.unshift(e.workspace);let i=oe(t),a,resolveIcon=async(e,t)=>{try{let a=i.resolve(`@likec4/icons/${e}/${t}`,{paths:r});return G.trace(n.dim(`found in package `)+a),await ce(a,`utf-8`)}catch{return}},readFromCache=async(e,t)=>{if(a)try{let r=F(a,e,`${t}.js`);if(ve(r))return G.trace(n.dim(`read cached `)+`${e}/${t}.js`),await ce(r,`utf-8`)}catch{}},writeToCache=async(e,t,r)=>{if(a)try{let i=F(a,e);ve(i)||await se(i,{recursive:!0});let o=F(i,`${t}.js`);await le(o,r),G.trace(n.dim(`written to cache `)+o)}catch(r){G.error(n.dim(`failed to write to cache `)+`${e}/${t}.js`,{error:r})}},fetchFromRemote=async(e,t)=>{let r=d(`https://icons.like-c4.dev`,e,`${t}.js`);G.trace(n.dim(`fetching `)+r);let i=await fetch(r);if(!i.ok)throw Error(`Failed to fetch icon: ${i.status} ${i.statusText}`);return await i.text()},o=new R(async e=>{try{let[t,r]=e.split(`:`);(r.endsWith(`.jsx`)||r.endsWith(`.js`))&&(r=r.slice(0,r.lastIndexOf(`.`))),G.debug(n.dim(`resolving `)+n.green(`${t}:${r}`));let i=await readFromCache(t,r);return i??=await resolveIcon(t,r),i||(i=await fetchFromRemote(t,r),await writeToCache(t,r,i),i)}catch(t){return G.error(n.dim(`failed to resolve icon `)+n.red(e),{error:t}),`
|
|
35
38
|
export default function NotFoundIcon() {
|
|
36
39
|
return null
|
|
37
40
|
}
|
|
38
|
-
`}});return{name:`likec4:icon-bundle`,sharedDuringBuild:!0,applyToEnvironment(t){return!e.environments||e.environments.includes(t.name)},configResolved({root:e,...t}){
|
|
39
|
-
`+
|
|
40
|
-
{response}`,{error:t,response:e});return}}function restoreIdsAndMapToHints(e,t){let{mapping:n}=t,nodeId=e=>{let t=n.nodes[e]?.id;return t||
|
|
41
|
+
`}});return{name:`likec4:icon-bundle`,sharedDuringBuild:!0,applyToEnvironment(t){return!e.environments||e.environments.includes(t.name)},configResolved({root:e,...t}){r.unshift(e),t.cacheDir&&(a=F(t.cacheDir,`likec4-icons`))},resolveId:{filter:{id:/likec4:icon-bundle/},handler(e){return{id:e,moduleSideEffects:!1}}},load:{filter:{id:/likec4:icon-bundle/},async handler(e){let t=e.split(`/`).slice(-2);if(!m(t,2))return null;let[n,r]=t;return{moduleType:`jsx`,code:await o.get(`${n}:${r}`)}}}}}const K=/* @__PURE__ */ i(`ai-layout`);function truncate(e,t=100){return e=e.replaceAll(/\n/g,` `).trim(),e.length<=t?e:e.slice(0,t-1)+`…`}function mappedEntries(e){let t={};for(let[n,r]of e.entries())t[r]=n;return t}function edgeLabel(e){let t=e.label&&e.label!==`[...]`?e.label:void 0,n=L(e.description);return n&&(t=t?`${t}\n${n}`:n),t??=e.technology??void 0,t?truncate(t):void 0}function prepareLLMInput(e){let t=1,n=1,r=new R(e=>e.children.length===0?`n${n++}`:`c${t++}`),findNodeById=t=>e.nodes.find(e=>e.id===t),nodeId=e=>r.get(findNodeById(e)),i=/* @__PURE__ */ new Set;e.nodes.forEach(e=>{r.get(e),e.children.length===0&&i.add(e.id)});let a=e.edges.find(e=>!i.has(e.source)||!i.has(e.target));if(a)throw K.error(`Non-leaf edge found in view`,{view:e.id,edge:{source:a.source,target:a.target}}),Error(`Non-leaf edge found in view, this is not supported by the current implementation`);let o=1,s=new R(e=>`e${o++}`),c=e.edges.map(e=>{let t=nodeId(e.source),n=nodeId(e.target),r=e.parent?nodeId(e.parent):null;e.dir===`back`&&([t,n]=[n,t]);let i=edgeLabel(e);return{id:s.get(e),...i&&{label:i},...r&&{parent:r},source:t,target:n}}),reduceNodes=(e,t)=>{let{level:n,kind:i,...a}=t,o=r.get(t),s=a.children.length>0,c=a.parent?nodeId(a.parent):void 0,l=truncate(a.title);if(s)return e.compounds.push(de({id:o,title:l,parent:c,children:a.children.map(nodeId),level:n})),e;let u=a.description?truncate(L(a.description),200):void 0;return e.nodes.push(de({id:o,kind:i,title:l,description:u,parent:c,level:n})),e};return{serialized:e.nodes.reduce(reduceNodes,{direction:e.autoLayout.direction,compounds:[],nodes:[],edges:c}),mapping:{nodes:mappedEntries(r),edges:mappedEntries(s)}}}const Se=I.enum([`TB`,`BT`,`LR`,`RL`]),q=I.string().nonempty().brand(),Ce=I.enum([`same`,`source`,`sink`,`min`,`max`]),we=I.object({rank:Ce,nodes:I.array(q)}),J={id:I.string().nonempty().brand(),weight:I.coerce.number().int().min(0).max(20),minlen:I.coerce.number().int().min(0).max(4)},Te=I.object({source:q,target:q,weight:J.weight.optional(),minlen:J.minlen.optional()}),Ee=I.object({direction:Se.optional(),ranks:I.array(we).default([]),edgeWeight:I.record(J.id,J.weight).default({}),edgeMinlen:I.record(J.id,J.minlen).default({}),reverseRank:I.array(J.id).default([]),excludeFromRanking:I.array(J.id).default([]),edgeOrder:I.array(J.id).default([]),nodeOrder:I.array(q).default([]),invisibleEdges:I.array(Te).default([]),reasoning:I.string().default(``)}),De=/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/;function extractJson(e){let t=De.exec(e);if(t&&t[1])return t[1];let n=e.indexOf(`{`),r=e.lastIndexOf(`}`);return n!==-1&&r!==-1&&r>n?e.slice(n,r+1):e.trim()}function parseOutput(e,t){try{let n=extractJson(e),r=f.parse(n),i=Ee.safeParse(r);if(!i.success){K.warn(`Failed to validate LLM response
|
|
42
|
+
`+I.prettifyError(i.error));return}return restoreIdsAndMapToHints(i.data,t)}catch(t){K.warn(`Failed to parse LLM response
|
|
43
|
+
{response}`,{error:t,response:e});return}}function restoreIdsAndMapToHints(e,t){let{mapping:n}=t,nodeId=e=>{let t=n.nodes[e]?.id;return t||K.warn`Unknown node ID ${e} in LLM output, skipping`,t},mapToNodeId=e=>k(e,C(nodeId),S(g)),edgeId=e=>{let t=n.edges[e]?.id;return t||K.warn`Unknown edge ID ${e} in LLM output, skipping`,t},mapToNonEmpty=(e,t)=>{let n=e.map(t).filter(g);return m(n,1)?n:void 0},r=k(e.excludeFromRanking,C(edgeId),S(g),D(),e=>m(e,1)?e:void 0),i=k(e.reverseRank,C(edgeId),S(g),D(),e=>m(e,1)?e:void 0),a=(()=>{let e=/* @__PURE__ */ new Set;return t=>t.filter(t=>!e.has(t)&&(e.add(t),!0))})(),o=k(e.ranks,C(e=>{let t=a(mapToNodeId(e.nodes));return m(t,1)?{rank:e.rank,nodes:t}:null}),S(A)),s=k(e.invisibleEdges,C(({source:e,target:t,minlen:n=1,weight:r=1})=>{let i=nodeId(e),a=nodeId(t);if(i&&a)return z({weight:r===1?void 0:r,minlen:n===1?void 0:n,source:i,target:a})}),S(g),_(e=>`${e.source}->${e.target}`),ne(([e,...t])=>k(t,w((e,t)=>z({...e,...t,weight:e.weight&&t.weight?Math.max(e.weight,t.weight):e.weight||t.weight,minlen:e.minlen&&t.minlen?Math.max(e.minlen,t.minlen):e.minlen||t.minlen}),e))),O(),e=>m(e,1)?e:void 0),c=e.reasoning;c&&(c=c.replaceAll(`][`,`] [`),x(t.mapping.nodes).forEach(([e,t])=>{c=c.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.id+"`")}),x(t.mapping.edges).forEach(([e,t])=>{c=c.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.source+` -> `+t.target+"`")}));let safeMapEdgeKeys=e=>{let t={};for(let[n,r]of x(e)){let e=edgeId(n);e&&(t[e]=r)}return t};return z({direction:e.direction,ranks:o,edgeWeight:safeMapEdgeKeys(e.edgeWeight),edgeMinlen:safeMapEdgeKeys(e.edgeMinlen),excludeFromRanking:r,reverseRank:i,edgeOrder:mapToNonEmpty(e.edgeOrder,edgeId),nodeOrder:mapToNonEmpty(e.nodeOrder,nodeId),invisibleEdges:s,reasoning:c})}const Oe={systemPrompt:`You are an advisor specializing in software architecture diagrams and graphviz (DOT) layout optimizations.
|
|
41
44
|
You receive a JSON of Diagram data with:
|
|
42
45
|
- nodes (architectural elements, rendered as leaf boxes)
|
|
43
46
|
- compounds (group of nodes or other compounds, define hierarchy and rendered as boxes around children)
|
|
@@ -51,7 +54,7 @@ Diagram (JSON object) fields:
|
|
|
51
54
|
- compounds: Compound[]
|
|
52
55
|
- nodes: Node[]
|
|
53
56
|
- edges: Edge[]
|
|
54
|
-
- direction: "TB" | "LR" | "BT" | "RL"
|
|
57
|
+
- direction: "TB" | "LR" | "BT" | "RL" | "Top
|
|
55
58
|
|
|
56
59
|
Node (JSON object) fields:
|
|
57
60
|
- id: string (starts with "n" followed by a number, e.g. "n1", "n2", etc.)
|
|
@@ -223,10 +226,10 @@ OUTPUT:
|
|
|
223
226
|
"reasoning": "I reversed [e4] as it moves [n4] to the top, pushes [n3] to the next row and balances layout, [e5] \`minlen=0\` to keep [n2][n3] on same rank"
|
|
224
227
|
}
|
|
225
228
|
\`\`\`
|
|
226
|
-
</example>`,userPrompt:`Analyze semantics and suggest layout hints for the following diagram. Return only JSON object without any additional text or markdown formatting.`};async function enhanceLayoutWithAI(e,t,n){try{
|
|
229
|
+
</example>`,userPrompt:`Analyze semantics and suggest layout hints for the following diagram. Return only JSON object without any additional text or markdown formatting.`};async function enhanceLayoutWithAI(e,t,n){try{K.debug`generating AI layout hints for ${e.id} using ${t.name}`;let{serialized:r,mapping:i}=prepareLLMInput(e);return parseOutput(await t.sendRequest({...Oe,view:e,mapping:i,diagram:JSON.stringify(r)},n),{mapping:i,view:e})}catch(e){K.warn(`AI layout enhancement failed`,{error:e});return}}async function applySemanticLayout({logger:e,ai:t,likec4:r,server:i},a){pe(t,`AI is not configured`),e.info([n.green(`semantic:layout`),n.dim(`project:`),a.projectId,n.dim(`view:`),a.viewId].join(` `));let o={started:()=>i.hot.send(`likec4:apply-semantic-layout`,{type:`started`}),completed:()=>i.hot.send(`likec4:apply-semantic-layout`,{type:`completed`}),log:e=>i.hot.send(`likec4:apply-semantic-layout`,{log:e})},{chat:s,EventType:c}=await import(`@tanstack/ai`),l=(await r.computedModel(a.projectId)).findView(a.viewId);pe(l,`View ${a.viewId} not found in project ${a.projectId}`),e.info([n.green(`semantic:layout`),n.dim(`call`),t.adapter.name].join(` `));let u=await enhanceLayoutWithAI(l.$view,{name:t.adapter.name,async sendRequest({systemPrompt:e,userPrompt:n,diagram:r}){o.started();let i=s({...t,systemPrompts:[e],stream:!0,messages:[{role:`user`,content:[{type:`text`,content:e},{type:`text`,content:n},{type:`text`,content:r}]}]}),a=``;for await(let e of i)switch(e.type){case c.TEXT_MESSAGE_CONTENT:o.log(e.delta),a+=e.delta;break;case c.REASONING_MESSAGE_CONTENT:o.log(e.delta)}return a}});if(o.completed(),!u){e.warn([n.yellow(`semantic:layout`),`No semantic layout generated`].join(` `));return}e.info([n.green(`semantic:layout`),n.dim(`apply ai hints to layout`)].join(` `));let d=await r.views.layoutView({viewId:a.viewId,projectId:a.projectId,layoutHints:u});if(!d){e.error([n.red(`semantic:layout`),`layout hints failed`].join(` `));return}e.info([n.green(`semantic:layout`),n.dim(`save view snapshot`)].join(` `));let f=await r.editor.applyChange({viewId:a.viewId,projectId:a.projectId,change:{op:`save-view-snapshot`,layout:d.diagram}});if(!f.success){e.error([n.red(`semantic:layout`),`apply change failed`,f.error].join(` `));let t=Error(f.error);throw t.stack=f.error,t}e.info([n.green(`semantic:layout`),n.dim(`project:`),a.projectId,n.dim(`view:`),a.viewId,`✅`].join(` `))}async function calcAdhocView({logger:e,likec4:t},r){e.info([n.green(`adhoc:view`),n.dim(`project:`),r.projectId].join(` `));let i=await t.views.adhocView(r.predicates,r.projectId);return e.info([n.green(`adhoc:view`),`✅`].join(` `)),i}async function updateView({logger:e,likec4:t},r){e.info([n.green(`view:onChange`),n.dim(`project`),r.projectId,n.dim(`view`),r.viewId,n.dim(`change`),r.change.op].join(` `));let i=await t.editor.applyChange(r);if(!i.success){e.error(`Failed to apply view change:\n${i.error}`);let t=Error(i.error);throw t.stack=i.error,t}e.info([n.green(`view:onChange`),`✅`].join(` `))}function splitErrorMessage(e){let t=e.split(`
|
|
227
230
|
`),n=/^\s+at\s+/,r=t.findIndex(e=>n.test(e));return r===-1&&(r=1),{message:t.slice(0,r).join(`
|
|
228
231
|
`),stack:t.slice(r).join(`
|
|
229
|
-
`)}}function sendError(e,{name:t,error:n}){e.hot.send({type:`error`,err:{...splitErrorMessage(n),name:t??`LikeC4PluginError`,plugin:`vite-plugin-likec4`}})}function enablePluginRPC(e){let t=null,n=e.server;
|
|
232
|
+
`)}}function sendError(e,{name:t,error:n}){e.hot.send({type:`error`,err:{...splitErrorMessage(n),name:t??`LikeC4PluginError`,plugin:`vite-plugin-likec4`}})}function enablePluginRPC(e){let t=null,n=e.server;ie({updateView:t=>updateView(e,t),calcAdhocView:t=>calcAdhocView(e,t),applySemanticLayout:t=>applySemanticLayout(e,t)},{on:e=>n.hot.on(`likec4:rpc`,e),post:e=>n.hot.send(`likec4:rpc`,e),onTimeoutError(e){return e===`applySemanticLayout`},onFunctionError:(r,i)=>{e.logger.error(`RPC error in ${i}`,{error:r});let a=r.stack??r.message;try{t!==a&&(t=a,sendError(n,{name:r.name,error:a}))}catch(t){e.logger.error(`Failed to send error to client`,{error:t})}}})}function createAppConfigModule(e){let{webcomponentPrefix:t=`likec4`,pageTitle:n=`LikeC4`,useHashHistory:r=!1,theme:i=`auto`}=e||{};return{id:`likec4:app-config`,virtualId:`likec4:plugin/app-config.js`,async load(){return logGenerating(`app-config`),`
|
|
230
233
|
export let ComponentName = {
|
|
231
234
|
View: ${JSON.stringify(t+`-view`)},
|
|
232
235
|
Browser: ${JSON.stringify(t+`-browser`)},
|
|
@@ -249,11 +252,11 @@ export let defaultTheme = ${JSON.stringify(i)}
|
|
|
249
252
|
export let krokiD2SvgUrl = import.meta.env.VITE_KROKI_D2_SVG_URL || 'https://kroki.io/d2/svg'
|
|
250
253
|
export let krokiPumlSvgUrl = import.meta.env.VITE_KROKI_D2_SVG_URL || 'https://kroki.io/plantuml/svg'
|
|
251
254
|
|
|
252
|
-
`}}}const
|
|
253
|
-
`);n=JSON.parse(t)}catch{}s+=1
|
|
255
|
+
`}}}const ke=/* @__PURE__ */ e(e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),`capitalizeFirstLetter`),Ae=/* @__PURE__ */ e(e=>e.split(`.`).map(ke).join(``),`fqnName`),je=/* @__PURE__ */ e(e=>Ae(e.parent?e.id.slice(e.parent.length+1):e.id),`nodeName`),d2direction=({autoLayout:e})=>{switch(e.direction){case`TB`:return`down`;case`BT`:return`up`;case`LR`:return`right`;case`RL`:return`left`}},d2shape=({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`agent`:case`mobile`:case`browser`:return`rectangle`}};function generateD2(e){let t=e.$view,{nodes:n,edges:r}=t,i=/* @__PURE__ */ new Map,printNode=(e,t)=>{let r=je(e),a=(t?t+`.`:``)+r;i.set(e.id,a);let o=JSON.stringify(e.title),s=d2shape(e);return new c().append(r,`: {`,N).indent({indentedChildren:t=>t.append(`label: `,o,N).appendIf(s!==`rectangle`,`shape: `,s,N).appendIf(e.children.length>0,N,l(n.filter(t=>t.parent===e.id),e=>printNode(e,a))),indentation:2}).append(`}`,N)},printEdge=e=>new c().append(i.get(e.source),` -> `,i.get(e.target)).append(t=>e.label&&t.append(`: `,JSON.stringify(e.label)));return M(new c().append(`direction: `,d2direction(t),N,N).append(l(n.filter(e=>T(e.parent)),e=>printNode(e),{appendNewLineIfNotEmpty:!0})).appendIf(r.length>0,N,l(r,e=>printEdge(e),{appendNewLineIfNotEmpty:!0})))}const Y=`data:page/id,likec4-`,Me=`diagrams.drawio`;function escapeXml(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function parseDrawioRoundtripComments(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;else 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(`
|
|
256
|
+
`);n=JSON.parse(t)}catch{}s+=1}else 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}else 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}else 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}else s+=1}return o?{layoutByView:n,strokeColorByFqn:r,strokeWidthByFqn:i,edgeWaypoints:a}:null}function compressDrawioDiagramXml(e){let t=encodeURIComponent(e),n=new TextEncoder().encode(t);return uint8ArrayToBase64(ae.deflateRaw(n))}function uint8ArrayToBase64(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 X={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}},Z={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 getEffectiveStyles(e){return e.$styles??fe.DEFAULT}function escapeHtml(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`)}function toNonEmptyString(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 getContainerDashedStyle(e,t){return e&&t!==`none`||t===`dashed`?`dashed=1;`:``}function getDefaultStrokeWidth(e,t){return e===`none`?`0`:t||e?`1`:``}function applyStrokeColorOverride(e,t){return{fill:e?.fill??`#dae8fc`,stroke:t,font:e?.font??t}}function resolveThemeColor(e,t,n){return t&&t in e.theme.colors?t:n}function getThemeColorValues(e,t,n){let r=getEffectiveStyles(e),i=resolveThemeColor(r,t??n,n);try{return r.colors(i)}catch{return fe.DEFAULT.colors(n)}}function drawioShape(e){let t=`shape=rectangle;rounded=1;arcSize=12;`;switch(e){case`person`:return`shape=actor;`;case`rectangle`:case`browser`:case`mobile`:case`bucket`:case`agent`: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 getElementColors(e,t){let n=getThemeColorValues(e,t,`primary`).elements;return{fill:String(n.fill??`#dae8fc`),stroke:String(n.stroke??`#2563eb`),font:String(n.hiContrast??n.stroke??`#1e40af`)}}function getEdgeStrokeColor(e,t){let n=getThemeColorValues(e,t??`gray`,`gray`);return String(n.relationships?.line??`#1e40af`)}function getEdgeLabelColors(e,t){let n=getThemeColorValues(e,t??`gray`,`gray`).relationships;return{font:String(n?.label??n?.line??`#1e40af`),background:String(n?.labelBg??`#ffffff`)}}function edgeAnchors(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):.5,exitY:c?.5:+(s>=0),entryX:c?o>=0?0:1:.5,entryY:c?.5:s>=0?0:1}}function normalizeEdgePoint(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 buildNodeValueHtml(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;">${escapeHtml(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;">${escapeHtml(e)}</b><br/><span style="font-weight:normal;font-size:${a}px;">${escapeHtml(t)}</span></div>`}function pushStylePart(e,t,n){n!=null&&n!==``&&e.push(`${t}=${encodeURIComponent(n)}`)}function pushStylePartNum(e,t,n){n!=null&&e.push(`${t}=${n}`)}function buildNavLinkStyle(e){return e===``?``:`link=${encodeURIComponent(`${Y}${e}`)};`}function toExportString(e){let t=e==null?null:L(e);return t!=null&&!b(t)?t.trim():``}function linksToStyleJson(e){return!Array.isArray(e)||e.length===0?``:encodeURIComponent(JSON.stringify(e.map(e=>({url:e.url,title:e.title}))))}function metadataToStyleJson(e){return typeof e!=`object`||!e||Array.isArray(e)||Object.keys(e).length===0?``:encodeURIComponent(JSON.stringify(e))}const Ne=/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;function buildLikec4StyleForNode(e){let t=[];return pushStylePart(t,`likec4Description`,e.desc),pushStylePart(t,`likec4Technology`,e.tech),pushStylePart(t,`likec4Notes`,e.notes),pushStylePart(t,`likec4Tags`,e.tagList),pushStylePart(t,`likec4NavigateTo`,e.navTo),pushStylePart(t,`likec4Icon`,e.iconName),pushStylePart(t,`likec4Summary`,e.summaryStr),e.linksJson!==``&&t.push(`likec4Links=${e.linksJson}`),pushStylePart(t,`likec4Border`,e.borderVal),pushStylePartNum(t,`likec4Opacity`,e.containerOpacityNum),pushStylePart(t,`likec4StrokeWidth`,e.strokeWidth),e.colorNameForRoundtrip!==``&&t.push(`likec4ColorName=${e.colorNameForRoundtrip}`),pushStylePart(t,`likec4Size`,e.nodeStyle?.size),pushStylePart(t,`likec4Padding`,e.nodeStyle?.padding),pushStylePart(t,`likec4TextSize`,e.nodeStyle?.textSize),pushStylePart(t,`likec4IconPosition`,e.nodeStyle?.iconPosition),e.strokeHex&&Ne.test(e.strokeHex)&&pushStylePart(t,`likec4StrokeColor`,e.strokeHex),pushStylePart(t,`likec4Notation`,e.nodeNotation??void 0),t.length>0?t.join(`;`)+`;`:``}function buildBridgeManagedStyleForNode(e,t,n,r){if(r?.profile!==`leanix`)return``;let i=[`bridgeManaged=true`,`likec4Id=${encodeURIComponent(e)}`,`likec4Kind=${encodeURIComponent(t)}`,`likec4ViewId=${encodeURIComponent(n)}`];r.projectId!=null&&r.projectId!==``&&i.push(`likec4ProjectId=${encodeURIComponent(r.projectId)}`);let a=r.leanixFactSheetTypeByKind?.[t];return a!=null&&a!==``&&i.push(`leanixFactSheetType=${encodeURIComponent(a)}`),i.join(`;`)+`;`}function buildBridgeManagedStyleForEdge(e,t){return t?.profile===`leanix`?`bridgeManaged=true;likec4RelationId=${encodeURIComponent(e)};`:``}function buildMxUserObjectXml(e){return!e||typeof e!=`object`||Array.isArray(e)||Object.keys(e).length===0?``:`
|
|
254
257
|
<mxUserObject>`+Object.entries(e).map(([e,t])=>{let n=typeof t==`string`?t:t==null?``:String(t);return`<data key="${escapeXml(e)}">${escapeXml(n)}</data>`}).join(``)+`</mxUserObject>`}function buildLikec4StyleForEdge(e){let t=[];return pushStylePart(t,`likec4Description`,e.edgeDesc),pushStylePart(t,`likec4Technology`,e.edgeTech),pushStylePart(t,`likec4Notes`,e.edgeNotes),pushStylePart(t,`likec4NavigateTo`,e.edgeNavTo),pushStylePart(t,`likec4RelationshipKind`,e.edgeKind??void 0),pushStylePart(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 buildEdgeLabelValue(e){return e.label?escapeXml(e.label):``}function buildEdgeGeometryXml(e,t){let n=t?.[`${e.source}|${e.target}|${e.id}`]??t?.[`${e.source}|${e.target}`],r=Array.isArray(n)?n.flatMap(normalizeEdgePoint):[];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 buildEdgeStyleString(e,t,n,r,i){let{bboxes:a,fontFamily:o}=t,s=a.get(e.source),c=a.get(e.target),l=s&&c?edgeAnchors(s,c):{exitX:1,exitY:.5,entryX:0,entryY:.5},u=`exitX=${l.exitX};exitY=${l.exitY};entryX=${l.entryX};entryY=${l.entryY};`,d=getEdgeStrokeColor(n,e.color),f=e.line===`dashed`?`dashed=1;`:e.line===`dotted`?`dashed=1;dashPattern=1 1;`:``,p=drawioArrow(e.head),m=e.tail==null||e.tail===`none`?`none`:drawioArrow(e.tail),h=buildLikec4StyleForEdge({edgeDesc:toExportString(e.description),edgeTech:toExportString(e.technology),edgeNotes:toExportString(e.notes),edgeNavTo:toNonEmptyString(e.navigateTo),edgeKind:Z.getKind(e),edgeNotation:Z.getNotation(e),edgeLinksJson:linksToStyleJson(Z.getLinks(e)),edgeMetadataJson:metadataToStyleJson(Z.getMetadata(e))}),g=buildBridgeManagedStyleForEdge(e.id,i),_=getEdgeLabelColors(n,e.color);return`endArrow=${p};startArrow=${m};html=1;rounded=0;${u}strokeColor=${d};strokeWidth=2;${f}${r===``?``:`fontColor=${_.font};fontSize=12;align=center;verticalAlign=middle;labelBackgroundColor=none;fontFamily=${encodeURIComponent(o)};`}${h}${g}`}function buildEdgeCellXml(e,t,n,r,i,a){let{defaultParentId:o}=t,s=i(e.source),c=i(e.target),l=buildEdgeLabelValue(e),u=buildEdgeGeometryXml(e,n?.edgeWaypoints);return`<mxCell id="${a}" value="${l}" style="${buildEdgeStyleString(e,t,r,l,n)}" edge="1" parent="${o}" source="${s}" target="${c}">
|
|
255
258
|
${u}${buildMxUserObjectXml(Z.getCustomData(e))}
|
|
256
|
-
</mxCell>`}function computeNodeGeometry(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 computeNodeStylePartsAndValue(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.kind??``,p=e.title,m=toExportString(e.description),h=toExportString(e.technology),g=toExportString(X.getNotes(e)),_=X.getTags(e),v=Array.isArray(_)&&_.length>0?_.join(`,`):``,y=toNonEmptyString(X.getNavigateTo(e)),b=toNonEmptyString(X.getIcon(e)),
|
|
259
|
+
</mxCell>`}function computeNodeGeometry(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 computeNodeStylePartsAndValue(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.kind??``,p=e.title,m=toExportString(e.description),h=toExportString(e.technology),g=toExportString(X.getNotes(e)),_=X.getTags(e),v=Array.isArray(_)&&_.length>0?_.join(`,`):``,y=toNonEmptyString(X.getNavigateTo(e)),b=toNonEmptyString(X.getIcon(e)),x=f===`actor`||e.shape===`person`,ee=d?`shape=rectangle;rounded=0;container=1;collapsible=0;startSize=0;`:x?`shape=actor;`:drawioShape(e.shape),S=l?.[e.id],C=u?.[e.id],w=S?applyStrokeColorOverride(getElementColors(r,e.color),S):getElementColors(r,e.color),te=w?.fill??`#dae8fc`,T=w?.stroke??`#2563eb`,E=w?.font??w?.stroke??`#1e40af`,D=`fillColor=${te};strokeColor=${T};fontColor=${E};`,O=e.style,k=a.fontSize(O?.textSize),ne=escapeXml(buildNodeValueHtml(p,m,d,E,o,k)),A=O?.border,j=C??getDefaultStrokeWidth(A,d),M=j===``?``:`strokeWidth=${j};`,N=getContainerDashedStyle(d,A),P=d===!0?O?.opacity??15:void 0,re=P!=null&&d===!0?`fillOpacity=${Math.min(100,Math.max(0,P))};`:``,ie=buildLikec4StyleForNode({desc:m,tech:h,notes:g,tagList:v,navTo:y,iconName:b,summaryStr:toExportString(X.getSummary(e)),linksJson:linksToStyleJson(X.getLinks(e)),borderVal:A,containerOpacityNum:P,strokeWidth:j,colorNameForRoundtrip:e.color?encodeURIComponent(String(e.color)):``,nodeStyle:O,strokeHex:T,nodeNotation:X.getNotation(e)})+buildBridgeManagedStyleForNode(e.id,f,t.view.id,n),ae=buildMxUserObjectXml(X.getCustomData(e)),oe=buildNavLinkStyle(y);return{value:ne,styleStr:`${d?`align=left;verticalAlign=top;overflow=fill;whiteSpace=wrap;html=1;`:`align=center;verticalAlign=middle;verticalLabelPosition=middle;labelPosition=center;fontSize=${k};fontStyle=1;spacingTop=4;spacingLeft=2;spacingRight=2;spacingBottom=2;overflow=fill;whiteSpace=wrap;html=1;fontFamily=${encodeURIComponent(o)};`}${ee}${D}${M}${N}${re}${oe}${ie}`,userObjectXml:ae,navTo:y,isContainer:d,title:p,fontFamily:o,containerTitleFontSizePx:s,containerTitleColor:c}}function computeNodeCellExportData(e,t,n,r,i,a){let o=computeNodeGeometry(e,t,i),s=computeNodeStylePartsAndValue(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 buildNodeCellXml(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?escapeXml(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="${Y}${escapeXml(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:buildContainerTitleCellXml(e.title??``,e.titleCellId??e.id,e.navTo,e.id,e.fontFamily,e.containerTitleFontSizePx??12,e.containerTitleColor??`#74c0fc`),isContainer:!0}:{vertexXml:i,isContainer:!1}}function buildContainerTitleCellXml(e,t,n,r,i,a,o){let s=escapeXml(e),c=Math.max(60,Math.min(260,e.length*8)),l=buildNavLinkStyle(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="${escapeXml(e)}" link="${Y}${escapeXml(n)}" id="${t}">\n ${d}\n</UserObject>`}function getViewTitle(e){return typeof e.title==`string`?e.title:null}function getViewDescriptionString(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 getLeanixRootStyleParts(e,t){let n=[`bridgeManaged=true;`,`likec4ViewId=${encodeURIComponent(e.id)};`];return t.projectId!=null&&t.projectId!==``&&n.push(`likec4ProjectId=${encodeURIComponent(t.projectId)};`),n}function buildRootCellStyle(e,t){let n=getViewTitle(e),r=getViewDescriptionString(e),i=r.trim()===``?``:encodeURIComponent(r.trim()),a=e.notation,o=typeof a==`string`&&a!==``?a:void 0,s=o==null?``:encodeURIComponent(o),c=[`rounded=1;whiteSpace=wrap;html=1;fillColor=none;strokeColor=none;`,`likec4ViewTitle=${encodeURIComponent(n??e.id)};`,i===``?``:`likec4ViewDescription=${i};`,s===``?``:`likec4ViewNotation=${s};`];return t?.profile===`leanix`&&c.push(...getLeanixRootStyleParts(e,t)),c.join(``)}function drawioArrow(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 isDefaultBbox(e){return e.x===Q.x&&e.y===Q.y&&e.width===Q.width&&e.height===Q.height}function spreadUnlaidNodesOverVertical(e,t,n){let bboxKey=e=>`${e.x},${e.y},${e.width},${e.height}`,r=t.filter(e=>!n.has(e.id)),i=/* @__PURE__ */ new Map;for(let t of r){let n=e.get(t.id);if(!n)continue;let r=bboxKey(n),a=i.get(r)??[];a.push(t),i.set(r,a)}for(let t of i.values()){if(t.length<=1)continue;let n=t[0],r=n?e.get(n.id):void 0;r&&isDefaultBbox(r)&&t.forEach((t,n)=>{e.set(t.id,{...r,x:r.x,y:r.y+n*(r.height+24)})})}}function computeContainerBboxesFromChildren(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=(X.getChildren(t)??[]).filter(e=>r.has(e));if(n.length===0||!isDefaultBbox(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 computeContentBoundsAndOffsets(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:400-a,offsetY:300-o,canvasWidth:800,canvasHeight:600}}function computeDiagramLayout(e,t){let n=e.$view,{nodes:r}=n,i=t?.layoutOverride,a=[...r].sort((e,t)=>T(e.parent)&&T(t.parent)?0:T(e.parent)?-1:T(t.parent)?1:e.parent===t.parent?0:e.id.startsWith(t.id+`.`)?1:t.id.startsWith(e.id+`.`)?-1:0),getBBox=e=>{let t=i?.[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}},o=/* @__PURE__ */ new Map;for(let e of a)o.set(e.id,getBBox(e));let s=new Set(r.map(e=>e.id)),c=new Set(r.filter(e=>{let t=X.getChildren(e);return Array.isArray(t)&&t.some(e=>s.has(e))}).map(e=>e.id));spreadUnlaidNodesOverVertical(o,a,c);let l=getEffectiveStyles(e),u=l.theme.spacing.xl;computeContainerBboxesFromChildren(o,c,a,s,u,l.theme.spacing.xl+l.theme.spacing.md);let{offsetX:d,offsetY:f,canvasWidth:p,canvasHeight:m}=computeContentBoundsAndOffsets(o);return{view:n,bboxes:o,containerNodeIds:c,sortedNodes:a,offsetX:d,offsetY:f,canvasWidth:p,canvasHeight:m,defaultParentId:`1`,rootId:`0`,effectiveStyles:l,fontFamily:`'IBM Plex Sans Variable',ui-sans-serif,system-ui,sans-serif`,containerTitleFontSizePx:Math.round(l.theme.textSizes.xs),containerTitleColor:`#74c0fc`,nodeIdsInView:s}}function generateDiagramContent(e,t){let n=e.$view,{edges:r}=n,i=t?.compressed!==!1,a=computeDiagramLayout(e,t),{sortedNodes:o,defaultParentId:s,rootId:c,canvasWidth:l,canvasHeight:u}=a,d=/* @__PURE__ */ new Map,f=2,getCellId=e=>{let t=d.get(e);if(!t){if(f>=1e4)throw Error(`DrawIO cell ID range exhausted`);t=String(f++),d.set(e,t)}return t},p=[],m=[],h=[],g=1e4;for(let n of o){let r=buildNodeCellXml(computeNodeCellExportData(n,a,t,e,getCellId,g));r.isContainer?(p.push(r.vertexXml),r.titleCellXml&&p.push(r.titleCellXml),g++):m.push(r.vertexXml)}for(let n of r){if(f>=1e4)throw Error(`DrawIO cell ID range exhausted`);let r=String(f++);h.push(buildEdgeCellXml(n,a,t,e,getCellId,r))}let _=[`<mxCell id="${s}" value="" style="${buildRootCellStyle(n,t)}" vertex="1" parent="${c}">
|
|
257
260
|
<mxGeometry x="0" y="0" width="${l}" height="${u}" as="geometry" />
|
|
258
261
|
</mxCell>`,...p,...m,...h].join(`
|
|
259
262
|
`),v=(getViewTitle(n)??n.id).trim()||n.id,y=`<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">
|
|
@@ -261,7 +264,7 @@ export let krokiPumlSvgUrl = import.meta.env.VITE_KROKI_D2_SVG_URL || 'https://k
|
|
|
261
264
|
<mxCell id="${c}" />
|
|
262
265
|
${_}
|
|
263
266
|
</root>
|
|
264
|
-
</mxGraphModel>`,b=i?compressDrawioDiagramXml(y):y;return{name:v,id:n.id,content:b}}function wrapInMxFile(e,t){let n=escapeXml(t??new Date().toISOString());return e.length===0?`<?xml version="1.0" encoding="UTF-8"?>
|
|
267
|
+
</mxGraphModel>`,b=i?compressDrawioDiagramXml(y):y;return{name:v,id:n.id,content:b}}function wrapInMxFile(e,t){let n=escapeXml(t??(/* @__PURE__ */ new Date()).toISOString());return e.length===0?`<?xml version="1.0" encoding="UTF-8"?>
|
|
265
268
|
<mxfile host="LikeC4" modified="${n}" agent="LikeC4" version="1.0" etag="" type="device">
|
|
266
269
|
</mxfile>
|
|
267
270
|
`:`<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -269,8 +272,8 @@ export let krokiPumlSvgUrl = import.meta.env.VITE_KROKI_D2_SVG_URL || 'https://k
|
|
|
269
272
|
${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}">${e.content}</diagram>`).join(`
|
|
270
273
|
`)}
|
|
271
274
|
</mxfile>
|
|
272
|
-
`}function generateDrawio(e,t){return wrapInMxFile([generateDiagramContent(e,t)],t?.modified)}function generateDrawioMulti(e,t,n){return wrapInMxFile(e.map(e=>generateDiagramContent(e,t?.[e.$view.id])),n)}function buildOptionsFromRoundtrip(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 buildDrawioExportOptionsForViews(e,t,n){let r=t?parseDrawioRoundtripComments(t):null;return Object.fromEntries(e.map(e=>[e,buildOptionsFromRoundtrip(e,r,n)]))}function generateDrawioEditUrl(e){let t=compressDrawioDiagramXml(e),n=JSON.stringify({type:`xml`,compressed:!0,data:t});return`https://app.diagrams.net/#create=`+encodeURIComponent(n)}const
|
|
273
|
-
`).map(e=>
|
|
275
|
+
`}function generateDrawio(e,t){return wrapInMxFile([generateDiagramContent(e,t)],t?.modified)}function generateDrawioMulti(e,t,n){return wrapInMxFile(e.map(e=>generateDiagramContent(e,t?.[e.$view.id])),n)}function buildOptionsFromRoundtrip(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 buildDrawioExportOptionsForViews(e,t,n){let r=t?parseDrawioRoundtripComments(t):null;return Object.fromEntries(e.map(e=>[e,buildOptionsFromRoundtrip(e,r,n)]))}function generateDrawioEditUrl(e){let t=compressDrawioDiagramXml(e),n=JSON.stringify({type:`xml`,compressed:!0,data:t});return`https://app.diagrams.net/#create=`+encodeURIComponent(n)}const Pe=/* @__PURE__ */ e(e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),`capitalizeFirstLetter`),safeChars=e=>e.replace(/\W/g,`_`),Fe=/* @__PURE__ */ e(e=>e.split(`.`).map(safeChars).map(Pe).join(``),`fqnName`),Ie=/* @__PURE__ */ e(e=>{let t=e.parent?e.parent+`.`:``;return Fe(t&&e.id.startsWith(t)?e.id.slice(t.length):e.id)},`nodeName`),toSingleQuotes=e=>e.replace(/\\?"/g,`'`),mmdshape=({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`agent`:case`component`:return`@{ shape: rectangle, ${n} }`;default:me(e)}};function generateMermaid(e){let t=e.$view,{nodes:n,edges:r}=t,i=/* @__PURE__ */ new Map,printNode=(e,t)=>{let r=Ie(e),a=(t?t+`.`:``)+r;i.set(e.id,a);let o=new c;if(e.children.length>0){let t=toSingleQuotes(e.title);o.append(`subgraph `,a,'["`',t,'`"]',N).indent({indentedChildren:[l(n.filter(t=>t.parent===e.id),e=>printNode(e,a),{appendNewLineIfNotEmpty:!0})],indentation:2}).append(`end`,N)}else o.append(a,mmdshape(e));return o},printEdge=e=>new c().append(i.get(e.source),` -.`,e.label?' "`'+toSingleQuotes(e.label)+'`" .-':`-`,`> `,i.get(e.target));return M(new c().append(`---`,N,`title: ${JSON.stringify(toSingleQuotes(e.titleOrId))}`,N,`---`,N).append(`graph `,t.autoLayout.direction,N).indent({indentedChildren:e=>{e.append(l(n.filter(e=>T(e.parent)),e=>printNode(e),{appendNewLineIfNotEmpty:!0})).appendIf(r.length>0,l(r,e=>printEdge(e),{appendNewLineIfNotEmpty:!0}))},indentation:2}))}const capitalizeFirstLetter=e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),fqnName=e=>e.split(/[.-]/).map(capitalizeFirstLetter).join(``),nodeName=e=>fqnName(e.parent?e.id.slice(e.parent.length+1):e.id),pumlColor=(e,t,n=`#3b82f6`)=>e?t(e)??n:n,pumlDirection=({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`}},pumlShape=({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`agent`:case`browser`:return`rectangle`;default:me(e)}},escapeLabel=e=>b(e)?null:JSON.stringify(e).slice(1,-1).replace(/\\"/g,`"`);function generatePuml(e){let t=e.$view,n=e.$model.$styles.theme.colors,{nodes:r,edges:i}=t,elementColorProvider=e=>t=>t in n?n[t].elements[e]:void 0,relationshipsColorProvider=e=>t=>t in n?n[t].relationships[e]:void 0,a=/* @__PURE__ */ new Map,printHeader=()=>new c().append(`title "`,e.titleOrId,`"`,N).append(pumlDirection(t),` direction`,N),printTheme=()=>new c().append(`hide stereotype`,N).append(`skinparam ranksep `,`60`,N).append(`skinparam nodesep `,`30`,N).append(`skinparam {`,N).indent({indentedChildren:e=>e.append(`arrowFontSize `,`10`,N).append(`defaultTextAlignment `,`center`,N).append(`wrapWidth `,`200`,N).append(`maxMessageSize `,`100`,N).append(`shadowing `,`false`,N),indentation:2}).append(`}`,N),printStereotypes=e=>{let t=pumlShape(e),n=fqnName(e.id);return new c().append(`skinparam `,t,`<<`,n,`>>`,`{`,N).indent({indentedChildren:t=>t.append(`BackgroundColor `,pumlColor(e.color,elementColorProvider(`fill`)),N).append(`FontColor `,pumlColor(e.color,elementColorProvider(`hiContrast`),`#FFFFFF`),N).append(`BorderColor `,pumlColor(e.color,elementColorProvider(`stroke`)),N),indentation:2}).append(`}`,N)},printNode=e=>{let t=pumlShape(e),n=fqnName(e.id),r=escapeLabel(e.title)||nodeName(e),i=escapeLabel(e.technology);a.set(e.id,n);let o=ue.from(e.description);return new c().append(t,` `).append(`"`).append(`==`,r).appendIf(!!i,`\\n<size:10>[`,i,`]</size>`).appendIf(o.nonEmpty,`\\n\\n`,escapeLabel(o.text)).append(`"`,` <<`,n,`>> `,`as `,n,N)},printBoundary=e=>{let t=escapeLabel(e.title)||nodeName(e),n=fqnName(e.id);return a.set(e.id,n),new c().append(`rectangle "`,t,`" <<`,n,`>> as `,n,` {`,N).indent({indentedChildren:t=>t.append(`skinparam `,`RectangleBorderColor<<`,n,`>> `,pumlColor(e.color,elementColorProvider(`fill`)),N).append(`skinparam `,`RectangleFontColor<<`,n,`>> `,pumlColor(e.color,elementColorProvider(`fill`)),N).append(`skinparam `,`RectangleBorderStyle<<`,n,`>> `,`dashed`,N,N).append(l(r.filter(t=>t.parent===e.id),e=>e.children.length>0?printBoundary(e):printNode(e))),indentation:2}).append(`}`,N)},printEdge=e=>{let t=e.technology||``,n=e.label||t,r=pumlColor(e.color,relationshipsColorProvider(`line`),`#777777`),withColor=e=>`<color:${r}>${e.replaceAll(`"`,`'`)}`,i=new c().append(a.get(e.source),` .[`,r,`,thickness=2].> `,a.get(e.target));return(n||t)&&(i.append(` : `,n.split(`
|
|
276
|
+
`).map(e=>b(e)?e:withColor(e)).join(`\\n`)),t&&t!==n&&i.append(`\\n<size:8>[`,withColor(t),`]</size>`)),i.append(N)};return M(new c().append(`@startuml`,N).append(printHeader(),N).append(printTheme(),N).append(l(r.filter(e=>e.children.length==0),e=>printStereotypes(e),{appendNewLineIfNotEmpty:!0})).append(l(r.filter(e=>T(e.parent)),e=>e.children.length>0?printBoundary(e):printNode(e),{appendNewLineIfNotEmpty:!0})).appendIf(i.length>0,N,l(i,e=>printEdge(e),{appendNewLineIfNotEmpty:!0})).append(`@enduml`,N))}function code$8(e){let t=new c;return t.appendTemplate`
|
|
274
277
|
/******************************************************************************
|
|
275
278
|
* This file was generated
|
|
276
279
|
* DO NOT EDIT MANUALLY!
|
|
@@ -279,7 +282,7 @@ ${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}
|
|
|
279
282
|
|
|
280
283
|
export let d2Source = (viewId) => {
|
|
281
284
|
switch (viewId) {
|
|
282
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
285
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(l([...e.views()],e=>s`
|
|
283
286
|
case ${JSON.stringify(e.id)}: {
|
|
284
287
|
return ${JSON.stringify(generateD2(e))}
|
|
285
288
|
}
|
|
@@ -287,9 +290,9 @@ ${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}
|
|
|
287
290
|
default: {
|
|
288
291
|
throw new Error('Unknown viewId: ' + viewId)
|
|
289
292
|
}
|
|
290
|
-
`}}).append(
|
|
293
|
+
`}}).append(o,` }`,o).appendTemplate`
|
|
291
294
|
}
|
|
292
|
-
`.append(
|
|
295
|
+
`.append(o,o),u(t)}e(code$8,`code`);const Le={exportFormat:`d2`,...generateMatches(`d2`),async load({likec4:e,project:t}){return logGenerating(`d2`,t.id),{code:code$8(await e.computedModel(t.id)),moduleType:`js`}}},Re=generateCombinedProjects(`d2`,`loadD2Sources`,`d2`);function code$7(e){let t=new c;return t.appendTemplate`
|
|
293
296
|
/******************************************************************************
|
|
294
297
|
* This file was generated
|
|
295
298
|
* DO NOT EDIT MANUALLY!
|
|
@@ -298,7 +301,7 @@ ${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}
|
|
|
298
301
|
|
|
299
302
|
export let dotSource = (viewId) => {
|
|
300
303
|
switch (viewId) {
|
|
301
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
304
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(l(Object.keys(e),t=>s`
|
|
302
305
|
case ${JSON.stringify(t)}: {
|
|
303
306
|
return ${JSON.stringify(e[t].dot)}
|
|
304
307
|
}
|
|
@@ -306,12 +309,12 @@ ${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}
|
|
|
306
309
|
default: {
|
|
307
310
|
throw new Error('Unknown viewId: ' + viewId)
|
|
308
311
|
}
|
|
309
|
-
`}}).append(
|
|
312
|
+
`}}).append(o,` }`,o).appendTemplate`
|
|
310
313
|
}
|
|
311
314
|
|
|
312
315
|
export let svgSource = (viewId) => {
|
|
313
316
|
switch (viewId) {
|
|
314
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
317
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(l(Object.keys(e),t=>s`
|
|
315
318
|
case ${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(t))}: {
|
|
316
319
|
return ${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(e[t].svg))}
|
|
317
320
|
}
|
|
@@ -319,7 +322,7 @@ ${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}
|
|
|
319
322
|
default: {
|
|
320
323
|
throw new Error('Unknown viewId: ' + viewId)
|
|
321
324
|
}
|
|
322
|
-
`}}).append(
|
|
325
|
+
`}}).append(o,` }`,o,`}`,o,o),u(t)}e(code$7,`code`);const ze={exportFormat:`dot`,...generateMatches(`dot`),async load({likec4:e,project:t}){logGenerating(`dot`,t.id);let n=await e.views.viewsAsGraphvizOut(t.id);return{code:code$7(j(n,({id:e,svg:t,dot:n})=>[e,{dot:n,svg:t}])),moduleType:`js`}}},Be=generateCombinedProjects(`dot`,`loadDotSources`,`dot`);function code$6(e){let t=new c;return t.appendTemplate`
|
|
323
326
|
/******************************************************************************
|
|
324
327
|
* This file was generated
|
|
325
328
|
* DO NOT EDIT MANUALLY!
|
|
@@ -328,7 +331,7 @@ ${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}
|
|
|
328
331
|
|
|
329
332
|
export function drawioEditUrl(viewId) {
|
|
330
333
|
switch (viewId) {
|
|
331
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
334
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(l([...e.views()],e=>s`
|
|
332
335
|
case ${JSON.stringify(e.id)}: {
|
|
333
336
|
return ${JSON.stringify(generateDrawioEditUrl(generateDrawio(e)))}
|
|
334
337
|
}
|
|
@@ -336,9 +339,9 @@ ${e.map(e=>` <diagram name="${escapeXml(e.name)}" id="likec4-${escapeXml(e.id)}
|
|
|
336
339
|
default: {
|
|
337
340
|
throw new Error('Unknown viewId: ' + viewId)
|
|
338
341
|
}
|
|
339
|
-
`}}).append(
|
|
342
|
+
`}}).append(o,` }`,o).appendTemplate`
|
|
340
343
|
}
|
|
341
|
-
`.append(
|
|
344
|
+
`.append(o,o),u(t)}e(code$6,`code`);const Ve={exportFormat:`drawio`,...generateMatches(`drawio`),async load({likec4:e,project:t}){return logGenerating(`drawio`,t.id),{code:code$6(await e.layoutedModel(t.id)),moduleType:`js`}}},He=generateCombinedProjects(`drawio`,`loadDrawioSources`,`drawio`),Ue=/^(https?:)?\/\//i,We=/* @__PURE__ */ new Set([`aws`,`azure`,`gcp`,`tech`,`bootstrap`]);function iconRef(e){if(!(!A(e)||Ue.test(e)||e===`none`||e.startsWith(`data:image`)))return e.startsWith(`file:`)||parseBundledIconRef(e)?e:void 0}function iconRefsFromModelData(e){let iconsFromViews=e=>O(e).flatMap(e=>e.nodes.map(e=>e.icon)),iconsFromStyled=e=>O(e).map(e=>e.style?.icon);return k([...iconsFromViews(e.views),...iconsFromViews(e.manualLayouts??{}),...iconsFromStyled(e.elements),...iconsFromStyled(e.deployments.elements)],C(iconRef),S(A),D(),E(he))}const isLocalSvg=e=>e.startsWith(`file:`)?e.toLowerCase().split(/[?#]/)[0]?.endsWith(`.svg`)??!1:!1,$=/* @__PURE__ */ e(e=>hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(e)),`jsStringLiteral`);function isBundledIconGroup(e){return We.has(e)}function parseBundledIconRef(e){let t=e.indexOf(`:`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t);return isBundledIconGroup(n)?{group:n,icon:e.slice(t+1)}:null}function generateIconRendererCode(e){let{imports:t,cases:n}=iconRefsFromModelData(e).reduce((e,t,n)=>{let r=t.startsWith(`file:`),i=`Icon`+n.toString().padStart(2,`0`),a=$(t);if(r){if(isLocalSvg(t)){let n=`${i}Raw`;e.imports.push(`import ${n} from ${$(`${t}?raw`)}`),e.imports.push(`import ${i} from ${$(`${t}?inline`)}`),e.cases.push(` ${a}: props => jsx(LocalSvgIcon, { ...props, src: ${i}, raw: ${n} })`)}else e.imports.push(`import ${i} from ${$(`${t}?inline`)}`),e.cases.push(` ${a}: props => jsx('img', { ...props, src: ${i} })`);return e}let o=parseBundledIconRef(t);if(!o)return e;let{group:s,icon:c}=o,l=`likec4:icon-bundle/${s}/${c}.jsx`;return e.imports.push(`import ${i} from ${$(l)}`),e.cases.push(` ${a}: ${i}`),e},{imports:[],cases:[]});return`
|
|
342
345
|
import { jsx } from 'react/jsx-runtime'
|
|
343
346
|
${t.join(`
|
|
344
347
|
`)}
|
|
@@ -384,13 +387,13 @@ export function IconRenderer({ node, ...props }) {
|
|
|
384
387
|
}
|
|
385
388
|
return jsx(IconComponent, props)
|
|
386
389
|
}
|
|
387
|
-
`}const
|
|
390
|
+
`}const Ge={...generateMatches(`icons`,`.jsx`),async load({likec4:e,project:t}){return logGenerating(`icons`,t.id),{moduleType:`jsx`,code:generateIconRendererCode((await e.computedModel(t.id)).$data)}}},Ke=/^[a-zA-Z0-9_.-]+$/;function embedProjectIdAsJsString(e){if(!Ke.test(e))throw Error(`Unsafe value for code generation: ${e}`);return JSON.stringify(e)}function embedUrlAsJsString(e){return JSON.stringify(e)}const qe={id:`likec4:icons`,virtualId:`likec4:plugin/icons.jsx`,async load({projects:e,logger:t}){logGenerating(`icons`);let{imports:r,cases:i}=e.filter(e=>Ke.test(e.id)?!0:(t.warn(n.yellow(`Skipping project with unsafe id for icons registry: ${e.id}`)),!1)).reduce((e,t,n)=>{let r=`Project`+n.toString().padStart(2,`0`),i=hardenJsonStringLiteralForEmbeddedScript(embedProjectIdAsJsString(t.id)),a=hardenJsonStringLiteralForEmbeddedScript(embedUrlAsJsString(d(`likec4:icons`,t.id)));return e.imports.push(`import {IconRenderer as ${r}} from ${a}`),e.cases.push(` ${i}: ${r}`),e},{imports:[],cases:[]});return{code:`
|
|
388
391
|
import { jsx } from 'react/jsx-runtime'
|
|
389
|
-
${
|
|
392
|
+
${r.join(`
|
|
390
393
|
`)}
|
|
391
394
|
|
|
392
395
|
export let ProjectIconsRegistry = {
|
|
393
|
-
${
|
|
396
|
+
${i.join(`,
|
|
394
397
|
`)}
|
|
395
398
|
}
|
|
396
399
|
|
|
@@ -424,7 +427,7 @@ if (import.meta.hot) {
|
|
|
424
427
|
}
|
|
425
428
|
})
|
|
426
429
|
}
|
|
427
|
-
`,moduleType:`jsx`}}};function code$5(e){let t=new
|
|
430
|
+
`,moduleType:`jsx`}}};function code$5(e){let t=new c;return t.appendTemplate`
|
|
428
431
|
/******************************************************************************
|
|
429
432
|
* This file was generated
|
|
430
433
|
* DO NOT EDIT MANUALLY!
|
|
@@ -433,7 +436,7 @@ if (import.meta.hot) {
|
|
|
433
436
|
|
|
434
437
|
export let mmdSource = (viewId) => {
|
|
435
438
|
switch (viewId) {
|
|
436
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
439
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(l([...e.views()],e=>s`
|
|
437
440
|
case ${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(e.id))}: {
|
|
438
441
|
return ${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(generateMermaid(e)))}
|
|
439
442
|
}
|
|
@@ -441,13 +444,13 @@ if (import.meta.hot) {
|
|
|
441
444
|
default: {
|
|
442
445
|
throw new Error('Unknown viewId: ' + viewId)
|
|
443
446
|
}
|
|
444
|
-
`}}).append(
|
|
447
|
+
`}}).append(o,` }`,o).appendTemplate`
|
|
445
448
|
}
|
|
446
449
|
|
|
447
|
-
`.append(
|
|
450
|
+
`.append(o,o),u(t)}e(code$5,`code`);const Je={exportFormat:`mmd`,...generateMatches(`mmd`),async load({likec4:e,project:t}){return logGenerating(`mmd`,t.id),{code:code$5(await e.computedModel(t.id)),moduleType:`js`}}},Ye=generateCombinedProjects(`mmd`,`loadMmdSources`,`mmd`),projectModelCode=e=>`
|
|
448
451
|
import { createHooksForModel, atom } from 'likec4/vite-plugin/internal'
|
|
449
452
|
|
|
450
|
-
export let $likec4data = atom(${
|
|
453
|
+
export let $likec4data = atom(${f.stringify(e.$data)})
|
|
451
454
|
|
|
452
455
|
export let {
|
|
453
456
|
updateModel,
|
|
@@ -470,11 +473,11 @@ if (import.meta.hot) {
|
|
|
470
473
|
}
|
|
471
474
|
})
|
|
472
475
|
}
|
|
473
|
-
`,
|
|
476
|
+
`,Xe={...generateMatches(`model`),async load({likec4:e,project:t}){logGenerating(`model`,t.id);let n=await e.layoutedModel(t.id);return{code:projectModelCode(n),moduleType:`js`}}},Ze=generateCombinedProjects(`model`,`loadModel`),Qe=/* @__PURE__ */ e(e=>`
|
|
474
477
|
import { atom, useStore } from 'likec4/vite-plugin/internal'
|
|
475
478
|
|
|
476
479
|
export const isSingleProject = ${e.length===1};
|
|
477
|
-
export const projects = ${
|
|
480
|
+
export const projects = ${f.stringify(e,null,2)};
|
|
478
481
|
|
|
479
482
|
export const $projects = atom([...projects])
|
|
480
483
|
|
|
@@ -500,10 +503,10 @@ if (import.meta.hot) {
|
|
|
500
503
|
}
|
|
501
504
|
})
|
|
502
505
|
}
|
|
503
|
-
`,`code`)
|
|
506
|
+
`,`code`),$e={id:`likec4:projects`,virtualId:`likec4:plugin/projects.js`,async load({projects:e}){return logGenerating(`projects`),{code:Qe(C(e,e=>({id:e.id,title:e.title,path:e.path,landingPage:e.config.landingPage,relationshipBrowserDefaultScope:e.config.webapp?.relationshipsBrowser?.defaultScope??`view`,exportFormats:effectiveWebappExportFormats(e.config)}))),moduleType:`js`}}},et=/* @__PURE__ */ e(e=>`
|
|
504
507
|
import { atom, useStore } from 'likec4/vite-plugin/internal'
|
|
505
508
|
|
|
506
|
-
export const $viewdata = atom(${
|
|
509
|
+
export const $viewdata = atom(${f.stringify(e)})
|
|
507
510
|
|
|
508
511
|
export function useLikeC4ProjectsOverview() {
|
|
509
512
|
return useStore($viewdata)
|
|
@@ -526,7 +529,7 @@ if (import.meta.hot) {
|
|
|
526
529
|
export function useLikeC4ProjectsOverview() {
|
|
527
530
|
throw new Error('No projects overview available for this workspace: single project mode is enabled')
|
|
528
531
|
}
|
|
529
|
-
`,
|
|
532
|
+
`,tt={id:`likec4:projects-overview`,virtualId:`likec4:plugin/projects-overview.js`,async load({projects:e,likec4:t}){if(e.length<2)return noProjects();logGenerating(`projects-overview`);let n=await t.projectsOverview();return{code:et(n),moduleType:`js`}}};function code$2(e){let t=new c;return t.appendTemplate`
|
|
530
533
|
/******************************************************************************
|
|
531
534
|
* This file was generated
|
|
532
535
|
* DO NOT EDIT MANUALLY!
|
|
@@ -535,7 +538,7 @@ export function useLikeC4ProjectsOverview() {
|
|
|
535
538
|
|
|
536
539
|
export let pumlSource = (viewId) => {
|
|
537
540
|
switch (viewId) {
|
|
538
|
-
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(
|
|
541
|
+
`.appendNewLine().indent({indentation:4,indentedChildren(t){t.append(l([...e.views()],e=>s`
|
|
539
542
|
case ${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(e.id))}: {
|
|
540
543
|
return ${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(generatePuml(e)))}
|
|
541
544
|
}
|
|
@@ -543,9 +546,9 @@ export function useLikeC4ProjectsOverview() {
|
|
|
543
546
|
default: {
|
|
544
547
|
throw new Error('Unknown viewId: ' + viewId)
|
|
545
548
|
}
|
|
546
|
-
`}}).append(
|
|
549
|
+
`}}).append(o,` }`,o).appendTemplate`
|
|
547
550
|
}
|
|
548
|
-
`.append(
|
|
551
|
+
`.append(o,o),u(t)}e(code$2,`code`);const nt={exportFormat:`puml`,...generateMatches(`puml`),async load({likec4:e,project:t}){return logGenerating(`puml`,t.id),{code:code$2(await e.computedModel(t.id)),moduleType:`js`}}},rt=generateCombinedProjects(`puml`,`loadPumlSources`,`puml`),projectCode=e=>`
|
|
549
552
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
550
553
|
import { LikeC4ModelProvider as Provider, LikeC4View as GenericView, ReactLikeC4 as GenericReactLikeC4 } from 'likec4/react';
|
|
551
554
|
import { IconRenderer } from 'likec4:icons/${e}'
|
|
@@ -568,14 +571,14 @@ export {
|
|
|
568
571
|
useLikeC4View,
|
|
569
572
|
useLikeC4Views
|
|
570
573
|
}
|
|
571
|
-
`,
|
|
574
|
+
`,it={...generateMatches(`react`),async load({project:e}){return logGenerating(`react`,e.id),{code:projectCode(e.id),moduleType:`js`}}},at={id:`likec4:react`,virtualId:`likec4:plugin/react.js`,async load({projects:e}){let t=y(e);return logGenerating(`react-default-project`),{code:`export {
|
|
572
575
|
useLikeC4Model,
|
|
573
576
|
useLikeC4View,
|
|
574
577
|
useLikeC4Views,
|
|
575
578
|
LikeC4ModelProvider,
|
|
576
579
|
LikeC4View,
|
|
577
580
|
ReactLikeC4
|
|
578
|
-
} from 'likec4:react/${t.id}'`,moduleType:`js`}}},
|
|
581
|
+
} from 'likec4:react/${t.id}'`,moduleType:`js`}}},ot=/* @__PURE__ */ e(({isAIAvailable:e,ai:t,rpcEnabled:n})=>`
|
|
579
582
|
import { createRpc } from 'likec4/vite-plugin/internal'
|
|
580
583
|
|
|
581
584
|
export const isRpcAvailable = !!import.meta.hot && ${n}
|
|
@@ -607,7 +610,7 @@ export const likec4rpc = rpc ?? {
|
|
|
607
610
|
throw new Error('likec4rpc.calcAdhocView is not available in production')
|
|
608
611
|
},
|
|
609
612
|
}
|
|
610
|
-
`,`code`),
|
|
613
|
+
`,`code`),st={id:`likec4:rpc`,virtualId:`likec4:plugin/rpc.js`,async load(e){return logGenerating(`rpc`),{code:ot(e),moduleType:`js`,moduleSideEffects:!1}}},code=e=>`
|
|
611
614
|
export { IconRenderer } from 'likec4:icons/${e}'
|
|
612
615
|
export {
|
|
613
616
|
$likec4data,
|
|
@@ -617,7 +620,7 @@ export {
|
|
|
617
620
|
useLikeC4View
|
|
618
621
|
} from 'likec4:model/${e}'
|
|
619
622
|
export const projectId = ${hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(e))}
|
|
620
|
-
`,
|
|
623
|
+
`,ct={id:`likec4:single-project`,virtualId:`likec4:plugin/single-project.js`,async load({projects:e}){let t=y(e);return logGenerating(`single-project`,t.id),code(t.id)}},jsStringLiteral=e=>hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(e)),generateWebcomponentsCode=e=>{let t=jsStringLiteral(e);return`
|
|
621
624
|
import { createElement } from 'react'
|
|
622
625
|
import { createRoot } from 'react-dom/client'
|
|
623
626
|
import { LikeC4View } from ${jsStringLiteral(`likec4:react/${e}`)}
|
|
@@ -701,4 +704,4 @@ export function defineWebcomponent(name) {
|
|
|
701
704
|
customElements.define(name, LikeC4ViewElement)
|
|
702
705
|
return LikeC4ViewElement
|
|
703
706
|
}
|
|
704
|
-
`},
|
|
707
|
+
`},lt={...generateMatches(`webcomponents`),async load({project:e}){return logGenerating(`webcomponents`,e.id),{code:generateWebcomponentsCode(e.id),moduleType:`js`}}},ut=[Xe,Ge,Le,ze,Je,nt,Ve],dt=[Re,Be,Ye,rt,He],ft=[...ut,it,lt],pt=[$e,Ze,tt,ct,at,...dt,qe,st];function LikeC4VitePlugin({environments:e,appConfig:i,ai:a=`auto`,...o}){let s,c,l=!1,u,d=o.watch??!1,f=[...pt,createAppConfigModule(i)],initAI=async()=>{if(v(a))throw Error(`Invalid AI configuration: true is not allowed, use an object with adapter configuration or false to disable AI`);if(a!==`disabled`)return a===`auto`?await xe():a};function moduleopts(e){return{rpcEnabled:l,isAIAvailable:!!u,ai:u,assetsDir:c,likec4:s,logger:H,...e}}let projectsChangeDetector=()=>{let e=C(e=>({id:e.id,title:e.title,path:e.path,folder:e.folder.toString(),landingPage:e.config.landingPage,exportFormats:effectiveWebappExportFormats(e.config)})),t;return n=>{let r=e(n);return t??=r,!h(t,r)&&(t=r,!0)}};return[iconBundlePlugin({environments:e?[e].flat():void 0,workspace:o.workspace??o.languageServices?.workspacePath}),{name:`vite-plugin-likec4`,sharedDuringBuild:!0,applyToEnvironment(t){return!e||e.includes(t.name)},async configResolved(e){let t=l=e.command===`serve`;if(o.languageServices)s=o.languageServices;else{let n=d=t&&(o.watch??!0);s=(await r(o.workspace??e.root,{manualLayouts:!0,graphviz:o.graphviz??`wasm`,configureLogger:`console`,logLevel:o.logLevel??`warning`,printErrors:o.printErrors??!0,throwIfInvalid:o.throwIfInvalid??!1,watch:n})).languageServices}c=s.workspaceUri.fsPath,l&&(u=await initAI())},resolveId:{filter:{id:/^likec4:/},handler(e){for(let t of ft){let n=t.matches(e);if(n)return t.virtualId(n)}for(let t of f)if(t.id===e)return t.virtualId;return null}},load:{filter:{id:/likec4:plugin/},async handler(e){for(let t of ft){let n=t.matches(e);if(n){let e=s.project(n);return await t.load.call(this,moduleopts({project:e}))}}for(let t of f)if(t.virtualId===e){let e=s.projects();return m(e,1)?await t.load.call(this,moduleopts({projects:e})):null}return null}},async configureServer(e){if(l){if(enablePluginRPC.call(this,moduleopts({server:e})),u){H.info(n.dim(`enabling`)+` `+n.magenta(`AI Chat`));let{enableAIServer:t}=await import(`./enableServer.mjs`);t.call(this,moduleopts({server:e}))}return()=>{let r=e.hot,i=projectsChangeDetector(),reloadModule=async n=>{let r=e.moduleGraph.getModuleById(n);if(!r||r.importers.size===0)return!1;try{return await e.reloadModule(r),!0}catch(e){return H.error(t(e)),!1}},hasErrors=()=>{let[e]=s.getErrors();if(!e)return!1;try{r.send({type:`error`,err:{name:`LikeC4ValidationError`,...splitErrorMessage(e.message),plugin:`vite-plugin-likec4`,loc:{file:e.sourceFsPath,line:e.line,column:e.range.start.character+1}}}),H.trace(n.dim(`sent LikeC4ValidationError`))}catch(e){H.error(t(e))}return!0},reloadProjects=async()=>{let e=s.projects();if(i(e)){H.trace(n.dim(`onProjectsUpdate - change detected`)),await reloadModule($e.virtualId),await reloadModule(qe.virtualId),await reloadModule(Ze.virtualId);for(let e of dt)await reloadModule(e.virtualId);e.length>1&&await reloadModule(tt.virtualId)}else H.trace(n.dim(`onProjectsUpdate - no change`))};s.projectsManager.onProjectsUpdate(pDebounce(reloadProjects,100)),s.builder.onModelParsed(onModelParsedBatched(async e=>{if(!hasErrors())for(let t of e){H.trace(n.dim(`onModelParsed project`)+` `+n.cyan(t));for(let e of ut)await reloadModule(e.virtualId(t))}}))}}},async buildEnd(){d&&await s.dispose()}}]}function onModelParsedBatched(e){return ee(n=>{e(n).catch(e=>{H.error(t(e))})},{reducer:(e,t)=>(e??=/* @__PURE__ */ new Set,e.add(t),e),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:500}).call}export{generateDrawio as a,generateD2 as c,buildDrawioExportOptionsForViews as i,enhanceLayoutWithAI as l,generatePuml as n,generateDrawioMulti as o,generateMermaid as r,Me as s,LikeC4VitePlugin as t,H as u};
|
package/dist/cli/index.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|