@likec4/language-server 1.53.0 → 1.54.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/README.md +6 -0
- package/bin/likec4-language-server.mjs +1 -1
- package/dist/_chunks/LikeC4FileSystem.mjs +1 -1
- package/dist/_chunks/icons.d.mts +18 -0
- package/dist/_chunks/icons.mjs +2 -0
- package/dist/_chunks/mcp.mjs +1 -1
- package/dist/_chunks/module.d.mts +1 -1
- package/dist/_chunks/module.mjs +3 -3
- package/dist/_chunks/noop.mjs +1 -1
- package/dist/_chunks/utils.mjs +1 -1
- package/dist/browser/index.mjs +1 -1
- package/dist/browser/worker.mjs +1 -1
- package/dist/filesystem/index.mjs +1 -1
- package/dist/icons.d.mts +2 -0
- package/dist/icons.mjs +1 -0
- package/dist/index.mjs +1 -1
- package/dist/likec4lib.d.mts +1 -3
- package/dist/likec4lib.mjs +1 -1
- package/dist/mcp/index.mjs +1 -1
- package/dist/module.mjs +1 -1
- package/icons/package.json +4 -0
- package/package.json +23 -15
- package/dist/_chunks/likec4lib.mjs +0 -2
package/dist/_chunks/module.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{isNotLikeC4Builtin as e}from"../likec4lib.mjs";import{r as t,t as n}from"./noop.mjs";import{$ as r,$n as i,$r as a,$t as o,A as s,An as c,Ar as l,At as u,B as d,Bn as f,Br as p,Bt as m,C as ee,Cn as te,Cr as ne,Ct as re,D as ie,Dn as ae,Dr as oe,Dt as se,E as ce,En as le,Er as ue,Et as de,F as fe,Fn as pe,Fr as me,Ft as he,G as ge,Gn as _e,Gr as ve,Gt as ye,H as be,Hn as xe,Hr as Se,Ht as Ce,I as we,In as h,Ir as Te,It as Ee,J as De,Jn as Oe,Jr as ke,Jt as Ae,K as je,Kn as Me,Kr as Ne,Kt as Pe,L as Fe,Ln as Ie,Lr as Le,Lt as Re,M as ze,Mn as Be,Mr as Ve,Mt as He,N as Ue,Nn as We,Nr as Ge,Nt as Ke,O as qe,On as Je,Or as Ye,Ot as Xe,P as Ze,Pn as Qe,Pr as $e,Pt as et,Q as tt,Qn as nt,Qr as rt,Qt as it,R as at,Rn as ot,Rr as st,Rt as ct,S as lt,Sn as ut,Sr as dt,St as ft,T as pt,Tn as mt,Tr as ht,Tt as gt,U as _t,Un as vt,Ur as yt,Ut as bt,V as xt,Vn as St,Vr as Ct,Vt as wt,W as Tt,Wn as Et,Wr as Dt,Wt as Ot,X as kt,Xn as At,Xr as jt,Xt as Mt,Y as Nt,Yn as Pt,Yr as Ft,Yt as It,Z as Lt,Zn as Rt,Zr as zt,Zt as Bt,_ as Vt,_n as Ht,_r as Ut,_t as Wt,a as Gt,ai as g,an as Kt,ar as qt,at as Jt,b as Yt,bn as Xt,br as Zt,bt as Qt,cn as $t,cr as en,ct as tn,d as nn,dn as rn,dr as an,dt as on,ei as sn,en as cn,er as ln,et as un,f as dn,fn,fr as pn,ft as mn,g as hn,gn,gr as _n,gt as vn,h as yn,hn as bn,hr as xn,ht as _,i as v,in as Sn,ir as Cn,it as wn,j as Tn,jn as En,jr as Dn,jt as On,k as kn,kn as An,kr as jn,kt as Mn,l as Nn,ln as Pn,lr as Fn,lt as In,m as Ln,mn as Rn,mr as zn,mt as Bn,n as Vn,ni as Hn,nn as Un,nr as Wn,nt as Gn,oi as y,on as Kn,or as qn,ot as Jn,p as Yn,pn as Xn,pr as Zn,pt as Qn,q as $n,qn as er,qr as tr,qt as nr,r as rr,ri as ir,rn as ar,rr as or,rt as sr,sn as cr,sr as lr,st as ur,t as dr,ti as fr,tn as pr,tr as mr,tt as hr,u as gr,un as _r,ur as vr,ut as yr,v as br,vn as xr,vr as Sr,vt as b,w as Cr,wn as wr,wr as Tr,wt as Er,x as Dr,xn as Or,xr as kr,xt as Ar,y as jr,yn as Mr,yr as Nr,yt as Pr,z as Fr,zn as Ir,zr as Lr,zt as x}from"./utils.mjs";import{n as Rr,t as zr}from"./noop2.mjs";import{BuildDocuments as Br,ChangeView as Vr,DidChangeModelNotification as Hr,DidChangeProjectsNotification as Ur,DidChangeSnapshotNotification as Wr,DidRequestOpenViewNotification as Gr,FetchComputedModel as Kr,FetchLayoutedModel as qr,FetchProjects as Jr,FetchProjectsOverview as Yr,FetchTelemetryMetrics as Xr,FetchViewsFromAllProjects as Zr,GetDocumentTags as Qr,LayoutView as $r,Locate as ei,RegisterProject as ti,ReloadProjects as ni,ValidateLayout as ri}from"../protocol.mjs";import{AstUtils as S,ContextCache as ii,CstUtils as ai,DefaultDocumentValidator as oi,DefaultNameProvider as si,DefaultScopeComputation as ci,DefaultScopeProvider as li,DefaultValueConverter as ui,Disposable as di,DocumentState as C,EMPTY_SCOPE as fi,EMPTY_STREAM as pi,GrammarAST as mi,GrammarUtils as w,JSDocDocumentationProvider as hi,MapScope as gi,MultiMap as _i,StreamScope as vi,TextDocument as yi,URI as bi,UriUtils as xi,ValueConverter as Si,WorkspaceCache as Ci,inject as wi,interruptAndCheck as Ti,isAstNode as Ei,isNamed as Di,stream as T}from"langium";import{DefaultWeakMap as Oi,MultiMap as E,ancestorsFqn as ki,compareNatural as Ai,ifilter as ji,invariant as Mi,isNonEmptyArray as Ni,nameFromFqn as Pi,nonNullable as Fi,nonexhaustive as Ii,onNextTick as Li,parentFqn as Ri,sortNaturalByFqn as zi,sortParentsFirst as Bi,toArray as Vi}from"@likec4/core/utils";import{loggable as D,wrapError as Hi}from"@likec4/log";import*as Ui from"@likec4/core";import{DefaultMap as Wi,Fqn as Gi,FqnExpr as Ki,FqnRef as O,GlobalFqn as qi,LinkedList as Ji,RelationExpr as Yi,_layout as Xi,_stage as Zi,_type as Qi,ancestorsFqn as $i,applyCachedLayout as ea,applyManualLayout as ta,calcDriftsFromSnapshot as na,exact as ra,invariant as k,isAncestor as ia,isAndOperator as aa,isAnyOf as oa,isDeploymentNode as sa,isElementView as ca,isGlobalFqn as la,isNonEmptyArray as A,isOrOperator as ua,isSameHierarchy as da,nameFromFqn as fa,nonNullable as j,nonexhaustive as M,preferSummary as pa,splitGlobalFqn as ma}from"@likec4/core";import{anyPass as ha,entries as ga,filter as N,find as _a,findLast as va,first as ya,flatMap as P,forEach as ba,forEachObj as xa,funnel as Sa,groupBy as Ca,hasAtLeast as F,identity as wa,indexBy as Ta,isArray as Ea,isBoolean as Da,isDefined as I,isEmpty as L,isEmptyish as Oa,isNonNullish as ka,isNullish as R,isNumber as Aa,isPromise as ja,isString as Ma,isTruthy as z,keys as B,last as Na,map as V,mapToObj as H,mapValues as Pa,omitBy as Fa,once as Ia,only as La,pipe as U,piped as Ra,prop as za,reduce as Ba,sort as Va,unique as Ha,values as Ua}from"remeda";import{CompletionItemKind as W,DiagnosticSeverity as Wa,InsertTextFormat as G,SemanticTokenModifiers as Ga,SemanticTokenTypes as Ka,SymbolKind as qa,TextEdit as Ja}from"vscode-languageserver-types";import{hasLeadingSlash as Ya,hasProtocol as Xa,isRelative as Za,joinRelativeURL as Qa,joinURL as $a,withoutBase as eo,withoutLeadingSlash as to}from"ufo";import"vscode-uri";import{AbstractFormatter as no,AbstractSemanticTokenProvider as ro,AstNodeHoverProvider as io,DefaultCompletionProvider as ao,DefaultDocumentHighlightProvider as oo,DefaultWorkspaceSymbolProvider as so,Formatting as K,createDefaultModule as co,createDefaultSharedModule as lo}from"langium/lsp";import{GraphvizWasmAdapter as uo,QueueGraphvizLayoter as fo}from"@likec4/layouts";import{computeAdhocView as po,computeProjectsView as mo,computeView as ho,resolveRulesExtendedViews as go}from"@likec4/core/compute-view";import{LikeC4Model as q}from"@likec4/core/model";import{LikeC4Styles as _o,ThemeColors as vo,assignTagColors as yo,computeColorValues as bo}from"@likec4/core/styles";import{DocumentHighlight as xo,DocumentHighlightKind as So}from"vscode-languageserver";import{DiagnosticSeverity as Co}from"vscode-languageserver-protocol";import{Fqn as wo,FqnExpr as J,FqnRef as Y,_stage as To,_type as Eo,exact as X,isAnyOf as Z,isExtendsElementView as Do}from"@likec4/core/types";import{dedent as Oo}from"strip-indent";import{createStorage as ko,prefixStorage as Ao}from"unstorage";var LikeC4DocumentationProvider=class extends hi{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!b(e)&&!_(e)&&!x(e))return super.getDocumentation(e);try{let t=S.getDocument(e);if(t.state<C.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case b(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case _(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=O.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
|
|
2
2
|
`)}case x(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
|
|
3
3
|
`):void 0}default:return e}}catch(e){g(e)}}};function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function isInRagne(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}const Q={newLine:K.newLine({allowMore:!0}),oneSpace:K.oneSpace(),noSpace:K.noSpace(),indent:K.indent({allowMore:!0}),noIndent:K.noIndent()};var LikeC4Formatter=class extends no{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,Tr,(e,t)=>{let n=w.findNodesForProperty(e.$cstNode,`values`).filter(z).slice(1);t.cst(n).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,Ar,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...N([e.target,e.tags],z)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,it,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>Oe(e)||Ar(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...N([e.target,e.tags],z)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,ct,(e,t)=>{t.keywords(`->`,`<-`).surround(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.properties(`title`).prepend(Q.oneSpace),(Mn(e)&&isMultiline(e.$cstNode)||u(e)&&Mn(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(K.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(K.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){ae(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Q.noIndent)}indentContentInBraces(e){if(Je(e)||_n(e)||pn(e)||zn(e)||an(e)||gn(e)||Rn(e)||bn(e)||Xn(e)||fn(e)||bn(e)||Ie(e)||m(e)||pr(e)||Pt(e)||Cn(e)||pe(e)||Ir(e)||It(e)||He(e)||Er(e)||$e(e)||Dn(e)||Qn(e)||Bn(e)||Pe(e)||Ee(e)||ot(e)||Pr(e)||ft(e)||vn(e)||o(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(Q.noIndent).prepend(Q.oneSpace);let r=isMultiline(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(Q.oneSpace);continue}(!o||!areOverlap(o,e))&&t.cst([e]).prepend(K.newLine({allowMore:!0})).prepend(Q.indent),o=e}r?i.prepend(Q.noIndent).prepend(K.newLine({allowMore:!0})):i.prepend(K.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,wt)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,Ae,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,On)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,re)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(ye(e)||or(e)||Te(e)||xe(e)||vt(e)||Zn(e)||xn(e)||mn(e)||c(e)||In(e)||Xt(e)||lr(e)||yr(e)||Et(e)||f(e)||xr(e)||Or(e)||Mr(e)||en(e)||Me(e)||ht(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(Q.oneSpace):n.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)}}formatLinkProperty(e){this.on(e,En,(e,t)=>{t.keyword(`link`).append(Q.oneSpace),t.property(`value`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatNavigateToProperty(e){this.on(e,St)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,Ye,(e,t)=>{t.keyword(`autoLayout`).append(Q.oneSpace),t.property(`rankSep`).prepend(Q.oneSpace),t.property(`nodeSep`).prepend(Q.oneSpace)})}formatMetadataProperty(e){this.on(e,Qe,(e,t)=>{t.property(`key`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatElementDeclaration(e){this.on(e,x,(e,t)=>{let n=w.findNodeForProperty(e.$cstNode,`kind`),r=w.findNodeForProperty(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Q.oneSpace):(t.cst([r]).append(Q.oneSpace),t.cst([n]).prepend(Q.oneSpace))),t.properties(`props`).prepend(Q.oneSpace)})}formatExtendElement(e){this.on(e,cn,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,Rn,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,bn,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,Xn,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,fn,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,te,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,ut,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((pn(e)||zn(e)||Ut(e)||an(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),vr(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){($t(e)||ln(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,b,(e,t)=>{let n=w.findNodeForProperty(e.$cstNode,`kind`),r=w.findNodeForProperty(e.$cstNode,`name`);r&&n&&(compareRanges(r,n)>0?t.cst([n]).append(Q.oneSpace):(t.cst([r]).append(Q.oneSpace),t.cst([n]).prepend(Q.oneSpace))),t.properties(`title`).prepend(Q.oneSpace)})}formatDeployedInstance(e){this.on(e,_,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(Q.oneSpace),t.keyword(`instanceOf`).append(Q.oneSpace),t.property(`title`).prepend(Q.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,l,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(jn(e)||et(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,Dn,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,$e)?.keyword(`style`).append(Q.oneSpace),this.on(e,se)?.keyword(`style`).append(Q.oneSpace),this.on(e,Bt)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,Pn)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(i(e)||cr(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,tr,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,jt,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),Ne(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,Lr,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,Se,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),st(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(Re(e)||Ve(e)||de(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(Bt(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&isMultiline(n?.$cstNode);r&&t.property(`value`).prepend(Q.indent),t.keyword(`,`).prepend(Q.noSpace).append(r?Q.newLine:Q.oneSpace)}}formatRelationExpression(e){this.on(e,mt,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,wr,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,_e,(e,t)=>{t.keywords(`->`,`<->`).prepend(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace)}),this.on(e,Xe,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Re(t)||Ve(t)||de(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:M(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,Zt)?.property(`value`),t??=this.on(e,x)?.properties(`props`),t??=this.on(e,te)?.properties(`project`),t??=this.on(e,Oe)?.properties(`title`,`technology`),t??=this.on(e,Dn)?.properties(`title`),t??=this.on(e,ct)?.properties(`title`),t??=this.on(e,b)?.properties(`title`),t??=this.on(e,_)?.properties(`title`),t??=this.on(e,Ar)?.properties(`title`,`technology`),t??=this.on(e,En)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};const jo=y.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===Wa.Error;var DefaultLikeC4LanguageServices=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof Rr?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=U(this.services.shared.workspace.LangiumDocuments.groupedByProject(),ga(),V(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:V(n,za(`uri`)),config:a}}));if(F(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(F(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=V(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),za(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return q.create({...r.$data,_stage:`layouted`,views:U(i,V(za(`diagram`)),Ta(za(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===q.EMPTY){jo.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!F(n,1))throw Error(`No models found`);let r=mo(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return U(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),P(e=>U(e.diagnostics??[],N(isErrorDiagnostic),V(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:M(e)}}async format(e){let t=this.services.shared.workspace.LangiumDocuments,n=this.services.lsp.Formatter,r=buildFormattingOptions(e),i=this.collectDocumentsToFormat(t,e);i.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let a=new Map;for(let e of i){let t=e.uri.toString(),i=await n.formatDocument(e,{options:r,textDocument:{uri:t}}),o=i.length===0?e.textDocument.getText():yi.applyEdits(e.textDocument,i);a.set(t,o)}return a}collectDocumentsToFormat(e,t){let n=t?.projectIds??[],r=t?.documentUris??[],i=new Map;if(n.length>0)for(let t of n)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);else if(r.length===0)for(let t of this.projectsManager.all)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);for(let t of r){if(i.has(t))continue;let n;try{n=e.getDocument(bi.parse(t))}catch{jo.warn(`format: skipping unknown document ${t}`);continue}if(!Cr(n)){jo.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{jo.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){jo.error(D(e))}finally{jo.debug(`LikeC4LanguageServices disposed`)}}};function buildFormattingOptions(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var LikeC4CodeLensProvider=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if(Cr(e))return e.state<C.Linked&&(y.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(C.Linked,e.uri,n),y.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=jr.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=v(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};const Mo=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function isCompletionForPojectName(e,t){return mi.isRuleCall(t.feature)&&t.property===`project`&&te(e.node)}var LikeC4CompletionProvider=class extends ao{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case mi.isKeyword(t.feature):return this.completionForKeyword(e,t.feature,n);case mi.isCrossReference(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:W.Snippet,insertTextFormat:G.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&S.hasContainerOfType(e.node,Ir):n(e,{label:t.value,detail:`Insert deployment view`,kind:W.Class,insertTextFormat:G.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
|
|
4
4
|
`)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:W.Property,insertTextFormat:G.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:W.Property,insertTextFormat:G.Snippet,insertText:`${t.value} \${1|${vo.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:W.Property,insertTextFormat:G.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:W.Module,insertTextFormat:G.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:W.Module,insertTextFormat:G.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
|
|
@@ -26,9 +26,9 @@ import{i as e}from"./likec4lib.mjs";import{r as t,t as n}from"./noop.mjs";import
|
|
|
26
26
|
`).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case Ma(e):return Oo(e).trim();case Be(e)&&Ma(e.markdown):return{md:Oo(e.markdown).trim()};case Be(e)&&Ma(e.text):return{txt:Oo(e.text).trim()};case Be(e):return{txt:``};default:return}}var BaseParser=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=checksFromDiagnostics(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Ei(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?ts.getChild(n).debug(r):ts.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return P(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(ut(e)){let t=v(e),n=this.resolveFqn(j(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),qi(t,n)}return cn(e)?Vt(e.element):it(e)?Vt(e.deploymentNode):Wt(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||L(e.props))return;let extractValues=e=>{if(Be(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return z(t)?[t]:[];{let e=t.md||t.txt;return z(e)?[e]:[]}}else if(We(e))return e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(z);return[]},t=U(e.props,P(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),N(([e,t])=>z(t)));if(L(t))return;let n=U(t,Ca(([e])=>e),Pa(e=>e.map(([e,t])=>t))),r={};for(let[e,t]of Object.entries(n))t&&t.length>0&&(r[e]=t.length===1?t[0]:t);return L(r)?void 0:r}parseMarkdownOrString(e){if(Be(e))return removeIndent(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>j(e.tag.ref,`Tag reference is not resolved`).name).filter(z)),t=t.prev;return A(n)?Ha(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,N(e.props,En),e=>{let t=e.value;if(Oa(t))return;let n=z(e.title)?toSingleLine(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return ra({url:t,title:n,relative:r&&r!==t?r:void 0})});return A(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Xa(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&Za(n):return Qa(this.doc.uri.toString(),`../`,n);case n&&Ya(n):return $a(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){ts.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?$a(i,r):i;return $a(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(Ht(e))return`#${e.hex}`;if(er(e)){let t=Aa(e.alpha)?e.alpha:void 0;return Ma(e.alpha)&&(t=qe(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}M(e)}}parseElementStyle(e){if(!e)return{};if(Ea(e)){let t=this.parseStyleProps(e.find(Pe)?.props);try{let n=this.parseIconProperty(e.find(Xt));n&&(t.icon=n)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case yr(n):z(n.value)&&(t.border=n.value);break;case mn(n):{let e=Ue(n);z(e)&&(t.color=e);break}case lr(n):z(n.value)&&(t.shape=n.value);break;case Xt(n):{let e=this.parseIconProperty(n);z(e)&&(t.icon=e);break}case xr(n):{let e=Ue(n);z(e)&&(t.iconColor=e);break}case Or(n):z(n.value)&&(t.iconSize=kn(n));break;case Mr(n):z(n.value)&&(t.iconPosition=ce(n));break;case Et(n):t.opacity=ie(n);break;case f(n):t.multiple=Da(n.value)?n.value:!1;break;case en(n):z(n.value)&&(t.size=kn(n));break;case Me(n):z(n.value)&&(t.padding=kn(n));break;case ht(n):z(n.value)&&(t.textSize=kn(n));break;default:M(n)}}catch(e){this.logError(e,n)}return ra(t)}parseBaseProps(e,t){let n=removeIndent(t?.title??s(e.title)),r=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description);return ra({title:n,summary:t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:toSingleLine(t?.technology)??removeIndent(s(e.technology))})}};function*streamDeploymentModel(e){let t=Ji.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Ar(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function DeploymentModelParser(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of streamDeploymentModel(e))try{switch(!0){case Ar(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case _(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case b(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case it(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:M(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=j(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(h)),c=U(e.body?.props??[],N(t),N(ye),H(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return ra({id:n,kind:r,title:l??fa(n),...u,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);k(O.isModelRef(r)||O.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(h)),s=U(e.body?.props??[],N(t),N(ye),H(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return ra({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(h)),r=this.parseLinks(e.body);return!t&&L(n??{})&&!r?null:ra({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(I(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);k(O.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);k(O.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(h)),l=U(e.body?.props??[],N(or),N(e=>z(e.value)),H(e=>[e.key,e.value])),u=U(e.body?.props??[],N(Wn),ya())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Cn);return ra({id:rr(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...Ze(f?.props,t),navigateTo:u,astPath:n})}}}function DeploymentViewParser(e){return class extends e{parseDeploymentView(e){let t=e.body;k(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+rr(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(U(n,N(Te),H(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return jr.writeId(e,i),{[Ui._type]:`deployment`,id:i,astPath:r,title:toSingleLine(a)??null,description:o,tags:s,links:A(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(de(e))return this.parseDeploymentViewRulePredicate(e);if(Ye(e))return ze(e);if(se(e))return this.parseDeploymentViewRuleStyle(e);M(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;ka(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){g(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(kr)),n=removeIndent(s(e.props.find(xe)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const parseMetadataEquals=({operator:e,not:t},n)=>e?.startsWith(`!=`)?{neq:n}:e?.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n},parseEquals=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function parseParticipant(e){return!zt(e)&&!a(e)&&!rt(e)?null:e.participant}function parseWhereClause(e){switch(!0){case fr(e):{let t=e.value.tag.ref?.name,n=parseParticipant(e);k(t,`Expected tag name`);let r={tag:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case Dt(e):{let t=e.value?.ref?.name,n=parseParticipant(e);k(t,`Expected kind name`);let r={kind:parseEquals(e,t)};return n?{participant:n,operator:r}:r}case ve(e):{let t=e.key,n=parseParticipant(e);k(t,`Expected metadata key`);let r={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return n?{participant:n,operator:r}:r}case Se(e)||jt(e):return{not:parseWhereClause(e.value)};case Le(e):{let t=parseWhereClause(e.left),n=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,n)}default:M(e)}}function createBinaryOperator(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[aa(t)?t.and:t,aa(n)?n.and:n].flat();return k(A(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[ua(t)?t.or:t,ua(n)?n.or:n].flat();return k(A(e),`Expected non-empty array`),{or:e}}default:M(e)}}function ExpressionV2Parser(e){return class extends e{parseFqnRef(e){let t=j(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(ut(t)){let e={project:v(t),model:this.resolveFqn(j(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(x(t)){let n=Yn(e);if(n){let e={project:v(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=Ln(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Wt(t))return{deployment:this.resolveFqn(t)};M(t)}parseExpressionV2(e){if(Kn(e))return this.parseFqnExprOrWith(e);if(nt(e))return this.parseRelationExprOrWith(e);M(e)}parseFqnExprOrWith(e){if($t(e))return this.parseFqnExprWith(e);if(Kt(e))return this.parseFqnExprOrWhere(e);M(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(St(t)){let n=t.value.view.$refText;return z(n)&&(e.custom.navigateTo=n),e}if(vt(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(ye(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=removeIndent(s(t.value));return n&&(e.custom[t.key]=n),e}if(Xt(t)){let n=this.parseIconProperty(t);return I(n)&&(e.custom[t.key]=n),e}if(mn(t)){let n=Ue(t);return I(n)&&(e.custom[t.key]=n),e}if(lr(t)||yr(t))return I(t.value)&&(e.custom[t.key]=t.value),e;if(Et(t))return I(t.value)&&(e.custom[t.key]=ie(t)),e;if(xr(t)){let n=Ue(t);return I(n)&&(e.custom[t.key]=n),e}if(xe(t)){let n=z(t.value)?removeIndent(s(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(f(t))return Da(t.value)&&(e.custom[t.key]=t.value),e;if(en(t)||ht(t)||Me(t)||Or(t))return z(t.value)&&(e.custom[t.key]=kn(t)),e;if(Mr(t))return z(t.value)&&(e.custom[t.key]=t.value),e;M(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(cr(e))return this.parseFqnExprWhere(e);if(Sn(e))return this.parseFqnExpr(e);M(e)}parseFqnExprWhere(e){return k(!cr(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?parseWhereClause(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(Hn(e))return{wildcard:!0};if(Ce(e))return k(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(nr(e))return k(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(rn(e))return this.parseFqnRefExpr(e);M(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],n=e;for(;n;){try{ka(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(ln(e))return this.parseRelationExprWith(e);if(Rt(e))return this.parseRelationExprOrWhere(e);M(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(vt(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(or(t)||xe(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=removeIndent(s(t.value));return n&&(e[t.key]=n),e}if(In(t))return z(t.value)&&(e[t.key]=t.value),e;if(mn(t)){let n=Ue(t);return z(n)&&(e[t.key]=n),e}if(c(t))return z(t.value)&&(e[t.key]=t.value),e;if(Wn(t)){let n=t.value.view.ref?.name;return z(n)&&(e[t.key]=n),e}M(t)},{})}parseRelationExprOrWhere(e){if(i(e))return this.parseRelationExprWhere(e);if(At(e))return this.parseRelationExpr(e);M(e)}parseRelationExprWhere(e){k(!i(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,a=e.where?parseWhereClause(e.where):null,o;return o=a&&r?createBinaryOperator(`and`,r,a):a??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:o}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:M(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function GlobalsParser(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!z(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!z(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);F(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(Xn(e)){let r=this.parseGlobalPredicateGroup(e);F(r,1)&&(n.predicates[t]=r);return}if(fn(e)){let r=this.parseGlobalDynamicPredicateGroup(e);F(r,1)&&(n.dynamicPredicates[t]=r);return}M(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(Rn(e))return[this.parseViewRuleStyle(e)];if(bn(e))return e.styles.map(e=>this.parseViewRuleStyle(e));M(e)}}}function ImportsParser(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(j(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*streamModel(e){let t=Ji.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Oe(r)){n.push(r);continue}if(Un(r)){n.push(r);continue}if(r.body?.elements&&F(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function ModelParser(e){return class extends e{parseModel(){let e=this.doc;for(let t of streamModel(e))try{if(x(t)){e.c4Elements.push(this.parseElement(t));continue}if(Oe(t)){e.c4Relations.push(this.parseRelation(t));continue}if(cn(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(Un(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}M(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=j(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(h)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=U(e.body?.props??[],N(t),N(ye),H(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return X({id:n,kind:r,astPath:s,title:f,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...p,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(h)),r=this.parseLinks(e.body);if(!t&&Oa(n)&&!r)return null;let i=this.getAstNodePath(e);return X({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);k(Y.isModelRef(t)||Y.isImportRef(t),`Source must be a model reference`),k(Y.isModelRef(n)||Y.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(h)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&L(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return X({id:rr(`extend-relation`,Y.flatten(t),Y.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(I(e.source)){let t=this.parseFqnRef(e.source);return k(Y.isModelRef(t)||Y.isImportRef(t),`Relation source must be a model reference`),t}if(m(e.$container)||pr(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);k(Y.isModelRef(r)||Y.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(h)),c=this.getAstNodePath(e),l=U(e.body?.props??[],N(or),N(e=>z(e.value)),H(e=>[e.key,e.value])),u=U(e.body?.props??[],N(Wn),V(e=>e.value.view.ref?.name),N(z),ya()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Cn);return X({id:rr(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...Ze(m?.props,t)})}}}function PredicatesParser(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if($t(e))return this.parseFqnExprWith(e);if(Kt(e))return this.parseFqnExprOrWhere(e);M(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function SpecificationParser(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!z(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=U(n.filter(xn)??[],N(e=>this.isValid(e)&&ka(e.value)),H(e=>[e.key,removeIndent(s(e.value))]),Fa(R));t.relationships[r]={...i,...Ze(n.filter(qn),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}z(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:Fi(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!z(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(Pe)),o=this.parseLinks(e),c=U(n.filter(Zn)??[],N(e=>this.isValid(e)),H(e=>[e.key,e.value])),l=this.parseBaseProps(c),u=removeIndent(s(c.notation));return{[r]:ra({...l,notation:u,tags:i??void 0,...o&&Ui.isNonEmptyArray(o)&&{links:o},style:a})}}}}function ViewsParser(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!L(t.folder.trim())?toSingleLine(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Ae(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case On(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case re(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:M(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;k(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=hn(e.viewOf),n=t&&Vn(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+rr(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(U(n.props,N(e=>this.isValid(e)),N(Te),H(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[Ui._type]:`element`,id:a,astPath:r,title:toSingleLine(o)??null,description:s,tags:c,links:A(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(jr.writeId(e,u.id),`extends`in e){let t=e.extends.view.ref;return k(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(u,{extends:t.name})}return u}parseElementViewRule(e){if(Ve(e))return this.parseViewRulePredicate(e);if(jn(e))return this.parseViewRuleGlobalPredicateRef(e);if(me(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ye(e))return ze(e);if(Dn(e))return this.parseViewRuleGroup(e);if(Ge(e))return this.parseViewRuleRank(e);M(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if($e(e))return this.parseViewRuleStyle(e);if(l(e))return this.parseViewRuleGlobalStyle(e);M(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Ve(n)){t.push(this.parseViewRulePredicate(n));continue}if(Dn(n)){t.push(this.parseViewRuleGroup(n));continue}M(n)}catch(e){this.logError(e,n,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Ui.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>Ui.ModelExpression.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(kr)),r=removeIndent(s(e.props.find(xe)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;k(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+rr(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(U(i,N(Te),H(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);jr.writeId(e,o);let d=_a(i,Ke)?.value;return{[Ui._type]:`dynamic`,id:o,astPath:a,title:toSingleLine(s)??null,description:c,tags:l,links:A(u)?u:null,variant:d,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>Ee(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e))}}parseDynamicViewRule(e){if(he(e))return this.parseDynamicViewIncludePredicate(e);if(et(e))return this.parseViewRuleGlobalPredicateRef(e);if(me(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ye(e))return ze(e);M(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Kn(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=pathInsideDynamicView(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return k(A(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(u(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return k(A(t),`Dynamic step chain must have at least one step`),{seriesId:pathInsideDynamicView(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(u(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!A(n)||!this.isValid(e))return[];let r=Na(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=hn(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=hn(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:pathInsideDynamicView(e)},r=removeIndent(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case Wn(t):{let e=t.value.view.ref?.name;z(e)&&(n.navigateTo=e);break}case or(t):case xe(t):if(I(t.value))if(t.key===`description`){let e=removeIndent(t.value);e&&(n.description=e)}else n[t.key]=removeIndent(s(t.value))??``;break;case vt(t):I(t.value)&&(n[t.key]=removeIndent(t.value));break;case In(t):I(t.value)&&(n[t.key]=t.value);break;case mn(t):{let e=Ue(t);I(e)&&(n[t.key]=e);break}case c(t):I(t.value)&&(n[t.key]=t.value);break;default:M(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function pathInsideDynamicView(e){let t=e,n=[];for(;!He(t);)Aa(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}const ns=U(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends ns{};const rs=y.getChild(`parser`),isError=e=>e.severity===Wa.Error;var LikeC4ModelParser=class{cachedParsers=new Oi(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(C.Linked,async e=>{this.cachedParsers.has(e)&&(rs.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:xi.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(C.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){g(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(C.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(rs.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:xi.basename(e.uri)}),this.cachedParsers.delete(e))})}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){Mi(Cr(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=xi.relative(t.folderUri,e.uri);e.likec4ProjectId?rs.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):rs.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<C.Linked&&rs.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new E(Set)};e=Object.assign(e,r);let i=new DocumentParser(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},LikeC4ValueConverter=class extends ui{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Si.convertString(t)):super.runConverter(e,t,n)}};const{findNodeForKeyword:is}=w,asViewStyleRule=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...ga(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},isMatchingViewRule=(e,t)=>n=>{if(!$e(n)&&!se(n))return!1;let r=n.targets.value;if(!r||z(n.targets.prev)||r.$type!==`FqnRefExpr`||z(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function changeElementStyle(e,{view:t,viewAst:n,targets:r,style:i}){k(n.body,`View ${t.id} has no body`);let a=n.$cstNode;k(a,`viewCstNode`);let o=Na(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;k(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=N(n.body.rules,e=>$e(e)||se(e)),u=t[Qi]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=va(l,isMatchingViewRule(e,c)),n=u&&ia(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},includeRange=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},m=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>asViewStyleRule(e,i,s));m.push(Ja.insert(o,`
|
|
27
27
|
`+e.join(`
|
|
28
28
|
`))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Na(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;k(t,`RuleCstNode not found`);for(let[n,r]of ga(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;includeRange({start:e,end:t}),m.push(Ja.replace({start:e,end:t},n+` `+i));continue}let o=is(t,`{`)?.range.end;k(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;m.push(Ja.insert(o,`
|
|
29
|
-
`+c)),includeRange({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:m}}const{findNodeForKeyword:as}=w;function changeViewLayout(e,{view:t,viewAst:n,layout:r}){k(n.body,`View ${t.id} has no body`);let i=n.$cstNode;k(i,`viewCstNode`);let a=Tn(r.direction),o=va(n.body.rules,Ye),s=`autoLayout ${a}`;if(Aa(r.rankSep)&&(s+=` ${r.rankSep}`,Aa(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ja.replace(o.$cstNode.range,s);let c=as(n.body.$cstNode,`}`)?.range.start;k(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ja.insert(c,l)}const os=y.getChild(`model-changes`);var LikeC4ModelChanges=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);os.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return k(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return{success:!0,location:await n.ManualLayouts.remove(o,r)};k(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?(await n.DocumentBuilder.update([s.doc.uri],[]),{success:!0,location:{uri:c.uri,range:u}}):(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=D(Hi(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return os.error(n),{success:!1,error:n}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:M(t)}}},LikeC4NameProvider=class extends si{constructor(e){super(),this.services=e}getNameStrict(e){return j(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(Di(e))return e.name;if(ut(e))return e.imported.$refText;if(_(e))return e.target.modelElement.value.$refText}getNameNode(e){if(Di(e))return super.getNameNode(e);if(ut(e))return e.imported.$refNode;if(_(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return U(e,Ca(e=>`${e.type}.${e.name}`),ga(),P(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends ci{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){g(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(R(r)||r.length===0))for(let e of r)try{z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}exportGlobals(e,t,n){if(!(R(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}}exportModel(e,t,n){if(!(R(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{x(r)&&z(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){g(e)}}exportLibrary(e,t,n){if(!R(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){g(e)}}exportSpecification(e,t,n){if(!(R(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case an(r):case pn(r):z(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Ut(r):z(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case zn(r):z(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case vr(r):z(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:M(r)}}catch(e){g(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(R(r)||r.length===0))for(let e of r)try{b(e)&&z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new _i;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){g(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){g(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){g(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new _i,i=[];for(let a of e.elements){if(Oe(a))continue;let e;if(x(a)?(z(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):cn(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){g(e)}}i.length&&U(i,N(e=>!r.has(e.name)),Ca(e=>e.name),xa((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new _i,i=[];for(let a of e.elements){if(Ar(a))continue;let e=a.body;if(!it(a)){let i=this.nameProvider.getName(a);if(z(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){g(e)}}i.length&&U(i,N(e=>!r.has(e.name)),Ca(e=>e.name),xa((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:ss}=S;var LikeC4ScopeProvider=class extends li{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=v(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(_r(r))return new vi(this.streamForFqnRef(t,r,e));if(Nr(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==be)return this.getProjectScope(t,n,e);if(ut(r)){let e=v(r);return new vi(this.fqnIndex.rootElements(e))}if(Sr(r)&&e.property===`el`){let i=r.parent;return i?new vi(this.fqnIndex.directChildrenOf(t,Vt(i))):this.getProjectScope(t,n,e)}return new vi(T(this.computeScope(t,e)))}catch(r){return g(r),this.getProjectScope(t,n,e)}}catch(e){return g(e),fi}}*genUniqueDescedants(e){if(!e)return;let t=v(e);if(x(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(b(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(hn(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(hn(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new vi(this.deploymentsIndex.directChildrenOf(e,Vt(r)).filter(e=>this.reflection.isSubtype(e.type,d))):this.getProjectScope(e,d,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&b(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return T(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return pi;if(ut(i))return T(this.genUniqueDescedants(i.imported.ref));if(b(i))return T(this.genUniqueDescedants(i));if(_(i)){let e=i.target.modelElement.value.ref,t=ut(e)?e.imported.ref:x(e)?e:void 0;return T(this.genUniqueDescedants(t))}return x(i)?T(this.genUniqueDescedants(i)):M(i)}*genScopeForParentlessFqnRef(e,t,n){S.hasContainerOfType(t,Ot)||ee(t)?yield*this.computeScope(e,n,be):lt(t)?(yield*this.computeScope(e,n,be),yield*this.computeScope(e,n,d),yield*this.computeScope(e,n,at)):(yield*this.computeScope(e,n,d),yield*this.computeScope(e,n,at),S.hasContainerOfType(t,Er)&&(yield*this.computeScope(e,n,be)));let r=ss(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Nt)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,be),i=this.reflection.isSubtype(n,Fr),a=ss(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(byReferenceType);e.length>0&&(yield*e),i&&o(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&pr(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&It(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===kt?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new gi(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===kt)return super.getGlobalScope(e,t);let n=v(t.container);return this.getProjectScope(n,e,t)}};const $=y.getChild(`rpc`);var Rpc=class extends ir{constructor(e){super(),this.services=e}init=Ia(()=>{let e=this.services.shared.lsp.Connection;if(!e){$.info(`no connection, skip init ServerRpc`);return}$.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,sendDidChangeModelNotification=t=>{$.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(Hr.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},a=Sa(e=>{if(typeof e==`string`){sendDidChangeModelNotification(e);return}for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=Sa(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(Ur.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(e=>a.call(e)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(Kr.req,async({projectId:e,cleanCaches:r=!1},i)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&($.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===q.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(Wr.type,async e=>{let t=bi.parse(e.update??e.delete),r=`update`in e?{update:t}:{delete:t};$.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await n.ManualLayouts.handleFileSystemUpdate(r)}),e.onRequest(qr.req,async({projectId:e},n)=>{$.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:Ta(i,e=>e.id)}}}),e.onRequest($r.req,async({viewId:e,projectId:n,layoutType:r},i)=>($.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(ri.req,async({projectId:e},n)=>($.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(Jr.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:Pa(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:V(e,e=>e.uri.toString())}})})),e.onRequest(ni.req,async e=>{$.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(ti.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(bi.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(Zr.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Ti(e);try{let n=await t.Views.computedViews(i,e);r.push(...U(n,V(e=>({id:e.id,title:e.title??e.id,projectId:i})),Va((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){$.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(Br.req,async({docs:t},n)=>{let a=t.map(e=>bi.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>xi.equals(t,e))).toArray();$.debug(`[ServerRpc] received request to build:
|
|
29
|
+
`+c)),includeRange({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:m}}const{findNodeForKeyword:as}=w;function changeViewLayout(e,{view:t,viewAst:n,layout:r}){k(n.body,`View ${t.id} has no body`);let i=n.$cstNode;k(i,`viewCstNode`);let a=Tn(r.direction),o=va(n.body.rules,Ye),s=`autoLayout ${a}`;if(Aa(r.rankSep)&&(s+=` ${r.rankSep}`,Aa(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ja.replace(o.$cstNode.range,s);let c=as(n.body.$cstNode,`}`)?.range.start;k(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ja.insert(c,l)}const os=y.getChild(`model-changes`);var LikeC4ModelChanges=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);os.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return k(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return{success:!0,location:await n.ManualLayouts.remove(o,r)};k(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?(await n.DocumentBuilder.update([s.doc.uri],[]),{success:!0,location:{uri:c.uri,range:u}}):(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=D(Hi(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return os.warn(n),{success:!1,error:n}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:M(t)}}},LikeC4NameProvider=class extends si{constructor(e){super(),this.services=e}getNameStrict(e){return j(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(Di(e))return e.name;if(ut(e))return e.imported.$refText;if(_(e))return e.target.modelElement.value.$refText}getNameNode(e){if(Di(e))return super.getNameNode(e);if(ut(e))return e.imported.$refNode;if(_(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return U(e,Ca(e=>`${e.type}.${e.name}`),ga(),P(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends ci{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){g(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(R(r)||r.length===0))for(let e of r)try{z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}exportGlobals(e,t,n){if(!(R(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}}exportModel(e,t,n){if(!(R(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{x(r)&&z(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){g(e)}}exportLibrary(e,t,n){if(!R(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){g(e)}}exportSpecification(e,t,n){if(!(R(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case an(r):case pn(r):z(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Ut(r):z(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case zn(r):z(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case vr(r):z(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:M(r)}}catch(e){g(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(R(r)||r.length===0))for(let e of r)try{b(e)&&z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){g(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new _i;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){g(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){g(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){g(e)}uniqueDescriptions(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new _i,i=[];for(let a of e.elements){if(Oe(a))continue;let e;if(x(a)?(z(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):cn(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){g(e)}}i.length&&U(i,N(e=>!r.has(e.name)),Ca(e=>e.name),xa((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new _i,i=[];for(let a of e.elements){if(Ar(a))continue;let e=a.body;if(!it(a)){let i=this.nameProvider.getName(a);if(z(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){g(e)}}i.length&&U(i,N(e=>!r.has(e.name)),Ca(e=>e.name),xa((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:ss}=S;var LikeC4ScopeProvider=class extends li{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=v(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(_r(r))return new vi(this.streamForFqnRef(t,r,e));if(Nr(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==be)return this.getProjectScope(t,n,e);if(ut(r)){let e=v(r);return new vi(this.fqnIndex.rootElements(e))}if(Sr(r)&&e.property===`el`){let i=r.parent;return i?new vi(this.fqnIndex.directChildrenOf(t,Vt(i))):this.getProjectScope(t,n,e)}return new vi(T(this.computeScope(t,e)))}catch(r){return g(r),this.getProjectScope(t,n,e)}}catch(e){return g(e),fi}}*genUniqueDescedants(e){if(!e)return;let t=v(e);if(x(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(b(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(hn(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(hn(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new vi(this.deploymentsIndex.directChildrenOf(e,Vt(r)).filter(e=>this.reflection.isSubtype(e.type,d))):this.getProjectScope(e,d,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&b(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return T(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return pi;if(ut(i))return T(this.genUniqueDescedants(i.imported.ref));if(b(i))return T(this.genUniqueDescedants(i));if(_(i)){let e=i.target.modelElement.value.ref,t=ut(e)?e.imported.ref:x(e)?e:void 0;return T(this.genUniqueDescedants(t))}return x(i)?T(this.genUniqueDescedants(i)):M(i)}*genScopeForParentlessFqnRef(e,t,n){S.hasContainerOfType(t,Ot)||ee(t)?yield*this.computeScope(e,n,be):lt(t)?(yield*this.computeScope(e,n,be),yield*this.computeScope(e,n,d),yield*this.computeScope(e,n,at)):(yield*this.computeScope(e,n,d),yield*this.computeScope(e,n,at),S.hasContainerOfType(t,Er)&&(yield*this.computeScope(e,n,be)));let r=ss(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Nt)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,be),i=this.reflection.isSubtype(n,Fr),a=ss(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(byReferenceType);e.length>0&&(yield*e),i&&o(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&pr(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&It(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===kt?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new gi(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===kt)return super.getGlobalScope(e,t);let n=v(t.container);return this.getProjectScope(n,e,t)}};const $=y.getChild(`rpc`);var Rpc=class extends ir{constructor(e){super(),this.services=e}init=Ia(()=>{let e=this.services.shared.lsp.Connection;if(!e){$.info(`no connection, skip init ServerRpc`);return}$.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,sendDidChangeModelNotification=t=>{$.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(Hr.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},a=Sa(e=>{if(typeof e==`string`){sendDidChangeModelNotification(e);return}for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=Sa(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(Ur.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(e=>a.call(e)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(Kr.req,async({projectId:e,cleanCaches:r=!1},i)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&($.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===q.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(Wr.type,async e=>{let t=bi.parse(e.update??e.delete),r=`update`in e?{update:t}:{delete:t};$.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await n.ManualLayouts.handleFileSystemUpdate(r)}),e.onRequest(qr.req,async({projectId:e},n)=>{$.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:Ta(i,e=>e.id)}}}),e.onRequest($r.req,async({viewId:e,projectId:n,layoutType:r},i)=>($.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(ri.req,async({projectId:e},n)=>($.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(Jr.req,async()=>($.debug`received request ${`FetchProjects`}`,{projects:Pa(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:V(e,e=>e.uri.toString())}})})),e.onRequest(ni.req,async e=>{$.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(ti.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(bi.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(Zr.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await Ti(e);try{let n=await t.Views.computedViews(i,e);r.push(...U(n,V(e=>({id:e.id,title:e.title??e.id,projectId:i})),Va((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){$.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(Br.req,async({docs:t},n)=>{let a=t.map(e=>bi.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>xi.equals(t,e))).toArray();$.debug(`[ServerRpc] received request to build:
|
|
30
30
|
changed (total ${a.length}):${t.map(e=>`
|
|
31
31
|
- `+e).join(``)}
|
|
32
32
|
deleted (total ${o.length}):${o.map(e=>`
|
|
33
33
|
- `+e.toString()).join(`
|
|
34
|
-
`)}`),!s&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();$.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await Ti(n),await i.update(a,o,n)}),e.onRequest(ei.req,e=>{$.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:M(e)}}),e.onRequest(Vr.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Xr.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===q.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=B(n.specification.elements).length,r.deploymentKinds+=B(n.specification.deployments).length,r.relationshipKinds+=B(n.specification.relationships).length,r.tags+=B(n.specification.tags).length,r.customColors+=B(n.specification.customColors??{}).length,r.elements+=B(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=B(n.$data.relations).length,r.views+=B(n.$data.views).length,r.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await Ti(e),{metrics:r}}),e.onRequest(Qr.req,async({documentUri:e},r)=>{let i=bi.parse(e);$.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(Yr.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),di.create(()=>{a.cancel()}));function reportLayoutDrift(e){return U(e,N(e=>!!e.hasLayoutDrift),V(e=>{let n=t.ModelLocator.locateView(e.id);return k(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Co.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(Gr.type,e)}},NodeKindProvider$1=class{constructor(e){this.services=e}getSymbolKind(e){let t=Ei(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(be,Tt,d,at,Nt):return qa.Constructor;case hasType(tt,un,r,De,Jt):return qa.Namespace;case hasType(Lt):return qa.Class;case hasType(ur,kt,Fe,Jn):return qa.EnumMember;case hasType(hr,wn):return qa.Event;case hasType(_t,xt,sr,Gn):return qa.TypeParameter}return qa.Field}getCompletionItemKind(e){let t=Ei(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Fe):return W.Color;case hasType(be,d,at,Tt,Nt):return W.Constructor;case hasType(tt,un,r,De,Jt):return W.Module;case hasType(Lt):return W.Class;case hasType(ur,kt,Fe,Jn):return W.EnumMember;case hasType(hr,wn):return W.Event;case hasType(_t,sr,xt,Gn):return W.TypeParameter;default:return W.Reference}}},WorkspaceSymbolProvider=class extends so{};const cs=y.getChild(`views`);var DefaultLikeC4Views=class{#e;#t=new Wi(e=>new ProjectStorage({projectId:e,storage:Ao(this.#e,e),layouter:this.layouter.layout.bind(this.layouter)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=ko(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{cs.info`force clean cache`,this.#e.clear()})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Ua((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Ua(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=cs.getChild(r),a=this.projectStorage(r),o=[],s=e.$styles,c=[];for(let e of n){let t={view:e,styles:s},n=await a.get(t);if(n){c.push(n);continue}o.push(t)}if(o.length>0){let e=dr();await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(e,t)=>{c.push(a.remember(e,t))},onError:(e,t)=>{i.warn(`Fail layout view ${e.view.id}`,{error:t})}}),i.trace`layouted ${o.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await Ti(t),c.length!==n.length&&i.warn`layouted ${c.length} of ${n.length} views`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=cs.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}let s=this.projectStorage(n);try{let e={view:a,styles:i.$styles},n=await s.getOrExecute(e);return z(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,i,t)}:n}catch(e){let t=D(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Ua(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):g(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){cs.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=po(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return cs.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`)})}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[Xi]===`manual`?(cs.error(`View ${e.id} already has manual layout, this should not happen`),e):ta(e,r):na(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;#r;constructor(e){this.#e=cs.getChild(e.projectId),this.#t=e.projectId,this.#n=e.storage,this.#r=e.layouter}async get(e){let t=cacheKey(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);y.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);y.trace`cache miss for ${e.view.id}`;let r=dr(),i=await this.#r(e);return y.trace(`layouted {view} in ${r.pretty}`,{view:e.view.id}),await this.#n.set(t,i),this.resetViewError(e.view),i}remember=(e,t)=>{let n=cacheKey(e);return t&&(this.#n.set(n,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let n=`error-${e.id}`;this.#n.has(n).then(e=>{e||(this.#n.set(n,`true`),t())})}resetViewError(e){this.#n.del(`error-${e.id}`)}};function cacheKey(e){return`${e.view.hash}-${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:ea(e,t.diagram)}}const ls={graphviz(){return new uo}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider$1(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new Ci(e,C.Validated),IndexManager:e=>new nn(e),LangiumDocuments:e=>new gr(e),ProjectsManager:e=>new Nn(e),WorkspaceManager:e=>new Gt(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new fo({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},workspace:{AstNodeDescriptionProvider:bind(dn)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices(e={},r,i,a){let o=createSharedServices(e),s=wi([co({shared:o}),fe,createLikeC4Module({...zr,...n,...t,...ls,...e}),r,i,a].reduce(_merge,{}));return o.ServiceRegistry.register(s),registerValidationChecks(s),e.connection?Li(()=>s.Rpc.init()):o.workspace.ConfigurationProvider.initialized({}),{shared:o,likec4:s}}function createSharedServices(e={}){let r={...zr,...n,...t,...e};return wi(lo(r),we,createLikeC4SharedModule(r))}function _merge(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=_merge(t,r):e[n]=r}}return e}export{ls as a,WithGraphviz as i,createLikeC4Module as n,createSharedServices as r,createLanguageServices as t};
|
|
34
|
+
`)}`),!s&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();$.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await Ti(n),await i.update(a,o,n)}),e.onRequest(ei.req,e=>{$.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:M(e)}}),e.onRequest(Vr.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Xr.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===q.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=B(n.specification.elements).length,r.deploymentKinds+=B(n.specification.deployments).length,r.relationshipKinds+=B(n.specification.relationships).length,r.tags+=B(n.specification.tags).length,r.customColors+=B(n.specification.customColors??{}).length,r.elements+=B(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=B(n.$data.relations).length,r.views+=B(n.$data.views).length,r.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await Ti(e),{metrics:r}}),e.onRequest(Qr.req,async({documentUri:e},r)=>{let i=bi.parse(e);$.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(Yr.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),di.create(()=>{a.cancel()}));function reportLayoutDrift(e){return U(e,N(e=>!!e.hasLayoutDrift),V(e=>{let n=t.ModelLocator.locateView(e.id);return k(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Co.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(Gr.type,e)}},NodeKindProvider$1=class{constructor(e){this.services=e}getSymbolKind(e){let t=Ei(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(be,Tt,d,at,Nt):return qa.Constructor;case hasType(tt,un,r,De,Jt):return qa.Namespace;case hasType(Lt):return qa.Class;case hasType(ur,kt,Fe,Jn):return qa.EnumMember;case hasType(hr,wn):return qa.Event;case hasType(_t,xt,sr,Gn):return qa.TypeParameter}return qa.Field}getCompletionItemKind(e){let t=Ei(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Fe):return W.Color;case hasType(be,d,at,Tt,Nt):return W.Constructor;case hasType(tt,un,r,De,Jt):return W.Module;case hasType(Lt):return W.Class;case hasType(ur,kt,Fe,Jn):return W.EnumMember;case hasType(hr,wn):return W.Event;case hasType(_t,sr,xt,Gn):return W.TypeParameter;default:return W.Reference}}},WorkspaceSymbolProvider=class extends so{};const cs=y.getChild(`views`);var DefaultLikeC4Views=class{#e;#t=new Wi(e=>new ProjectStorage({projectId:e,storage:Ao(this.#e,e),layouter:this.layouter.layout.bind(this.layouter)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=ko(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{cs.info`force clean cache`,this.#e.clear()})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Ua((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Ua(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=cs.getChild(r),a=this.projectStorage(r),o=[],s=e.$styles,c=[];for(let e of n){let t={view:e,styles:s},n=await a.get(t);if(n){c.push(n);continue}o.push(t)}if(o.length>0){let e=dr();await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(e,t)=>{c.push(a.remember(e,t))},onError:(e,t)=>{i.warn(`Fail layout view ${e.view.id}`,{error:t})}}),i.trace`layouted ${o.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await Ti(t),c.length!==n.length&&i.warn`layouted ${c.length} of ${n.length} views`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=cs.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}let s=this.projectStorage(n);try{let e={view:a,styles:i.$styles},n=await s.getOrExecute(e);return z(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,i,t)}:n}catch(e){let t=D(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Ua(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):g(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){cs.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=po(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return cs.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`)})}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[Xi]===`manual`?(cs.error(`View ${e.id} already has manual layout, this should not happen`),e):ta(e,r):na(e,r):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;#r;constructor(e){this.#e=cs.getChild(e.projectId),this.#t=e.projectId,this.#n=e.storage,this.#r=e.layouter}async get(e){let t=cacheKey(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);y.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,n);y.trace`cache miss for ${e.view.id}`;let r=dr(),i=await this.#r(e);return y.trace(`layouted {view} in ${r.pretty}`,{view:e.view.id}),await this.#n.set(t,i),this.resetViewError(e.view),i}remember=(e,t)=>{let n=cacheKey(e);return t&&(this.#n.set(n,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let n=`error-${e.id}`;this.#n.has(n).then(e=>{e||(this.#n.set(n,`true`),t())})}resetViewError(e){this.#n.del(`error-${e.id}`)}};function cacheKey(e){return`${e.view.hash}-${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:ea(e,t.diagram)}}const ls={graphviz(){return new uo}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider$1(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new Ci(e,C.Validated),IndexManager:e=>new nn(e),LangiumDocuments:e=>new gr(e),ProjectsManager:e=>new Nn(e),WorkspaceManager:e=>new Gt(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new fo({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},workspace:{AstNodeDescriptionProvider:bind(dn)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices(e={},r,i,a){let o=createSharedServices(e),s=wi([co({shared:o}),fe,createLikeC4Module({...zr,...n,...t,...ls,...e}),r,i,a].reduce(_merge,{}));return o.ServiceRegistry.register(s),registerValidationChecks(s),e.connection?Li(()=>s.Rpc.init()):o.workspace.ConfigurationProvider.initialized({}),{shared:o,likec4:s}}function createSharedServices(e={}){let r={...zr,...n,...t,...e};return wi(lo(r),we,createLikeC4SharedModule(r))}function _merge(e,t){if(t)for(let[n,r]of Object.entries(t)){if(n===`__proto__`||n===`constructor`||n===`prototype`||r===void 0)continue;let t=Object.hasOwn(e,n),i=e[n];t&&i!==null&&r!==null&&typeof i==`object`&&typeof r==`object`?e[n]=_merge(i,r):e[n]=r}return e}export{ls as a,WithGraphviz as i,createLikeC4Module as n,createSharedServices as r,createLanguageServices as t};
|
package/dist/_chunks/noop.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{t as e}from"./icons.mjs";import{isLikeC4Builtin as t}from"../likec4lib.mjs";var NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(n){if(t(n))return Promise.resolve(e);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},NoopFileSystemWatcher=class{watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{handleFileSystemUpdate(){return Promise.resolve()}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}};const n={fileSystemWatcher:()=>new NoopFileSystemWatcher},r={fileSystemProvider:()=>new NoopFileSystemProvider,...n},i={manualLayouts:()=>new NoopLikeC4ManualLayouts};export{n,i as r,r as t};
|