likec4 1.59.3 → 1.59.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__app__/src/chunks/AIChat.mjs +108 -108
- package/__app__/src/chunks/LikeC4Styles.mjs +752 -604
- package/__app__/src/chunks/ProjectsOverview.mjs +72 -72
- package/__app__/src/chunks/es.mjs +1 -1
- package/__app__/src/chunks/hooks.mjs +94 -91
- package/__app__/src/chunks/libs/@floating-ui.mjs +3 -3
- package/__app__/src/chunks/libs/@mantine.mjs +1609 -892
- package/__app__/src/chunks/libs/@tanstack-ai.mjs +2 -2
- package/__app__/src/chunks/libs/@tanstack.mjs +4 -10
- package/__app__/src/chunks/libs/@xyflow/react.mjs +4 -4
- package/__app__/src/chunks/libs/d3.mjs +4 -9
- package/__app__/src/chunks/libs/fast-equals.mjs +61 -49
- package/__app__/src/chunks/libs/framer.mjs +6 -6
- package/__app__/src/chunks/styled-system.mjs +2578 -124
- package/__app__/src/main.mjs +21537 -20155
- package/__app__/src/style.css +1 -1
- package/config/schema.json +14 -0
- package/dist/app/render-view-client.css +1 -1
- package/dist/app/render-view-client.js +99 -105
- package/dist/chunks/filenames.mjs +6 -6
- package/dist/chunks/index.d.mts +7 -1
- package/dist/chunks/index2.d.mts +38 -21
- package/dist/chunks/libs/@chevrotain/gast.mjs +1 -1
- package/dist/chunks/libs/@chevrotain/types.d.mts +108 -0
- package/dist/chunks/libs/@logtape/logtape.mjs +4 -4
- package/dist/chunks/libs/langium.d.mts +1777 -16
- package/dist/chunks/libs/langium.mjs +4 -4
- 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/picomatch.mjs +1 -1
- 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/zod.d.mts +1717 -17
- package/dist/chunks/node.mjs +58 -59
- package/dist/chunks/vite-plugin.mjs +15 -12
- package/dist/cli/index.d.mts +1 -1
- package/dist/cli/index.mjs +104 -88
- package/dist/index.d.mts +3 -3
- package/dist/model/index.d.mts +4 -4
- package/dist/vite-plugin/index.d.mts +2 -2
- package/dist/vite-plugin/internal/index.d.mts +15 -15
- package/dist/vite-plugin/internal/index.mjs +72 -27
- package/package.json +28 -28
- package/react/index.d.mts +22720 -1460
- package/react/index.mjs +30391 -25072
- package/vite-plugin-modules.d.ts +4 -2
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime.mjs";import{E as t,S as n,_ as r,g as i,r as a,x as o,y as s}from"./node.mjs";import{_ as c,b as l,g as u,h as d,y as f}from"./libs/langium.mjs";import{o as p}from"./libs/ufo.mjs";import{t as m}from"./libs/json5.mjs";import{C as h,T as g,a as _,b as v,l as y,n as b,z as ee}from"./libs/zod.mjs";import{l as x}from"./filenames.mjs";import{$ as S,B as te,F as C,H as ne,I as w,J as T,N as E,Q as D,U as O,Z as k,b as A,c as j,h as re,k as M,o as N,r as P,t as F,tt as I,v as ie,w as L,y as ae}from"./libs/remeda.mjs";import{n as oe,t as se}from"./libs/package-manager-detector.mjs";import{t as ce}from"./libs/birpc.mjs";import{t as le}from"./libs/pako.mjs";import{createRequire as ue}from"node:module";import{mkdir as de,readFile as fe,writeFile as pe}from"node:fs/promises";import{resolve as R}from"node:path";import{RichText as me,exact as he,flattenMarkdownOrString as z}from"@likec4/core/types";import{DefaultMap as B,LikeC4Styles as ge,exact as _e,invariant as ve,nonexhaustive as ye}from"@likec4/core";import{compareNatural as be,nonNullable as xe}from"@likec4/core/utils";import"@likec4/core/model";import Se from"nano-spawn";import{existsSync as Ce}from"node:fs";import{env as V}from"std-env";import H,{cwd as we}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;try{t=await e.apply(this,i)}catch(e){n=e}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(n)throw n;return t})();try{return await n}finally{n=void 0}}};function effectiveWebappExportFormats(e){let t=e.webapp?.exportFormats;if(!t)return[...x];let n=new Set(t);return x.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=>p(`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(p(`likec4:${e}`,t)))})`),a=n?hardenJsonStringLiteralForEmbeddedScript(JSON.stringify(`Project does not enable ${n} export: `)):null
|
|
2
|
-
export let ${
|
|
1
|
+
import{i as e}from"./rolldown-runtime.mjs";import{E as t,S as n,_ as r,g as i,r as a,x as o,y as s}from"./node.mjs";import{_ as c,b as l,g as u,h as d,y as f}from"./libs/langium.mjs";import{o as p}from"./libs/ufo.mjs";import{t as m}from"./libs/json5.mjs";import{C as h,T as g,a as _,b as v,l as y,n as b,z as ee}from"./libs/zod.mjs";import{l as x}from"./filenames.mjs";import{$ as S,B as te,F as C,H as ne,I as w,J as T,N as E,Q as D,U as O,Z as k,b as A,c as j,h as re,k as M,o as N,r as P,t as F,tt as I,v as ie,w as L,y as ae}from"./libs/remeda.mjs";import{n as oe,t as se}from"./libs/package-manager-detector.mjs";import{t as ce}from"./libs/birpc.mjs";import{t as le}from"./libs/pako.mjs";import{createRequire as ue}from"node:module";import{mkdir as de,readFile as fe,writeFile as pe}from"node:fs/promises";import{resolve as R}from"node:path";import{RichText as me,exact as he,flattenMarkdownOrString as z}from"@likec4/core/types";import{DefaultMap as B,LikeC4Styles as ge,exact as _e,invariant as ve,nonexhaustive as ye}from"@likec4/core";import{compareNatural as be,nonNullable as xe}from"@likec4/core/utils";import"@likec4/core/model";import Se from"nano-spawn";import{existsSync as Ce}from"node:fs";import{env as V}from"std-env";import H,{cwd as we}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;try{t=await e.apply(this,i)}catch(e){n=e}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(n)throw n;return t})();try{return await n}finally{n=void 0}}};function effectiveWebappExportFormats(e){let t=e.webapp?.exportFormats;if(!t)return[...x];let n=new Set(t);return x.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=>p(`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(p(`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,12 +23,15 @@ 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
37
|
`,moduleType:`js`}}}}const U=n.getChild(`vite`);function logGenerating(e,t){t?U.info(s.dim(`generating `)+s.magenta(`likec4:${e}/`)+s.magentaBright(t)):U.info(s.dim(`generating `)+s.magenta(`likec4:${e}`))}function isInstalled(e){try{return!!import.meta.resolve(e,H.cwd())}catch(e){return U.trace(t(e)),!1}}async function ensurePackage(e){let n=U.getChild(`pkg`);if(isInstalled(e)){n.trace`${e} installed`;return}n.warn(s.dim(`not found `)+s.green(e));let r=xe(await se(),()=>{n.error`Package manager not detected, install ${e} manually`,H.exit(1)}),{command:i,args:a}=xe(oe(r.agent,`add`,[e]),()=>{n.error`Install package ${e} manually`,H.exit(1)});n.info(s.dim(`installing `)+s.green(e));try{await Se(i,a)}catch(r){n.debug(t(r)),n.error`Install package ${e} manually`,H.exit(1)}}const W=U.getChild(`ai`);function chooseModel(e,t){let n=V[e];return n||=(W.info(`I will use `+s.green(t)+` model `+s.dim(`you can override with `)+s.yellow(e)+s.dim(` env var`)),t),n}const G=16e3;async function loadOpenAI(){W.info(`Found `+s.yellow(`OPENAI_API_KEY`)+s.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:G}}async function loadOpenRouter(){W.info(`Found `+s.yellow(`OPENROUTER_API_KEY`)+s.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:G}}async function loadAnthropic(){W.info(`Found `+s.yellow(`ANTHROPIC_API_KEY`)+s.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:G}}async function loadGemini(){W.info(`Found `+s.yellow(`GEMINI_API_KEY`)+s.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:G}}async function loadOllama(){W.info(`Found `+s.yellow(`OLLAMA_HOST`)+s.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:G}}const Te={global_en:`https://api.minimax.io/v1`,cn_zh:`https://api.minimaxi.com/v1`};function chooseMiniMaxBaseURL(){let e=V.MINIMAX_REGION?.trim().toLowerCase();return e===`cn_zh`||e===`cn`||e===`cn-zh`||e===`china`?Te.cn_zh:Te.global_en}async function loadMiniMax(){let e=chooseMiniMaxBaseURL();W.info(`Found `+s.yellow(`MINIMAX_API_KEY`)+s.dim(`, loading OpenAI-compatible adapter on `)+s.green(e)),await ensurePackage(`@tanstack/ai-openai`);let{createOpenaiChat:t}=await import(`@tanstack/ai-openai`),n=V.MINIMAX_API_KEY;return{adapter:t(chooseModel(`MINIMAX_CHAT_MODEL`,`MiniMax-M3`),n,{baseURL:e}),maxTokens:G}}function pickLoader(){if(L(V.OPENAI_API_KEY))return loadOpenAI;if(L(V.OPENROUTER_API_KEY))return loadOpenRouter;if(L(V.ANTHROPIC_API_KEY))return loadAnthropic;if(L(V.GEMINI_API_KEY))return loadGemini;if(L(V.OLLAMA_HOST))return loadOllama;if(L(V.MINIMAX_API_KEY))return loadMiniMax}const Ee=re(async()=>{let e=pickLoader();if(e){await ensurePackage(`@tanstack/ai`);let t=await e();return W.info([`AI configured with`,s.green(t.adapter.name),`adapter`,s.dim(`you can disable it in plugin options`)].join(` `)),t}}),K=U.getChild(`icons`);function iconBundlePlugin(e){let t=we(),n=[t];e.workspace&&n.unshift(e.workspace);let r=ue(t),i,resolveIcon=async(e,t)=>{try{let i=r.resolve(`@likec4/icons/${e}/${t}`,{paths:n});return K.trace(s.dim(`found in package `)+i),await fe(i,`utf-8`)}catch{return}},readFromCache=async(e,t)=>{if(i)try{let n=R(i,e,`${t}.js`);if(Ce(n))return K.trace(s.dim(`read cached `)+`${e}/${t}.js`),await fe(n,`utf-8`)}catch{}},writeToCache=async(e,t,n)=>{if(i)try{let r=R(i,e);Ce(r)||await de(r,{recursive:!0});let a=R(r,`${t}.js`);await pe(a,n),K.trace(s.dim(`written to cache `)+a)}catch(n){K.error(s.dim(`failed to write to cache `)+`${e}/${t}.js`,{error:n})}},fetchFromRemote=async(e,t)=>{let n=p(`https://icons.like-c4.dev`,e,`${t}.js`);K.trace(s.dim(`fetching `)+n);let r=await fetch(n);if(!r.ok)throw Error(`Failed to fetch icon: ${r.status} ${r.statusText}`);return await r.text()},a=new B(async e=>{try{let[t,n]=e.split(`:`);(n.endsWith(`.jsx`)||n.endsWith(`.js`))&&(n=n.slice(0,n.lastIndexOf(`.`))),K.debug(s.dim(`resolving `)+s.green(`${t}:${n}`));let r=await readFromCache(t,n);return r??=await resolveIcon(t,n),r||(r=await fetchFromRemote(t,n),await writeToCache(t,n,r),r)}catch(t){return K.error(s.dim(`failed to resolve icon `)+s.red(e),{error:t}),`
|
|
@@ -37,7 +40,7 @@ export default function NotFoundIcon() {
|
|
|
37
40
|
}
|
|
38
41
|
`}});return{name:`likec4:icon-bundle`,sharedDuringBuild:!0,applyToEnvironment(t){return!e.environments||e.environments.includes(t.name)},configResolved({root:e,...t}){n.unshift(e),t.cacheDir&&(i=R(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(!S(t,2))return null;let[n,r]=t;return{moduleType:`jsx`,code:await a.get(`${n}:${r}`)}}}}}const q=o(`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=z(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 B(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=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 q.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 B(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(he({id:o,title:l,parent:c,children:a.children.map(nodeId),level:n})),e;let u=a.description?truncate(z(a.description),200):void 0;return e.nodes.push(he({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 De=_([`TB`,`BT`,`LR`,`RL`]),J=g().nonempty().brand(),Oe=_([`same`,`source`,`sink`,`min`,`max`]),ke=v({rank:Oe,nodes:y(J)}),Y={id:g().nonempty().brand(),weight:b().int().min(0).max(20),minlen:b().int().min(0).max(4)},Ae=v({source:J,target:J,weight:Y.weight.optional(),minlen:Y.minlen.optional()}),je=v({direction:De.optional(),ranks:y(ke).default([]),edgeWeight:h(Y.id,Y.weight).default({}),edgeMinlen:h(Y.id,Y.minlen).default({}),reverseRank:y(Y.id).default([]),excludeFromRanking:y(Y.id).default([]),edgeOrder:y(Y.id).default([]),nodeOrder:y(J).default([]),invisibleEdges:y(Ae).default([]),reasoning:g().default(``)}),Me=/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/;function extractJson(e){let t=Me.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=m.parse(n),i=je.safeParse(r);if(!i.success){q.warn(`Failed to validate LLM response
|
|
39
42
|
`+ee(i.error));return}return restoreIdsAndMapToHints(i.data,t)}catch(t){q.warn(`Failed to parse LLM response
|
|
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||q.warn`Unknown node ID ${e} in LLM output, skipping`,t},mapToNodeId=e=>I(e,A(nodeId),k(C)),edgeId=e=>{let t=n.edges[e]?.id;return t||q.warn`Unknown edge ID ${e} in LLM output, skipping`,t},mapToNonEmpty=(e,t)=>{let n=e.map(t).filter(C);return S(n,1)?n:void 0},r=I(e.excludeFromRanking,A(edgeId),k(C),P(),e=>S(e,1)?e:void 0),i=I(e.reverseRank,A(edgeId),k(C),P(),e=>S(e,1)?e:void 0),a=(()=>{let e=new Set;return t=>t.filter(t=>!e.has(t)&&(e.add(t),!0))})(),o=I(e.ranks,A(e=>{let t=a(mapToNodeId(e.nodes));return S(t,1)?{rank:e.rank,nodes:t}:null}),k(L)),s=I(e.invisibleEdges,A(({source:e,target:t,minlen:n=1,weight:r=1})=>{let i=nodeId(e),a=nodeId(t);if(
|
|
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||q.warn`Unknown node ID ${e} in LLM output, skipping`,t},mapToNodeId=e=>I(e,A(nodeId),k(C)),edgeId=e=>{let t=n.edges[e]?.id;return t||q.warn`Unknown edge ID ${e} in LLM output, skipping`,t},mapToNonEmpty=(e,t)=>{let n=e.map(t).filter(C);return S(n,1)?n:void 0},r=I(e.excludeFromRanking,A(edgeId),k(C),P(),e=>S(e,1)?e:void 0),i=I(e.reverseRank,A(edgeId),k(C),P(),e=>S(e,1)?e:void 0),a=(()=>{let e=new Set;return t=>t.filter(t=>!e.has(t)&&(e.add(t),!0))})(),o=I(e.ranks,A(e=>{let t=a(mapToNodeId(e.nodes));return S(t,1)?{rank:e.rank,nodes:t}:null}),k(L)),s=I(e.invisibleEdges,A(({source:e,target:t,minlen:n=1,weight:r=1})=>{let i=nodeId(e),a=nodeId(t);if(i&&a)return _e({weight:r===1?void 0:r,minlen:n===1?void 0:n,source:i,target:a})}),k(C),ne(e=>`${e.source}->${e.target}`),ie(([e,...t])=>I(t,j((e,t)=>_e({...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))),F(),e=>S(e,1)?e:void 0),c=e.reasoning;c&&(c=c.replaceAll(`][`,`] [`),D(t.mapping.nodes).forEach(([e,t])=>{c=c.replaceAll(RegExp(`\\[${e}\\]`,`g`),"`"+t.id+"`")}),D(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 D(e)){let e=edgeId(n);e&&(t[e]=r)}return t};return _e({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 Ne={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)
|
|
@@ -269,7 +272,7 @@ 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 Be=e(e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),`capitalizeFirstLetter`),Ve=e(e=>e.split(`.`).map(Be).join(``),`fqnName`),He=e(e=>Ve(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 Be=e(e=>e.charAt(0).toLocaleUpperCase()+e.slice(1),`capitalizeFirstLetter`),safeChars=e=>e.replace(/\W/g,`_`),Ve=e(e=>e.split(`.`).map(safeChars).map(Be).join(``),`fqnName`),He=e(e=>{let t=e.parent?e.parent+`.`:``;return Ve(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`component`:return`@{ shape: rectangle, ${n} }`;default:ye(e)}};function generateMermaid(e){let t=e.$view,{nodes:n,edges:a}=t,o=new Map,printNode=(e,t)=>{let r=He(e),a=(t?t+`.`:``)+r;o.set(e.id,a);let s=new u;if(e.children.length>0){let t=toSingleQuotes(e.title);s.append(`subgraph `,a,'["`',t,'`"]',i).indent({indentedChildren:[d(n.filter(t=>t.parent===e.id),e=>printNode(e,a),{appendNewLineIfNotEmpty:!0})],indentation:2}).append(`end`,i)}else s.append(a,mmdshape(e));return s},printEdge=e=>new u().append(o.get(e.source),` -.`,e.label?' "`'+toSingleQuotes(e.label)+'`" .-':`-`,`> `,o.get(e.target));return r(new u().append(`---`,i,`title: ${JSON.stringify(toSingleQuotes(e.titleOrId))}`,i,`---`,i).append(`graph `,t.autoLayout.direction,i).indent({indentedChildren:e=>{e.append(d(n.filter(e=>M(e.parent)),e=>printNode(e),{appendNewLineIfNotEmpty:!0})).appendIf(a.length>0,d(a,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`browser`:return`rectangle`;default:ye(e)}},escapeLabel=e=>E(e)?null:JSON.stringify(e).slice(1,-1).replace(/\\"/g,`"`);function generatePuml(e){let t=e.$view,n=e.$model.$styles.theme.colors,{nodes:a,edges:o}=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,s=new Map,printHeader=()=>new u().append(`title "`,e.titleOrId,`"`,i).append(pumlDirection(t),` direction`,i),printTheme=()=>new u().append(`hide stereotype`,i).append(`skinparam ranksep `,`60`,i).append(`skinparam nodesep `,`30`,i).append(`skinparam {`,i).indent({indentedChildren:e=>e.append(`arrowFontSize `,`10`,i).append(`defaultTextAlignment `,`center`,i).append(`wrapWidth `,`200`,i).append(`maxMessageSize `,`100`,i).append(`shadowing `,`false`,i),indentation:2}).append(`}`,i),printStereotypes=e=>{let t=pumlShape(e),n=fqnName(e.id);return new u().append(`skinparam `,t,`<<`,n,`>>`,`{`,i).indent({indentedChildren:t=>t.append(`BackgroundColor `,pumlColor(e.color,elementColorProvider(`fill`)),i).append(`FontColor `,pumlColor(e.color,elementColorProvider(`hiContrast`),`#FFFFFF`),i).append(`BorderColor `,pumlColor(e.color,elementColorProvider(`stroke`)),i),indentation:2}).append(`}`,i)},printNode=e=>{let t=pumlShape(e),n=fqnName(e.id),r=escapeLabel(e.title)||nodeName(e),a=escapeLabel(e.technology);s.set(e.id,n);let o=me.from(e.description);return new u().append(t,` `).append(`"`).append(`==`,r).appendIf(!!a,`\\n<size:10>[`,a,`]</size>`).appendIf(o.nonEmpty,`\\n\\n`,escapeLabel(o.text)).append(`"`,` <<`,n,`>> `,`as `,n,i)},printBoundary=e=>{let t=escapeLabel(e.title)||nodeName(e),n=fqnName(e.id);return s.set(e.id,n),new u().append(`rectangle "`,t,`" <<`,n,`>> as `,n,` {`,i).indent({indentedChildren:t=>t.append(`skinparam `,`RectangleBorderColor<<`,n,`>> `,pumlColor(e.color,elementColorProvider(`fill`)),i).append(`skinparam `,`RectangleFontColor<<`,n,`>> `,pumlColor(e.color,elementColorProvider(`fill`)),i).append(`skinparam `,`RectangleBorderStyle<<`,n,`>> `,`dashed`,i,i).append(d(a.filter(t=>t.parent===e.id),e=>e.children.length>0?printBoundary(e):printNode(e))),indentation:2}).append(`}`,i)},printEdge=e=>{let t=e.technology||``,n=e.label||t,r=pumlColor(e.color,relationshipsColorProvider(`line`),`#777777`),withColor=e=>`<color:${r}>${e.replaceAll(`"`,`'`)}`,a=new u().append(s.get(e.source),` .[`,r,`,thickness=2].> `,s.get(e.target));return(n||t)&&(a.append(` : `,n.split(`
|
|
273
276
|
`).map(e=>E(e)?e:withColor(e)).join(`\\n`)),t&&t!==n&&a.append(`\\n<size:8>[`,withColor(t),`]</size>`)),a.append(i)};return r(new u().append(`@startuml`,i).append(printHeader(),i).append(printTheme(),i).append(d(a.filter(e=>e.children.length==0),e=>printStereotypes(e),{appendNewLineIfNotEmpty:!0})).append(d(a.filter(e=>M(e.parent)),e=>e.children.length>0?printBoundary(e):printNode(e),{appendNewLineIfNotEmpty:!0})).appendIf(o.length>0,i,d(o,e=>printEdge(e),{appendNewLineIfNotEmpty:!0})).append(`@enduml`,i))}function code$8(e){let t=new u;return t.appendTemplate`
|
|
274
277
|
/******************************************************************************
|
|
275
278
|
* This file was generated
|
|
@@ -500,7 +503,7 @@ if (import.meta.hot) {
|
|
|
500
503
|
}
|
|
501
504
|
})
|
|
502
505
|
}
|
|
503
|
-
`,`code`),at={id:`likec4:projects`,virtualId:`likec4:plugin/projects.js`,async load({projects:e}){return logGenerating(`projects`),{code:it(A(e,e=>({id:e.id,title:e.title,landingPage:e.config.landingPage,exportFormats:effectiveWebappExportFormats(e.config)}))),moduleType:`js`}}},ot=e(e=>`
|
|
506
|
+
`,`code`),at={id:`likec4:projects`,virtualId:`likec4:plugin/projects.js`,async load({projects:e}){return logGenerating(`projects`),{code:it(A(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`}}},ot=e(e=>`
|
|
504
507
|
import { atom, useStore } from 'likec4/vite-plugin/internal'
|
|
505
508
|
|
|
506
509
|
export const $viewdata = atom(${m.stringify(e)})
|
|
@@ -701,4 +704,4 @@ export function defineWebcomponent(name) {
|
|
|
701
704
|
customElements.define(name, LikeC4ViewElement)
|
|
702
705
|
return LikeC4ViewElement
|
|
703
706
|
}
|
|
704
|
-
`},ht={...generateMatches(`webcomponents`),async load({project:e}){return logGenerating(`webcomponents`,e.id),{code:generateWebcomponentsCode(e.id),moduleType:`js`}}},gt=[nt,Ze,Ue,Ge,et,ct,qe],_t=[We,Ke,tt,lt,Je],vt=[...gt,ut,ht],yt=[at,rt,st,mt,dt,..._t,$e,pt];function LikeC4VitePlugin({environments:e,appConfig:n,ai:r=`auto`,...i}){let o,c,l=!1,u,d=i.watch??!1,f=[...yt,createAppConfigModule(n)],initAI=async()=>{if(w(r))throw Error(`Invalid AI configuration: true is not allowed, use an object with adapter configuration or false to disable AI`);if(r!==`disabled`)return r===`auto`?await Ee():r};function moduleopts(e){return{rpcEnabled:l,isAIAvailable:!!u,ai:u,assetsDir:c,likec4:o,logger:U,...e}}let projectsChangeDetector=()=>{let e=A(e=>({id:e.id,title:e.title,folder:e.folder.toString(),landingPage:e.config.landingPage,exportFormats:effectiveWebappExportFormats(e.config)})),t;return n=>{let r=e(n);return t??=r,!te(t,r)&&(t=r,!0)}};return[iconBundlePlugin({environments:e?[e].flat():void 0,workspace:i.workspace??i.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(i.languageServices)o=i.languageServices;else{let n=d=t&&(i.watch??!0);o=(await a(i.workspace??e.root,{manualLayouts:!0,graphviz:i.graphviz??`wasm`,configureLogger:`console`,logLevel:i.logLevel??`warning`,printErrors:i.printErrors??!0,throwIfInvalid:i.throwIfInvalid??!1,watch:n})).languageServices}c=o.workspaceUri.fsPath,l&&(u=await initAI())},resolveId:{filter:{id:/^likec4:/},handler(e){for(let t of vt){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 vt){let n=t.matches(e);if(n){let e=o.project(n);return await t.load.call(this,moduleopts({project:e}))}}for(let t of f)if(t.virtualId===e){let e=o.projects();return S(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){U.info(s.dim(`enabling`)+` `+s.magenta(`AI Chat`));let{enableAIServer:t}=await import(`./enableServer.mjs`);t.call(this,moduleopts({server:e}))}return()=>{let n=e.hot,r=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 U.error(t(e)),!1}},hasErrors=()=>{let[e]=o.getErrors();if(!e)return!1;try{n.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}}}),U.trace(s.dim(`sent LikeC4ValidationError`))}catch(e){U.error(t(e))}return!0},reloadProjects=async()=>{let e=o.projects();if(r(e)){U.trace(s.dim(`onProjectsUpdate - change detected`)),await reloadModule(at.virtualId),await reloadModule($e.virtualId),await reloadModule(rt.virtualId);for(let e of _t)await reloadModule(e.virtualId);e.length>1&&await reloadModule(st.virtualId)}else U.trace(s.dim(`onProjectsUpdate - no change`))};o.projectsManager.onProjectsUpdate(pDebounce(reloadProjects,100)),o.builder.onModelParsed(onModelParsedBatched(async e=>{if(!hasErrors())for(let t of e){U.trace(s.dim(`onModelParsed project`)+` `+s.cyan(t));for(let e of gt)await reloadModule(e.virtualId(t))}}))}}},async buildEnd(){d&&await o.dispose()}}]}function onModelParsedBatched(e){return O(n=>{e(n).catch(e=>{U.error(t(e))})},{reducer:(e,t)=>(e??=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,Re as s,LikeC4VitePlugin as t,U as u};
|
|
707
|
+
`},ht={...generateMatches(`webcomponents`),async load({project:e}){return logGenerating(`webcomponents`,e.id),{code:generateWebcomponentsCode(e.id),moduleType:`js`}}},gt=[nt,Ze,Ue,Ge,et,ct,qe],_t=[We,Ke,tt,lt,Je],vt=[...gt,ut,ht],yt=[at,rt,st,mt,dt,..._t,$e,pt];function LikeC4VitePlugin({environments:e,appConfig:n,ai:r=`auto`,...i}){let o,c,l=!1,u,d=i.watch??!1,f=[...yt,createAppConfigModule(n)],initAI=async()=>{if(w(r))throw Error(`Invalid AI configuration: true is not allowed, use an object with adapter configuration or false to disable AI`);if(r!==`disabled`)return r===`auto`?await Ee():r};function moduleopts(e){return{rpcEnabled:l,isAIAvailable:!!u,ai:u,assetsDir:c,likec4:o,logger:U,...e}}let projectsChangeDetector=()=>{let e=A(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,!te(t,r)&&(t=r,!0)}};return[iconBundlePlugin({environments:e?[e].flat():void 0,workspace:i.workspace??i.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(i.languageServices)o=i.languageServices;else{let n=d=t&&(i.watch??!0);o=(await a(i.workspace??e.root,{manualLayouts:!0,graphviz:i.graphviz??`wasm`,configureLogger:`console`,logLevel:i.logLevel??`warning`,printErrors:i.printErrors??!0,throwIfInvalid:i.throwIfInvalid??!1,watch:n})).languageServices}c=o.workspaceUri.fsPath,l&&(u=await initAI())},resolveId:{filter:{id:/^likec4:/},handler(e){for(let t of vt){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 vt){let n=t.matches(e);if(n){let e=o.project(n);return await t.load.call(this,moduleopts({project:e}))}}for(let t of f)if(t.virtualId===e){let e=o.projects();return S(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){U.info(s.dim(`enabling`)+` `+s.magenta(`AI Chat`));let{enableAIServer:t}=await import(`./enableServer.mjs`);t.call(this,moduleopts({server:e}))}return()=>{let n=e.hot,r=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 U.error(t(e)),!1}},hasErrors=()=>{let[e]=o.getErrors();if(!e)return!1;try{n.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}}}),U.trace(s.dim(`sent LikeC4ValidationError`))}catch(e){U.error(t(e))}return!0},reloadProjects=async()=>{let e=o.projects();if(r(e)){U.trace(s.dim(`onProjectsUpdate - change detected`)),await reloadModule(at.virtualId),await reloadModule($e.virtualId),await reloadModule(rt.virtualId);for(let e of _t)await reloadModule(e.virtualId);e.length>1&&await reloadModule(st.virtualId)}else U.trace(s.dim(`onProjectsUpdate - no change`))};o.projectsManager.onProjectsUpdate(pDebounce(reloadProjects,100)),o.builder.onModelParsed(onModelParsedBatched(async e=>{if(!hasErrors())for(let t of e){U.trace(s.dim(`onModelParsed project`)+` `+s.cyan(t));for(let e of gt)await reloadModule(e.virtualId(t))}}))}}},async buildEnd(){d&&await o.dispose()}}]}function onModelParsedBatched(e){return O(n=>{e(n).catch(e=>{U.error(t(e))})},{reducer:(e,t)=>(e??=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,Re as s,LikeC4VitePlugin as t,U as u};
|
package/dist/cli/index.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|